This is the mail archive of the cygwin-apps mailing list for the Cygwin project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

[patch/rebase] Make imagehelper 64-bit capable (was Re: [patch/rebase] Add a rebase database ...)


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


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]