From d2525a34b6011c2fdca9c926e38399b965d67553 Mon Sep 17 00:00:00 2001 From: kichik Date: Sat, 11 Mar 2006 18:13:05 +0000 Subject: [PATCH] made GetExports work on big-endian platforms as well git-svn-id: https://svn.code.sf.net/p/nsis/code/NSIS/trunk@4577 212acab6-be3b-0410-9dea-997c60f758d6 --- Source/Plugins.cpp | 29 ++++++++++++++++++++--------- 1 file changed, 20 insertions(+), 9 deletions(-) diff --git a/Source/Plugins.cpp b/Source/Plugins.cpp index 15ebb2c8..1aecfeee 100644 --- a/Source/Plugins.cpp +++ b/Source/Plugins.cpp @@ -93,27 +93,38 @@ void Plugins::GetExports(const string &pathToDll, bool displayInfo) const string dllName = remove_file_extension(get_file_name(pathToDll)); - PIMAGE_NT_HEADERS NTHeaders = PIMAGE_NT_HEADERS(&dlldata[0] + PIMAGE_DOS_HEADER(&dlldata[0])->e_lfanew); + LONG lfanew = FIX_ENDIAN_INT32(PIMAGE_DOS_HEADER(&dlldata[0])->e_lfanew); + PIMAGE_NT_HEADERS NTHeaders = PIMAGE_NT_HEADERS(&dlldata[0] + lfanew); if (NTHeaders->Signature == IMAGE_NT_SIGNATURE) { + FIX_ENDIAN_INT16_INPLACE(NTHeaders->FileHeader.Characteristics); if (NTHeaders->FileHeader.Characteristics & IMAGE_FILE_DLL) { + FIX_ENDIAN_INT32_INPLACE(NTHeaders->OptionalHeader.NumberOfRvaAndSizes); if (NTHeaders->OptionalHeader.NumberOfRvaAndSizes <= IMAGE_DIRECTORY_ENTRY_EXPORT) return; DWORD ExportDirVA = NTHeaders->OptionalHeader.DataDirectory[IMAGE_DIRECTORY_ENTRY_EXPORT].VirtualAddress; DWORD ExportDirSize = NTHeaders->OptionalHeader.DataDirectory[IMAGE_DIRECTORY_ENTRY_EXPORT].Size; PIMAGE_SECTION_HEADER sections = IMAGE_FIRST_SECTION(NTHeaders); - for (int i = 0; i < NTHeaders->FileHeader.NumberOfSections; i++) + FIX_ENDIAN_INT32_INPLACE(ExportDirVA); + FIX_ENDIAN_INT32_INPLACE(ExportDirSize); + + WORD num_sections = FIX_ENDIAN_INT16(NTHeaders->FileHeader.NumberOfSections); + + for (DWORD i = 0; i < num_sections; i++) + { + DWORD va = FIX_ENDIAN_INT32(sections[i].VirtualAddress); + if (va <= ExportDirVA + && va + FIX_ENDIAN_INT32(sections[i].Misc.VirtualSize) >= ExportDirVA + ExportDirSize) { - if (sections[i].VirtualAddress <= ExportDirVA - && sections[i].VirtualAddress+sections[i].Misc.VirtualSize >= ExportDirVA+ExportDirSize) + DWORD prd = FIX_ENDIAN_INT32(sections[i].PointerToRawData); + PIMAGE_EXPORT_DIRECTORY exports = PIMAGE_EXPORT_DIRECTORY(&dlldata[0] + prd + ExportDirVA - va); + DWORD na = FIX_ENDIAN_INT32(exports->AddressOfNames); + unsigned long *names = (unsigned long*)((unsigned long) exports + (char *) na - ExportDirVA); + for (unsigned long j = 0; j < FIX_ENDIAN_INT32(exports->NumberOfNames); j++) { - PIMAGE_EXPORT_DIRECTORY exports = PIMAGE_EXPORT_DIRECTORY(&dlldata[0] + sections[i].PointerToRawData + ExportDirVA - sections[i].VirtualAddress); - unsigned long *names = (unsigned long*)((unsigned long)exports + (char *)exports->AddressOfNames - ExportDirVA); - for (unsigned long j = 0; j < exports->NumberOfNames; j++) - { - const string name = string((char*)exports + names[j] - ExportDirVA); + const string name = string((char*)exports + FIX_ENDIAN_INT32(names[j]) - ExportDirVA); const string signature = dllName + "::" + name; const string lcsig = lowercase(signature); m_command_to_path[lcsig] = pathToDll;