Win32-Ldd

 view release on metacpan or  search on metacpan

libntldd.c  view on Meta::CPAN

        }
        else
        {
          ith = (void *) idd[i].ImportAddressTableRVA;
          oith = (void *) idd[i].ImportNameTableRVA;
        }
        for (j = 0; (impaddress = thunk_data_u1_function (ith, j, cfg)) != 0; j++)
        {
          struct ImportTableItem *imp = AddImport (self);
          imp->dll = dll;
          imp->ordinal = -1;
          if (oith)
            imp->orig_address = thunk_data_u1_function (oith, j, cfg);
          if (cfg->on_self)
          {
            imp->address = impaddress;
          }
          if (oith && imp->orig_address & (1 << (sizeof (DWORD) * 8 - 1)))
          {
            imp->ordinal = imp->orig_address & ~(1 << (sizeof (DWORD) * 8 - 1));
          }
          else if (oith)
          {
            IMAGE_IMPORT_BY_NAME *byname = (IMAGE_IMPORT_BY_NAME *) MapPointer (soffs, soffs_len, imp->orig_address, NULL);
            if (byname != NULL)
              imp->name = strdup ((char *) byname->Name);
          }
        }
      }
  }

  idata = opt_header_get_dd_entry (opt_header, IMAGE_DIRECTORY_ENTRY_IMPORT, cfg);
  if (idata->Size > 0 && idata->VirtualAddress != 0)
  {
    iid = (IMAGE_IMPORT_DESCRIPTOR *) MapPointer (soffs, soffs_len,
        idata->VirtualAddress, NULL);
    if (iid)
      for (i = 0; iid[i].Characteristics || iid[i].TimeDateStamp ||
          iid[i].ForwarderChain || iid[i].Name || iid[i].FirstThunk; i++)
        ProcessDep (cfg, soffs, soffs_len, iid[i].Name, root, self, 1);
  }

  idata = opt_header_get_dd_entry (opt_header, IMAGE_DIRECTORY_ENTRY_DELAY_IMPORT, cfg);
  if (idata->Size > 0 && idata->VirtualAddress != 0)
  {
    idd = (IMAGE_DELAYLOAD_DESCRIPTOR *) MapPointer (soffs, soffs_len, idata->VirtualAddress, NULL);
    if (idd)
      for (i = 0; idd[i].Attributes.AllAttributes || idd[i].DllNameRVA ||
          idd[i].ModuleHandleRVA || idd[i].ImportAddressTableRVA || idd[i].ImportNameTableRVA ||
          idd[i].BoundImportAddressTableRVA || idd[i].UnloadInformationTableRVA ||
          idd[i].TimeDateStamp; i++)
        ProcessDep (cfg, soffs, soffs_len, idd[i].DllNameRVA, root, self, 1);
  }
}

BOOL TryMapAndLoad (PCSTR name, PCSTR path, PLOADED_IMAGE loadedImage, int requiredMachineType)
{
    BOOL success = MapAndLoad (name, path, loadedImage, FALSE, TRUE);
    if (!success && GetLastError () == ERROR_FILE_NOT_FOUND)
        success = MapAndLoad (name, path, loadedImage, TRUE, TRUE);
    if (success && requiredMachineType != -1 && (int)loadedImage->FileHeader->FileHeader.Machine != requiredMachineType)
    {
        UnMapAndLoad (loadedImage);
        return FALSE;
    }
    return success;
}

int BuildDepTree (BuildTreeConfig* cfg, char *name, struct DepTreeElement *root, struct DepTreeElement *self)
{
  LOADED_IMAGE loaded_image;
  LOADED_IMAGE *img;
  IMAGE_DOS_HEADER *dos;
  HMODULE hmod;
  BOOL success;

  DWORD i, j;
  int soffs_len;
  soff_entry *soffs;

  if (self->flags & DEPTREE_PROCESSED)
  {
    return 0;
  }

  if (cfg->on_self)
  {
    char modpath[MAX_PATH];
    success = GetModuleHandleExA (GET_MODULE_HANDLE_EX_FLAG_UNCHANGED_REFCOUNT, name, &hmod);
    if (!success)
      return 1;
    if (GetModuleFileNameA (hmod, modpath, MAX_PATH) == 0)
      return 1;
    if (self->resolved_module == NULL)
      self->resolved_module = strdup (modpath);

    dos = (IMAGE_DOS_HEADER *) hmod;
    loaded_image.FileHeader = (IMAGE_NT_HEADERS *) ((char *) hmod + dos->e_lfanew);
    loaded_image.Sections = (IMAGE_SECTION_HEADER *) ((char *) hmod + dos->e_lfanew + sizeof (IMAGE_NT_HEADERS));
    loaded_image.NumberOfSections = loaded_image.FileHeader->FileHeader.NumberOfSections;
    loaded_image.MappedAddress = (void *) hmod;
    if (cfg->machineType != -1 && (int)loaded_image.FileHeader->FileHeader.Machine != cfg->machineType)
        return 1;
  }
  else
  {
    success = FALSE;
    for (i = 0; i < cfg->searchPaths->count && !success; ++i)
    {
      success = TryMapAndLoad (name, cfg->searchPaths->path[i], &loaded_image, cfg->machineType);
    }
    if (!success)
        success = TryMapAndLoad (name, NULL, &loaded_image, cfg->machineType);
    if (!success)
    {
      self->flags |= DEPTREE_UNRESOLVED;
      return 1;
    }
    if (self->resolved_module == NULL)
      self->resolved_module = strdup (loaded_image.ModuleName);
  }



( run in 1.631 second using v1.01-cache-2.11-cpan-39bf76dae61 )