* hookapi.cc (find_first_notloaded_dll): Extend comment. Fix usage of
mapped memory. Shorten static library name buffer to MAX_PATH. Use strlcpy to copy library name to buffer. Only Unmap "map" if it has been Mapped before. * pinfo.cc (status_exit): Drop unneeded declaration of find_first_notloaded_dll in favor of the declaration in winsup.h.
This commit is contained in:
parent
52174bb4cc
commit
0b592aeef2
|
@ -1,3 +1,12 @@
|
|||
2012-05-30 Corinna Vinschen <corinna@vinschen.de>
|
||||
|
||||
* hookapi.cc (find_first_notloaded_dll): Extend comment. Fix usage of
|
||||
mapped memory. Shorten static library name buffer to MAX_PATH. Use
|
||||
strlcpy to copy library name to buffer. Only Unmap "map" if it has been
|
||||
Mapped before.
|
||||
* pinfo.cc (status_exit): Drop unneeded declaration of
|
||||
find_first_notloaded_dll in favor of the declaration in winsup.h.
|
||||
|
||||
2012-05-30 Corinna Vinschen <corinna@vinschen.de>
|
||||
|
||||
* thread.cc: Remove temporary newlib workaround, now that newlib
|
||||
|
|
|
@ -165,7 +165,8 @@ makename (const char *name, char *&buf, int& i, int inc)
|
|||
/* Find first missing dll in a given executable.
|
||||
FIXME: This is not foolproof since it doesn't look for dlls in the
|
||||
same directory as the given executable, like Windows. Instead it
|
||||
searches for dlls in the context of the current executable. */
|
||||
searches for dlls in the context of the current executable.
|
||||
It also only finds direct dependencies, not indirect ones. */
|
||||
const char *
|
||||
find_first_notloaded_dll (path_conv& pc)
|
||||
{
|
||||
|
@ -226,31 +227,36 @@ find_first_notloaded_dll (path_conv& pc)
|
|||
importRVA -= delta;
|
||||
|
||||
DWORD offset = 0;
|
||||
char *map = NULL;
|
||||
HMODULE map = NULL;
|
||||
if (importRVA + importRVAMaxSize > wincap.allocation_granularity ())
|
||||
{
|
||||
offset = rounddown (importRVA, wincap.allocation_granularity ());
|
||||
DWORD size = importRVA - offset + importRVAMaxSize;
|
||||
map = (char *) MapViewOfFile (hc, FILE_MAP_READ, 0, offset, size);
|
||||
map = (HMODULE) MapViewOfFile (hc, FILE_MAP_READ, 0,
|
||||
offset, size);
|
||||
if (!map)
|
||||
goto out;
|
||||
}
|
||||
|
||||
// Convert imports RVA to a usable pointer
|
||||
PIMAGE_IMPORT_DESCRIPTOR pdfirst;
|
||||
pdfirst = rva (PIMAGE_IMPORT_DESCRIPTOR, hm, importRVA - offset);
|
||||
pdfirst = rva (PIMAGE_IMPORT_DESCRIPTOR, map ?: hm,
|
||||
importRVA - offset);
|
||||
|
||||
// Iterate through each import descriptor, and redirect if appropriate
|
||||
for (PIMAGE_IMPORT_DESCRIPTOR pd = pdfirst; pd->FirstThunk; pd++)
|
||||
{
|
||||
const char *lib = rva (PSTR, hm, pd->Name - delta - offset);
|
||||
const char *lib = rva (PSTR, map ?: hm,
|
||||
pd->Name - delta - offset);
|
||||
if (!LoadLibraryEx (lib, NULL, DONT_RESOLVE_DLL_REFERENCES
|
||||
| LOAD_LIBRARY_AS_DATAFILE))
|
||||
{
|
||||
static char buf[NT_MAX_PATH];
|
||||
res = strcpy (buf, lib);
|
||||
static char buf[MAX_PATH];
|
||||
strlcpy (buf, lib, MAX_PATH);
|
||||
res = buf;
|
||||
}
|
||||
}
|
||||
if (map)
|
||||
UnmapViewOfFile (map);
|
||||
}
|
||||
}
|
||||
|
|
|
@ -114,7 +114,6 @@ pinfo_init (char **envp, int envc)
|
|||
static DWORD
|
||||
status_exit (DWORD x)
|
||||
{
|
||||
const char *find_first_notloaded_dll (path_conv &);
|
||||
switch (x)
|
||||
{
|
||||
case STATUS_DLL_NOT_FOUND:
|
||||
|
|
Loading…
Reference in New Issue