Win32-Ldd
view release on metacpan or search on metacpan
}
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 )