[PATCH] ntdll: Make loader process relocations correctly for win64

Maarten Lankhorst m.b.lankhorst at gmail.com
Sun Dec 21 17:07:58 CST 2008


---
 dlls/ntdll/loader.c  |   10 +++++++++-
 dlls/ntdll/virtual.c |    2 +-
 include/winternl.h   |    2 +-
 3 files changed, 11 insertions(+), 3 deletions(-)

diff --git a/dlls/ntdll/loader.c b/dlls/ntdll/loader.c
index 968d7fd..9e0a569 100644
--- a/dlls/ntdll/loader.c
+++ b/dlls/ntdll/loader.c
@@ -2101,7 +2101,7 @@ NTSTATUS WINAPI LdrAddRefDll( ULONG flags, HMODULE module )
  * Apply relocations to a given page of a mapped PE image.
  */
 IMAGE_BASE_RELOCATION * WINAPI LdrProcessRelocationBlock( void *page, UINT count,
-                                                          USHORT *relocs, INT delta )
+                                                          USHORT *relocs, INT_PTR delta )
 {
     while (count--)
     {
@@ -2111,6 +2111,8 @@ IMAGE_BASE_RELOCATION * WINAPI LdrProcessRelocationBlock( void *page, UINT count
         {
         case IMAGE_REL_BASED_ABSOLUTE:
             break;
+#ifndef _WIN64
+        /* These relocation types are not valid for win64 */
         case IMAGE_REL_BASED_HIGH:
             *(short *)((char *)page + offset) += HIWORD(delta);
             break;
@@ -2120,6 +2122,12 @@ IMAGE_BASE_RELOCATION * WINAPI LdrProcessRelocationBlock( void *page, UINT count
         case IMAGE_REL_BASED_HIGHLOW:
             *(int *)((char *)page + offset) += delta;
             break;
+#else _WIN64
+        /* This relocation type is not valid for win32 */
+        case IMAGE_REL_BASED_DIR64:
+            *(long *)((char *)page + offset) += delta;
+            break;
+#endif
         default:
             FIXME("Unknown/unsupported fixup type %x.\n", type);
             return NULL;
diff --git a/dlls/ntdll/virtual.c b/dlls/ntdll/virtual.c
index bda8be1..7801941 100644
--- a/dlls/ntdll/virtual.c
+++ b/dlls/ntdll/virtual.c
@@ -993,7 +993,7 @@ static NTSTATUS map_image( HANDLE hmapping, int fd, char *base, SIZE_T total_siz
     struct stat st;
     struct file_view *view = NULL;
     char *ptr, *header_end;
-    int delta = 0;
+    INT_PTR delta = 0;
 
     /* zero-map the whole range */
 
diff --git a/include/winternl.h b/include/winternl.h
index c56f905..4c38a9d 100644
--- a/include/winternl.h
+++ b/include/winternl.h
@@ -1978,7 +1978,7 @@ NTSYSAPI NTSTATUS  WINAPI LdrGetProcedureAddress(HMODULE, const ANSI_STRING*, UL
 NTSYSAPI void      WINAPI LdrInitializeThunk(ULONG,ULONG,ULONG,ULONG);
 NTSYSAPI NTSTATUS  WINAPI LdrLoadDll(LPCWSTR, DWORD, const UNICODE_STRING*, HMODULE*);
 NTSYSAPI NTSTATUS  WINAPI LdrLockLoaderLock(ULONG,ULONG*,ULONG*);
-IMAGE_BASE_RELOCATION * WINAPI LdrProcessRelocationBlock(void*,UINT,USHORT*,INT);
+IMAGE_BASE_RELOCATION * WINAPI LdrProcessRelocationBlock(void*,UINT,USHORT*,INT_PTR);
 NTSYSAPI NTSTATUS  WINAPI LdrQueryProcessModuleInformation(SYSTEM_MODULE_INFORMATION*, ULONG, ULONG*);
 NTSYSAPI void      WINAPI LdrShutdownProcess(void);
 NTSYSAPI void      WINAPI LdrShutdownThread(void);
-- 
1.5.6.5


--------------000300000202080901040402--



More information about the wine-patches mailing list