From 0115fdb6f4f148346769f3c84439271bedd9ed0e Mon Sep 17 00:00:00 2001 From: Alexandre Julliard Date: Mon, 22 Dec 2008 15:51:25 +0100 Subject: [PATCH] winedevice: Make sure that all dependencies of the driver are relocated too. --- programs/winedevice/device.c | 24 +++++++++++++++++++++--- 1 file changed, 21 insertions(+), 3 deletions(-) diff --git a/programs/winedevice/device.c b/programs/winedevice/device.c index 5677e197b89..bd6565465c2 100644 --- a/programs/winedevice/device.c +++ b/programs/winedevice/device.c @@ -64,9 +64,11 @@ static LDR_MODULE *find_ldr_module( HMODULE module ) /* load the driver module file */ static HMODULE load_driver_module( const WCHAR *name ) { - const IMAGE_NT_HEADERS *nt; + IMAGE_NT_HEADERS *nt; + const IMAGE_IMPORT_DESCRIPTOR *imports; size_t page_size = getpagesize(); - int delta; + int i, delta; + ULONG size; HMODULE module = LoadLibraryW( name ); if (!module) return NULL; @@ -80,7 +82,6 @@ static HMODULE load_driver_module( const WCHAR *name ) if (nt->OptionalHeader.SectionAlignment < page_size || !(nt->FileHeader.Characteristics & IMAGE_FILE_DLL)) { - ULONG size; DWORD old; IMAGE_BASE_RELOCATION *rel, *end; @@ -98,8 +99,25 @@ static HMODULE load_driver_module( const WCHAR *name ) if (old != PAGE_EXECUTE_READWRITE) VirtualProtect( page, page_size, old, NULL ); if (!rel) goto error; } + /* make sure we don't try again */ + nt->OptionalHeader.DataDirectory[IMAGE_DIRECTORY_ENTRY_BASERELOC].VirtualAddress = 0; } } + + /* make sure imports are relocated too */ + + if ((imports = RtlImageDirectoryEntryToData( module, TRUE, IMAGE_DIRECTORY_ENTRY_IMPORT, &size ))) + { + for (i = 0; imports[i].Name && imports[i].FirstThunk; i++) + { + char *name = (char *)module + imports[i].Name; + WCHAR buffer[32], *p = buffer; + + while (p < buffer + 32) if (!(*p++ = *name++)) break; + if (p <= buffer + 32) FreeLibrary( load_driver_module( buffer ) ); + } + } + return module; error: