On Jul 7 08:50, Charles Wilson wrote: > On 7/7/2011 6:54 AM, Corinna Vinschen wrote: > > On Jul 7 10:26, Corinna Vinschen wrote: > >> On Jul 6 15:35, Charles Wilson wrote: > >>> OK by me. In fact, we'd probably want to avoid using imagehelper for > >>> 32bit, but ReBaseImage64 for 64bit; it would make sense to drop > >>> imagehelper entirely and use ReBaseImage[64] throughout, right? > >> > >> I think we should either use imagehelper, or the Windows imagehlp lib, > >> not both. Whether it's easier to use the Windows lib or to improve > >> imagehelper is something we have to see. > > > > FYI, I have converted imagehelper to 64 bit. At least it compiles > > without error, so it kind of works. As for testing... > > Nice. You could test on the DLLs under > /usr/x86_64-w64-mingw32/sys-root/mingw/bin/ (there are only six of them, > but that should be enough for proof of concept).
It was so surprisingly easy to convert imagehelper to 64 bit that I'm concerned I forgot something. However, my tests indicate that it really works as advertised. Below's the patch to imagehelper to allow to handle 32 and 64 bit images. While I was at it, I also made the code 64 bit clean and fixed a bug in the MultiByteToWideChar code (CP_OEMCP, not CP_OEM). It builds and works fine under 32 bit Cygwin and 64 bit Mingw. Corinna Allow to work with 64 bit images and make code 64 bit clean. * getimageinfos.cc (GetImageInfos64); New function, take over functionality from GetImageInfos and handle 32 and 64 bit images. (GetImageInfos): Just call GetImageInfos64. * imagehelper.h (ReBaseImage64): Declare. (GetImageInfos64): Declare. * objectfile.cc (Win32Path): Fix codepage to CP_OEMCP. (ObjectFile::ObjectFile): Set new is64bit_img flag. Set ImageBase according to address size of platform. (LinkedObjectFile::LinkedObjectFile): Handle 64 bit images. (LinkedObjectFile::rebind): Ditto. Use uintptr_t rather than uint. (LinkedObjectFile::unbind): Ditto. * objectfile.h (ObjectFile::getNTHeader): Remove. (ObjectFile::getNTHeader64): New method. (ObjectFile::getNTHeader32): New method. (ObjectFile::is64bit): New method. (ObjectFile::is32bit): New method. (ObjectFile::ImageBase): Convert to ULONG64. (ObjectFile::ntheader): Change type to PIMAGE_NT_HEADERS32 and make private. (ObjectFile::is64bit_img): New private BOOL member. * rebase_main.cc: Convert all base variables to ULONG64 and call ReBaseImage64. * rebaseimage.cc (ReBaseImage64): New function, take over functionality from ReBaseImage and handle 32 and 64 bit images. (ReBaseImage): Just call ReBaseImage64. * rebind_main.cc (main): Drop unused variables. * sections.cc (Section::Section): Use uintptr_t rather than uint. (Section::isIn): Handle 64 bit images. (Relocations::check): Use uintptr_t rather than uint. (Relocations::relocate): Ditto. * sections.h (SectionList::FileBase): Convert to uintptr_t. Index: getimageinfos.cc =================================================================== RCS file: /sourceware/projects/cygwin-apps-home/cvsfiles/rebase/imagehelper/getimageinfos.cc,v retrieving revision 1.3 diff -u -p -r1.3 getimageinfos.cc --- getimageinfos.cc 21 Jun 2011 09:35:21 -0000 1.3 +++ getimageinfos.cc 7 Jul 2011 19:17:37 -0000 @@ -27,7 +27,8 @@ #include "imagehelper.h" -BOOL GetImageInfos(LPCSTR filename, ULONG *ImageBase, ULONG *ImageSize) +BOOL GetImageInfos64(LPCSTR filename, BOOL *is64bit, + ULONG64 *ImageBase, ULONG *ImageSize) { LinkedObjectFile dll(filename); @@ -39,8 +40,20 @@ BOOL GetImageInfos(LPCSTR filename, ULON return false; } - *ImageBase = dll.getNTHeader()->OptionalHeader.ImageBase; - *ImageSize = dll.getNTHeader()->OptionalHeader.SizeOfImage; + if (dll.is64bit ()) + { + if (is64bit) + *is64bit = TRUE; + *ImageBase = dll.getNTHeader64 ()->OptionalHeader.ImageBase; + *ImageSize = dll.getNTHeader64 ()->OptionalHeader.SizeOfImage; + } + else + { + if (is64bit) + *is64bit = FALSE; + *ImageBase = dll.getNTHeader32 ()->OptionalHeader.ImageBase; + *ImageSize = dll.getNTHeader32 ()->OptionalHeader.SizeOfImage; + } if (Base::debug) std::cerr << "ImageBase: 0x" << std::hex << *ImageBase << " ImageSize: 0x" << std::hex << *ImageSize << std::endl; @@ -49,3 +62,10 @@ BOOL GetImageInfos(LPCSTR filename, ULON return true; } +BOOL GetImageInfos(LPCSTR filename, ULONG *ImageBase, ULONG *ImageSize) +{ + ULONG64 base; + BOOL ret = GetImageInfos64 (filename, NULL, &base, ImageSize); + *ImageBase = (ULONG) base; + return ret; +} Index: imagehelper.h =================================================================== RCS file: /sourceware/projects/cygwin-apps-home/cvsfiles/rebase/imagehelper/imagehelper.h,v retrieving revision 1.3 diff -u -p -r1.3 imagehelper.h --- imagehelper.h 21 Jun 2011 09:35:21 -0000 1.3 +++ imagehelper.h 7 Jul 2011 19:17:37 -0000 @@ -27,6 +27,20 @@ extern "C" { #endif +BOOL ReBaseImage64( + LPCSTR CurrentImageName, + LPCSTR SymbolPath, // ignored + BOOL fReBase, + BOOL fRebaseSysfileOk, // ignored + BOOL fGoingDown, + ULONG CheckImageSize, // ignored + ULONG *OldImageSize, + ULONG64 *OldImageBase, + ULONG *NewImageSize, + ULONG64 *NewImageBase, + ULONG TimeStamp +); + BOOL ReBaseImage( LPCSTR CurrentImageName, LPCSTR SymbolPath, // ignored @@ -64,7 +78,7 @@ typedef enum _IMAGEHLP_STATUS_REASON { BindSymbolsNotUpdated } IMAGEHLP_STATUS_REASON; -typedef BOOL(STDCALL*PIMAGEHLP_STATUS_ROUTINE)(IMAGEHLP_STATUS_REASON,LPSTR,LPSTR,ULONG,ULONG); +typedef BOOL(__stdcall *PIMAGEHLP_STATUS_ROUTINE)(IMAGEHLP_STATUS_REASON,LPSTR,LPSTR,ULONG,ULONG); BOOL BindImageEx( DWORD Flags, @@ -75,6 +89,13 @@ BOOL BindImageEx( StatusRoutine ); +BOOL GetImageInfos64( + LPCSTR ImageName, + BOOL *is64bit, + ULONG64 *ImageBase, + ULONG *ImageSize +); + BOOL GetImageInfos( LPCSTR ImageName, ULONG *ImageBase, Index: objectfile.cc =================================================================== RCS file: /sourceware/projects/cygwin-apps-home/cvsfiles/rebase/imagehelper/objectfile.cc,v retrieving revision 1.4 diff -u -p -r1.4 objectfile.cc --- objectfile.cc 21 Jun 2011 15:33:15 -0000 1.4 +++ objectfile.cc 7 Jul 2011 19:17:37 -0000 @@ -40,12 +40,12 @@ Win32Path(const char *s) if (!s || *s == '\0') return L""; #if !defined (__CYGWIN__) - MultiByteToWideChar (CP_OEM, 0, s, -1, w32_pbuf, 32768); + MultiByteToWideChar (CP_OEMCP, 0, s, -1, w32_pbuf, 32768); #elif defined(__MSYS__) { char buf[MAX_PATH]; cygwin_conv_to_win32_path(s, buf); - MultiByteToWideChar (CP_OEM, 0, buf, -1, w32_pbuf, 32768); + MultiByteToWideChar (CP_OEMCP, 0, buf, -1, w32_pbuf, 32768); } #else cygwin_conv_path (CCP_POSIX_TO_WIN_W, s, w32_pbuf, 32768 * sizeof (WCHAR)); @@ -123,7 +123,7 @@ ObjectFile::ObjectFile(const char *aFile // create shortcuts PIMAGE_DOS_HEADER dosheader = (PIMAGE_DOS_HEADER)lpFileBase; - ntheader = (PIMAGE_NT_HEADERS) ((char *)dosheader + dosheader->e_lfanew); + ntheader = (PIMAGE_NT_HEADERS32) ((char *)dosheader + dosheader->e_lfanew); if (ntheader->Signature != 0x00004550) { @@ -131,9 +131,13 @@ ObjectFile::ObjectFile(const char *aFile return; } + is64bit_img = ntheader->OptionalHeader.Magic == IMAGE_NT_OPTIONAL_HDR64_MAGIC; + sections = new SectionList(lpFileBase); - ImageBase = ntheader->OptionalHeader.ImageBase; + ImageBase = is64bit_img + ? getNTHeader64 ()->OptionalHeader.ImageBase + : getNTHeader32 ()->OptionalHeader.ImageBase; Error = 0; } @@ -175,18 +179,35 @@ LinkedObjectFile::LinkedObjectFile(const << std::hex << ImageBase << std::dec << std::endl; } + PIMAGE_NT_HEADERS32 ntheader32 = getNTHeader32 (); + PIMAGE_NT_HEADERS64 ntheader64 = getNTHeader64 (); + Section *edata = sections->find(".edata"); if (edata) exports = new Exports(*edata); else - exports = new Exports(*sections,(DataDirectory *)&ntheader->OptionalHeader.DataDirectory[IMAGE_DIRECTORY_ENTRY_EXPORT]); + { + DataDirectory *dir; + if (is64bit ()) + dir = (DataDirectory *) &ntheader64->OptionalHeader.DataDirectory[IMAGE_DIRECTORY_ENTRY_EXPORT]; + else + dir = (DataDirectory *) &ntheader32->OptionalHeader.DataDirectory[IMAGE_DIRECTORY_ENTRY_EXPORT]; + exports = new Exports(*sections, dir); + } Section *idata = sections->find(".idata"); if (idata) imports = new Imports(*idata); else - imports = new Imports(*sections,(DataDirectory *)&ntheader->OptionalHeader.DataDirectory[IMAGE_DIRECTORY_ENTRY_IMPORT]); + { + DataDirectory *dir; + if (is64bit ()) + dir = (DataDirectory *)&ntheader64->OptionalHeader.DataDirectory[IMAGE_DIRECTORY_ENTRY_IMPORT]; + else + dir = (DataDirectory *)&ntheader32->OptionalHeader.DataDirectory[IMAGE_DIRECTORY_ENTRY_IMPORT]; + imports = new Imports(*sections, dir); + } @@ -282,13 +303,33 @@ bool LinkedObjectFile::rebind(ObjectFile p->TimeDateStamp = 0xffffffff; p->ForwarderChain = 0xffffffff; } - ntheader->FileHeader.TimeDateStamp = time(0); + + PIMAGE_NT_HEADERS32 ntheader32 = getNTHeader32 (); + PIMAGE_NT_HEADERS64 ntheader64 = getNTHeader64 (); + + if (is64bit ()) + ntheader64->FileHeader.TimeDateStamp = time(0); + else + ntheader32->FileHeader.TimeDateStamp = time(0); #if 1 // fill bound import section - DataDirectory *bdp = (DataDirectory *)&ntheader->OptionalHeader.DataDirectory[IMAGE_DIRECTORY_ENTRY_BOUND_IMPORT]; - SectionHeader *first_section = (SectionHeader *)(ntheader+1); - BoundImportDescriptor *bp_org = (BoundImportDescriptor *)(&first_section[ntheader->FileHeader.NumberOfSections]); + DataDirectory *bdp; + SectionHeader *first_section; + BoundImportDescriptor *bp_org; + + if (is64bit ()) + { + bdp = (DataDirectory *)&ntheader64->OptionalHeader.DataDirectory[IMAGE_DIRECTORY_ENTRY_BOUND_IMPORT]; + first_section = (SectionHeader *)(ntheader64+1); + bp_org = (BoundImportDescriptor *)(&first_section[ntheader64->FileHeader.NumberOfSections]); + } + else + { + bdp = (DataDirectory *)&ntheader32->OptionalHeader.DataDirectory[IMAGE_DIRECTORY_ENTRY_BOUND_IMPORT]; + first_section = (SectionHeader *)(ntheader32+1); + bp_org = (BoundImportDescriptor *)(&first_section[ntheader32->FileHeader.NumberOfSections]); + } BoundImportDescriptor *bp = bp_org; char *bp2 = (char *)&bp[cache.getCount() + 1]; @@ -297,7 +338,7 @@ bool LinkedObjectFile::rebind(ObjectFile while ((obj = (LinkedObjectFile *)cache.getNext()) != NULL) { bp->TimeDateStamp = time(0); - bp->OffsetModuleName = (uint)bp2 - (uint)bp_org; + bp->OffsetModuleName = (uintptr_t) bp2 - (uintptr_t) bp_org; // bp->Reserved bp->NumberOfModuleForwarderRefs = 0; bp++; @@ -313,8 +354,8 @@ bool LinkedObjectFile::rebind(ObjectFile bp->NumberOfModuleForwarderRefs = 0; // set data directory entry - bdp->VirtualAddress = (uint) bp_org - (uint)lpFileBase; - bdp->Size = (uint) bp2 - (uint) bp_org; + bdp->VirtualAddress = (uintptr_t) bp_org - (uintptr_t) lpFileBase; + bdp->Size = (uintptr_t) bp2 - (uintptr_t) bp_org; #endif return true; } @@ -392,10 +433,18 @@ bool LinkedObjectFile::unbind(void) p->TimeDateStamp = 0; p->ForwarderChain = 0; } - ntheader->FileHeader.TimeDateStamp = time(0); + if (is64bit ()) + getNTHeader64 ()->FileHeader.TimeDateStamp = time(0); + else + getNTHeader32 ()->FileHeader.TimeDateStamp = time(0); // fill bound import section - DataDirectory *bdp = (DataDirectory *)&ntheader->OptionalHeader.DataDirectory[IMAGE_DIRECTORY_ENTRY_BOUND_IMPORT]; + DataDirectory *bdp; + + if (is64bit ()) + bdp = (DataDirectory *) &getNTHeader64 ()->OptionalHeader.DataDirectory[IMAGE_DIRECTORY_ENTRY_BOUND_IMPORT]; + else + bdp = (DataDirectory *) &getNTHeader32 ()->OptionalHeader.DataDirectory[IMAGE_DIRECTORY_ENTRY_BOUND_IMPORT]; // set data directory entry bdp->VirtualAddress = 0; Index: objectfile.h =================================================================== RCS file: /sourceware/projects/cygwin-apps-home/cvsfiles/rebase/imagehelper/objectfile.h,v retrieving revision 1.3 diff -u -p -r1.3 objectfile.h --- objectfile.h 21 Jun 2011 09:35:21 -0000 1.3 +++ objectfile.h 7 Jul 2011 19:17:37 -0000 @@ -35,7 +35,12 @@ class ObjectFile : public Base return FileName; } - PIMAGE_NT_HEADERS getNTHeader(void) + PIMAGE_NT_HEADERS64 getNTHeader64 (void) + { + return (PIMAGE_NT_HEADERS64) ntheader; + } + + PIMAGE_NT_HEADERS32 getNTHeader32 (void) { return ntheader; } @@ -45,6 +50,16 @@ class ObjectFile : public Base return Error == 0; } + bool is64bit(void) + { + return is64bit_img; + } + + bool is32bit(void) + { + return !is64bit_img; + } + int getError(void) { return Error; @@ -63,11 +78,14 @@ class ObjectFile : public Base HANDLE hfile; HANDLE hfilemapping; LPVOID lpFileBase; - PIMAGE_NT_HEADERS ntheader; SectionList *sections; - uint ImageBase; + ULONG64 ImageBase; int Error; bool isWritable; + + private: + PIMAGE_NT_HEADERS32 ntheader; + bool is64bit_img; }; class ObjectFileList; Index: rebase_main.cc =================================================================== RCS file: /sourceware/projects/cygwin-apps-home/cvsfiles/rebase/imagehelper/rebase_main.cc,v retrieving revision 1.2 diff -u -p -r1.2 rebase_main.cc --- rebase_main.cc 20 Jun 2011 23:26:26 -0000 1.2 +++ rebase_main.cc 7 Jul 2011 19:17:37 -0000 @@ -44,7 +44,7 @@ void ParseArgs(int argc, char* argv[]); unsigned long StringToUlong(const string& aString); void Usage(); -ULONG theImageBase = 0; +ULONG64 theImageBase = 0; BOOL theDownFlag = FALSE; bool theDebugFlag = false; BOOL theCheckFlag = FALSE; @@ -58,15 +58,16 @@ int main(int argc, char* argv[]) { ParseArgs(argc, argv); - ULONG aNewImageBase = theImageBase; + ULONG64 aNewImageBase = theImageBase; for (int i = theArgsIndex; i < argc; i++) { string aFile = PosixToWin32(argv[i]); if (theListFlag) { - ULONG ImageBase, ImageSize; - GetImageInfos(const_cast<LPSTR>(aFile.c_str()),&ImageBase,&ImageSize); + ULONG64 ImageBase; + ULONG ImageSize; + GetImageInfos64(const_cast<LPSTR>(aFile.c_str()),&ImageBase,&ImageSize); cout << aFile << ": " << "ImageBase: 0x" << hex << ImageBase << " ImageSize: 0x" << hex << ImageSize << endl; } else if (theCheckFlag) @@ -82,20 +83,20 @@ main(int argc, char* argv[]) if (theDownFlag) aNewImageBase -= theOffset; - ULONG anOldImageSize, anOldImageBase, aNewImageSize; - ULONG aPrevNewImageBase = aNewImageBase; - BOOL aStatus = ReBaseImage( - const_cast<char*>(aFile.c_str()), // CurrentImageName - 0, // SymbolPath - TRUE, // fReBase - FALSE, // fRebaseSysfileOk - theDownFlag, // fGoingDown - 0, // CheckImageSize - &anOldImageSize, // OldImageSize - &anOldImageBase, // OldImageBase - &aNewImageSize, // NewImageSize - &aNewImageBase, // NewImageBase - time(0)); // TimeStamp + ULONG anOldImageSize, aNewImageSize; + ULONG64 anOldImageBase; + ULONG64 aPrevNewImageBase = aNewImageBase; + ReBaseImage64(const_cast<char*>(aFile.c_str()), // CurrentImageName + 0, // SymbolPath + TRUE, // fReBase + FALSE, // fRebaseSysfileOk + theDownFlag, // fGoingDown + 0, // CheckImageSize + &anOldImageSize, // OldImageSize + &anOldImageBase, // OldImageBase + &aNewImageSize, // NewImageSize + &aNewImageBase, // NewImageBase + time(0)); // TimeStamp // ReBaseImage seems to never returns false! DWORD aStatus2 = GetLastError(); Index: rebaseimage.cc =================================================================== RCS file: /sourceware/projects/cygwin-apps-home/cvsfiles/rebase/imagehelper/rebaseimage.cc,v retrieving revision 1.3 diff -u -p -r1.3 rebaseimage.cc --- rebaseimage.cc 21 Jun 2011 09:35:21 -0000 1.3 +++ rebaseimage.cc 7 Jul 2011 19:17:37 -0000 @@ -24,7 +24,7 @@ #include "objectfile.h" #include "imagehelper.h" -BOOL ReBaseImage( +BOOL ReBaseImage64 ( LPCSTR CurrentImageName, LPCSTR SymbolPath, // ignored BOOL fReBase, @@ -32,9 +32,9 @@ BOOL ReBaseImage( BOOL fGoingDown, ULONG CheckImageSize, // ignored ULONG *OldImageSize, - ULONG *OldImageBase, + ULONG64 *OldImageBase, ULONG *NewImageSize, - ULONG *NewImageBase, + ULONG64 *NewImageBase, ULONG TimeStamp ) { @@ -60,12 +60,22 @@ BOOL ReBaseImage( return false; } - PIMAGE_NT_HEADERS ntheader = dll.getNTHeader(); + PIMAGE_NT_HEADERS32 ntheader32 = dll.getNTHeader32 (); + PIMAGE_NT_HEADERS64 ntheader64 = dll.getNTHeader64 (); // set new header elements - *OldImageBase = ntheader->OptionalHeader.ImageBase; - *OldImageSize = ntheader->OptionalHeader.SizeOfImage; - *NewImageSize = ntheader->OptionalHeader.SizeOfImage; + if (dll.is64bit ()) + { + *OldImageBase = ntheader64->OptionalHeader.ImageBase; + *OldImageSize = ntheader64->OptionalHeader.SizeOfImage; + *NewImageSize = ntheader64->OptionalHeader.SizeOfImage; + } + else + { + *OldImageBase = ntheader32->OptionalHeader.ImageBase; + *OldImageSize = ntheader32->OptionalHeader.SizeOfImage; + *NewImageSize = ntheader32->OptionalHeader.SizeOfImage; + } // Round NewImageSize to be consistent with MS's rebase. const ULONG imageSizeGranularity = 0x10000; @@ -77,7 +87,8 @@ BOOL ReBaseImage( *NewImageBase -= *NewImageSize; // already rebased - if (ntheader->OptionalHeader.ImageBase == *NewImageBase) + if ((dll.is64bit () && ntheader64->OptionalHeader.ImageBase == *NewImageBase) + || (dll.is32bit () && ntheader32->OptionalHeader.ImageBase == *NewImageBase)) { if (!fGoingDown) *NewImageBase += *NewImageSize; @@ -87,8 +98,16 @@ BOOL ReBaseImage( return true; } - ntheader->OptionalHeader.ImageBase = *NewImageBase; - ntheader->FileHeader.TimeDateStamp = TimeStamp; + if (dll.is64bit ()) + { + ntheader64->OptionalHeader.ImageBase = *NewImageBase; + ntheader64->FileHeader.TimeDateStamp = TimeStamp; + } + else + { + ntheader32->OptionalHeader.ImageBase = *NewImageBase; + ntheader32->FileHeader.TimeDateStamp = TimeStamp; + } int difference = *NewImageBase - *OldImageBase; @@ -106,3 +125,28 @@ BOOL ReBaseImage( SetLastError(NO_ERROR); return true; } + +BOOL ReBaseImage ( + LPCSTR CurrentImageName, + LPCSTR SymbolPath, // ignored + BOOL fReBase, + BOOL fRebaseSysfileOk, // ignored + BOOL fGoingDown, + ULONG CheckImageSize, // ignored + ULONG *OldImageSize, + ULONG *OldImageBase, + ULONG *NewImageSize, + ULONG *NewImageBase, + ULONG TimeStamp +) +{ + ULONG64 old_base = *OldImageBase; + ULONG64 new_base = *NewImageBase; + BOOL ret = ReBaseImage64 (CurrentImageName, SymbolPath, fReBase, + fRebaseSysfileOk, fGoingDown, CheckImageSize, + OldImageSize, &old_base, NewImageSize, &new_base, + TimeStamp); + *OldImageBase = (ULONG) old_base; + *NewImageBase = (ULONG) new_base; + return ret; +} Index: rebind_main.cc =================================================================== RCS file: /sourceware/projects/cygwin-apps-home/cvsfiles/rebase/imagehelper/rebind_main.cc,v retrieving revision 1.2 diff -u -p -r1.2 rebind_main.cc --- rebind_main.cc 20 Jun 2011 23:26:26 -0000 1.2 +++ rebind_main.cc 7 Jul 2011 19:17:37 -0000 @@ -67,9 +67,6 @@ main(int argc, char* argv[]) for (int i= 1; i < argc; i++) { - char *a = argv[i]; - char *b = NULL; - char *c = NULL; LinkedObjectFile dll(argv[i]); // FIXME: add this stuff // dll.checkRelocations(); Index: sections.cc =================================================================== RCS file: /sourceware/projects/cygwin-apps-home/cvsfiles/rebase/imagehelper/sections.cc,v retrieving revision 1.3 diff -u -p -r1.3 sections.cc --- sections.cc 21 Jun 2011 15:33:15 -0000 1.3 +++ sections.cc 7 Jul 2011 19:17:37 -0000 @@ -30,7 +30,8 @@ int Base::debug = 0; Section::Section(void *aFileBase, SectionHeader *p) { header = p; - adjust = (uint)header->PointerToRawData + (uint) aFileBase - header->VirtualAddress; + adjust = (uintptr_t) header->PointerToRawData + + (uintptr_t) aFileBase - header->VirtualAddress; strncpy(Name,(char *)header->Name,8); Name[8] = '\0'; } @@ -71,11 +72,20 @@ bool Section::isIn(uint addr) SectionList::SectionList(void *aFileBase) { PIMAGE_DOS_HEADER dosheader = (PIMAGE_DOS_HEADER) aFileBase; - PIMAGE_NT_HEADERS ntheader = (PIMAGE_NT_HEADERS) ((char *)dosheader + dosheader->e_lfanew); + PIMAGE_NT_HEADERS32 ntheader32 = (PIMAGE_NT_HEADERS32) ((char *)dosheader + dosheader->e_lfanew); + PIMAGE_NT_HEADERS64 ntheader64 = (PIMAGE_NT_HEADERS64) ntheader32; - header = (SectionHeader *) (ntheader+1); - FileBase = (uint) aFileBase; - count = ntheader->FileHeader.NumberOfSections; + FileBase = (uintptr_t) aFileBase; + if (ntheader32->OptionalHeader.Magic == IMAGE_NT_OPTIONAL_HDR64_MAGIC) + { + header = (SectionHeader *) (ntheader64+1); + count = ntheader64->FileHeader.NumberOfSections; + } + else + { + header = (SectionHeader *) (ntheader32+1); + count = ntheader32->FileHeader.NumberOfSections; + } for (int i = 0; i < count; i++) { sections[i] = new Section(aFileBase,&header[i]); @@ -291,7 +301,7 @@ bool Relocations::check(void) { int NumOfRelocs = (relocp->SizeOfBlock - sizeof(IMAGE_BASE_RELOCATION)) / sizeof (WORD); int va = relocp->VirtualAddress; - PWORD p = (PWORD)((unsigned int )relocp + sizeof(IMAGE_BASE_RELOCATION)); + PWORD p = (PWORD)((uintptr_t)relocp + sizeof(IMAGE_BASE_RELOCATION)); if (debug) std::cerr << "debug: blocksize= " << std::dec << NumOfRelocs << std::endl; @@ -367,7 +377,7 @@ bool Relocations::relocate(int differenc { int NumOfRelocs = (relocp->SizeOfBlock - sizeof(IMAGE_BASE_RELOCATION)) / sizeof (WORD); int va = relocp->VirtualAddress; - PWORD p = (PWORD)((unsigned int )relocp + sizeof(IMAGE_BASE_RELOCATION)); + PWORD p = (PWORD)((uintptr_t)relocp + sizeof(IMAGE_BASE_RELOCATION)); if (debug) { std::cerr << "VirtAdress: 0x" \ Index: sections.h =================================================================== RCS file: /sourceware/projects/cygwin-apps-home/cvsfiles/rebase/imagehelper/sections.h,v retrieving revision 1.3 diff -u -p -r1.3 sections.h --- sections.h 21 Jun 2011 15:33:15 -0000 1.3 +++ sections.h 7 Jul 2011 19:17:37 -0000 @@ -135,7 +135,7 @@ class SectionList : public Base Section *getNext(void); private: - uint FileBase; + uintptr_t FileBase; SectionHeader *header; Section *sections[SECTIONLIST_MAXSECTIONS]; int count; -- Corinna Vinschen Please, send mails regarding Cygwin to Cygwin Project Co-Leader cygwin AT cygwin DOT com Red Hat