diff --git a/engine/platform/win32/lib_win.c b/engine/platform/win32/lib_win.c index 371d3ca3..9df8b182 100644 --- a/engine/platform/win32/lib_win.c +++ b/engine/platform/win32/lib_win.c @@ -673,6 +673,22 @@ library_error: return NULL; } +static DWORD GetOffsetByRVA( DWORD rva, PIMAGE_NT_HEADERS nt_header ) +{ + int i = 0; + PIMAGE_SECTION_HEADER sect_header = IMAGE_FIRST_SECTION( nt_header ); + + if (!rva) + return rva; + + for( i = 0; i < nt_header->FileHeader.NumberOfSections; i++, sect_header++) + { + if( rva >= sect_header->VirtualAddress && rva < sect_header->VirtualAddress + sect_header->Misc.VirtualSize ) + break; + } + return (rva - sect_header->VirtualAddress + sect_header->PointerToRawData); +} + /* --------------------------------------------------------------- @@ -958,12 +974,12 @@ table_error: qboolean COM_CheckLibraryDirectDependency( const char *name, const char *depname, qboolean directpath ) { - PIMAGE_DOS_HEADER dos_header; - PIMAGE_NT_HEADERS old_header; - PIMAGE_DATA_DIRECTORY directory; + PIMAGE_DOS_HEADER dosHeader; + PIMAGE_NT_HEADERS peHeader; + PIMAGE_DATA_DIRECTORY importDir; PIMAGE_IMPORT_DESCRIPTOR importDesc; string errorstring = ""; - void *data = NULL; + byte *data = NULL; dll_user_t *hInst; hInst = FS_FindLibrary( name, directpath ); @@ -979,33 +995,31 @@ qboolean COM_CheckLibraryDirectDependency( const char *name, const char *depname goto libraryerror; } - dos_header = ( PIMAGE_DOS_HEADER )data; - if( dos_header->e_magic != IMAGE_DOS_SIGNATURE ) + dosHeader = ( PIMAGE_DOS_HEADER )data; + if( dosHeader->e_magic != IMAGE_DOS_SIGNATURE ) { Q_snprintf( errorstring, sizeof( errorstring ), "%s it's not a valid executable file", name ); goto libraryerror; } - old_header = ( PIMAGE_NT_HEADERS )&( ( const byte * )( data ) )[dos_header->e_lfanew]; - if( old_header->Signature != IMAGE_NT_SIGNATURE ) + peHeader = ( PIMAGE_NT_HEADERS )(data + dosHeader->e_lfanew); + if( peHeader->Signature != IMAGE_NT_SIGNATURE ) { Q_snprintf( errorstring, sizeof( errorstring ), "%s missing PE header", name ); goto libraryerror; } - directory = &old_header->OptionalHeader.DataDirectory[IMAGE_DIRECTORY_ENTRY_IMPORT]; - - if( directory->Size <= 0 ) + importDir = &peHeader->OptionalHeader.DataDirectory[IMAGE_DIRECTORY_ENTRY_IMPORT]; + if( importDir->Size <= 0 ) { - Q_snprintf( errorstring, sizeof( errorstring ), "%s has no dependencies. Is this dll valid?\n", name ); + Q_snprintf( errorstring, sizeof( errorstring ), "%s has no dependencies. Is this library valid?\n", name ); goto libraryerror; } - importDesc = (PIMAGE_IMPORT_DESCRIPTOR)CALCULATE_ADDRESS( data, directory->VirtualAddress ); - + importDesc = (PIMAGE_IMPORT_DESCRIPTOR)CALCULATE_ADDRESS( data, GetOffsetByRVA(importDir->VirtualAddress, peHeader) ); for( ; !IsBadReadPtr( importDesc, sizeof( IMAGE_IMPORT_DESCRIPTOR)) && importDesc->Name; importDesc++ ) { - const char *importName = ( const char* )CALCULATE_ADDRESS( data, importDesc->Name ); + const char *importName = (const char *)CALCULATE_ADDRESS( data, GetOffsetByRVA( importDesc->Name, peHeader ) ); Con_Reportf( "library %s has direct dependency %s\n", name, importName ); if( !Q_stricmp( importName, depname ) )