Nikolay Sivov : ntdll: Fix LdrLockLoaderLock()/LdrUnlockLoaderLock() on 64bit.

Alexandre Julliard julliard at winehq.org
Wed Jun 11 13:36:22 CDT 2014


Module: wine
Branch: master
Commit: 5a8d73283cf637e3d00dbb781cc4cd49027a29b5
URL:    http://source.winehq.org/git/wine.git/?a=commit;h=5a8d73283cf637e3d00dbb781cc4cd49027a29b5

Author: Nikolay Sivov <nsivov at codeweavers.com>
Date:   Wed May 28 08:58:59 2014 +0400

ntdll: Fix LdrLockLoaderLock()/LdrUnlockLoaderLock() on 64bit.

---

 dlls/kernel32/module.c       |    7 ++++---
 dlls/kernel32/tests/loader.c |    6 +++---
 dlls/ntdll/actctx.c          |    4 ++--
 dlls/ntdll/loader.c          |    4 ++--
 dlls/ntdll/tests/rtl.c       |   15 ++++++++-------
 include/winternl.h           |    4 ++--
 6 files changed, 21 insertions(+), 19 deletions(-)

diff --git a/dlls/kernel32/module.c b/dlls/kernel32/module.c
index d1555f1..514b6be 100644
--- a/dlls/kernel32/module.c
+++ b/dlls/kernel32/module.c
@@ -538,7 +538,7 @@ BOOL WINAPI GetModuleHandleExW( DWORD flags, LPCWSTR name, HMODULE *module )
 {
     NTSTATUS status = STATUS_SUCCESS;
     HMODULE ret;
-    ULONG magic;
+    ULONG_PTR magic;
     BOOL lock;
 
     if (!module)
@@ -666,7 +666,8 @@ DWORD WINAPI GetModuleFileNameA(
  */
 DWORD WINAPI GetModuleFileNameW( HMODULE hModule, LPWSTR lpFileName, DWORD size )
 {
-    ULONG magic, len = 0;
+    ULONG len = 0;
+    ULONG_PTR magic;
     LDR_MODULE *pldr;
     NTSTATUS nts;
     WIN16_SUBSYSTEM_TIB *win16_tib;
@@ -911,7 +912,7 @@ static HMODULE load_library( const UNICODE_STRING *libname, DWORD flags )
 
     if (flags & LOAD_LIBRARY_AS_DATAFILE)
     {
-        ULONG magic;
+        ULONG_PTR magic;
 
         LdrLockLoaderLock( 0, NULL, &magic );
         if (!LdrGetDllHandle( load_path, flags, libname, &hModule ))
diff --git a/dlls/kernel32/tests/loader.c b/dlls/kernel32/tests/loader.c
index e749238..af43779 100644
--- a/dlls/kernel32/tests/loader.c
+++ b/dlls/kernel32/tests/loader.c
@@ -61,8 +61,8 @@ static void (WINAPI *pLdrShutdownProcess)(void);
 static BOOLEAN (WINAPI *pRtlDllShutdownInProgress)(void);
 static NTSTATUS (WINAPI *pNtAllocateVirtualMemory)(HANDLE, PVOID *, ULONG, SIZE_T *, ULONG, ULONG);
 static NTSTATUS (WINAPI *pNtFreeVirtualMemory)(HANDLE, PVOID *, SIZE_T *, ULONG);
-static NTSTATUS (WINAPI *pLdrLockLoaderLock)(ULONG, ULONG *, ULONG *);
-static NTSTATUS (WINAPI *pLdrUnlockLoaderLock)(ULONG, ULONG);
+static NTSTATUS (WINAPI *pLdrLockLoaderLock)(ULONG, ULONG *, ULONG_PTR *);
+static NTSTATUS (WINAPI *pLdrUnlockLoaderLock)(ULONG, ULONG_PTR);
 static void (WINAPI *pRtlAcquirePebLock)(void);
 static void (WINAPI *pRtlReleasePebLock)(void);
 static PVOID    (WINAPI *pResolveDelayLoadedAPI)(PVOID, PCIMAGE_DELAYLOAD_DESCRIPTOR,
@@ -1367,7 +1367,7 @@ static DWORD WINAPI mutex_thread_proc(void *param)
         if (ret == WAIT_OBJECT_0) break;
         else if (ret == WAIT_OBJECT_0 + 1)
         {
-            ULONG loader_lock_magic;
+            ULONG_PTR loader_lock_magic;
             trace("%04u: mutex_thread_proc: Entering loader lock\n", GetCurrentThreadId());
             ret = pLdrLockLoaderLock(0, NULL, &loader_lock_magic);
             ok(!ret, "LdrLockLoaderLock error %#x\n", ret);
diff --git a/dlls/ntdll/actctx.c b/dlls/ntdll/actctx.c
index 14e196f..9a9dec9 100644
--- a/dlls/ntdll/actctx.c
+++ b/dlls/ntdll/actctx.c
@@ -2435,7 +2435,7 @@ static NTSTATUS open_nt_file( HANDLE *handle, UNICODE_STRING *name )
 static NTSTATUS get_module_filename( HMODULE module, UNICODE_STRING *str, unsigned int extra_len )
 {
     NTSTATUS status;
-    ULONG magic;
+    ULONG_PTR magic;
     LDR_MODULE *pldr;
 
     LdrLockLoaderLock(0, NULL, &magic);
@@ -2934,7 +2934,7 @@ static NTSTATUS find_query_actctx( HANDLE *handle, DWORD flags, ULONG class )
     }
     else if (flags & (QUERY_ACTCTX_FLAG_ACTCTX_IS_ADDRESS|QUERY_ACTCTX_FLAG_ACTCTX_IS_HMODULE))
     {
-        ULONG magic;
+        ULONG_PTR magic;
         LDR_MODULE *pldr;
 
         if (!*handle) return STATUS_INVALID_PARAMETER;
diff --git a/dlls/ntdll/loader.c b/dlls/ntdll/loader.c
index 6471290..79aa341 100644
--- a/dlls/ntdll/loader.c
+++ b/dlls/ntdll/loader.c
@@ -1340,7 +1340,7 @@ NTSTATUS WINAPI LdrFindEntryForAddress(const void* addr, PLDR_MODULE* pmod)
  * Note: some flags are not implemented.
  * Flag 0x01 is used to raise exceptions on errors.
  */
-NTSTATUS WINAPI LdrLockLoaderLock( ULONG flags, ULONG *result, ULONG *magic )
+NTSTATUS WINAPI LdrLockLoaderLock( ULONG flags, ULONG *result, ULONG_PTR *magic )
 {
     if (flags & ~0x2) FIXME( "flags %x not supported\n", flags );
 
@@ -1372,7 +1372,7 @@ NTSTATUS WINAPI LdrLockLoaderLock( ULONG flags, ULONG *result, ULONG *magic )
 /******************************************************************
  *		LdrUnlockLoaderUnlock  (NTDLL.@)
  */
-NTSTATUS WINAPI LdrUnlockLoaderLock( ULONG flags, ULONG magic )
+NTSTATUS WINAPI LdrUnlockLoaderLock( ULONG flags, ULONG_PTR magic )
 {
     if (magic)
     {
diff --git a/dlls/ntdll/tests/rtl.c b/dlls/ntdll/tests/rtl.c
index 72cee05..e8eb04a 100644
--- a/dlls/ntdll/tests/rtl.c
+++ b/dlls/ntdll/tests/rtl.c
@@ -90,8 +90,8 @@ static CHAR *    (WINAPI *pRtlIpv4AddressToStringA)(const IN_ADDR *, LPSTR);
 static NTSTATUS  (WINAPI *pRtlIpv4AddressToStringExA)(const IN_ADDR *, USHORT, LPSTR, PULONG);
 static NTSTATUS  (WINAPI *pRtlIpv4StringToAddressA)(PCSTR, BOOLEAN, PCSTR *, IN_ADDR *);
 static NTSTATUS  (WINAPI *pLdrAddRefDll)(ULONG, HMODULE);
-static NTSTATUS  (WINAPI *pLdrLockLoaderLock)(ULONG, ULONG*, ULONG*);
-static NTSTATUS  (WINAPI *pLdrUnlockLoaderLock)(ULONG, ULONG);
+static NTSTATUS  (WINAPI *pLdrLockLoaderLock)(ULONG, ULONG*, ULONG_PTR*);
+static NTSTATUS  (WINAPI *pLdrUnlockLoaderLock)(ULONG, ULONG_PTR);
 
 static HMODULE hkernel32 = 0;
 static BOOL      (WINAPI *pIsWow64Process)(HANDLE, PBOOL);
@@ -1549,7 +1549,8 @@ static void test_LdrAddRefDll(void)
 
 static void test_LdrLockLoaderLock(void)
 {
-    ULONG result, magic;
+    ULONG_PTR magic;
+    ULONG result;
     NTSTATUS status;
 
     if (!pLdrLockLoaderLock)
@@ -1564,12 +1565,12 @@ static void test_LdrLockLoaderLock(void)
     status = pLdrLockLoaderLock(0x10, &result, &magic);
     ok(status == STATUS_INVALID_PARAMETER_1, "got 0x%08x\n", status);
     ok(result == 0, "got %d\n", result);
-    ok(magic == 0, "got 0x%08x\n", magic);
+    ok(magic == 0, "got %lx\n", magic);
 
     magic = 0xdeadbeef;
     status = pLdrLockLoaderLock(0x10, NULL, &magic);
     ok(status == STATUS_INVALID_PARAMETER_1, "got 0x%08x\n", status);
-    ok(magic == 0, "got 0x%08x\n", magic);
+    ok(magic == 0, "got %lx\n", magic);
 
     result = 10;
     status = pLdrLockLoaderLock(0x10, &result, NULL);
@@ -1580,7 +1581,7 @@ static void test_LdrLockLoaderLock(void)
     magic = 0xdeadbeef;
     status = pLdrLockLoaderLock(0x2, NULL, &magic);
     ok(status == STATUS_INVALID_PARAMETER_2, "got 0x%08x\n", status);
-    ok(magic == 0, "got 0x%08x\n", magic);
+    ok(magic == 0, "got %lx\n", magic);
 
     /* magic pointer is null */
     result = 10;
@@ -1594,7 +1595,7 @@ static void test_LdrLockLoaderLock(void)
     status = pLdrLockLoaderLock(0x2, &result, &magic);
     ok(status == STATUS_SUCCESS, "got 0x%08x\n", status);
     ok(result == 1, "got %d\n", result);
-    ok(magic != 0, "got 0x%08x\n", magic);
+    ok(magic != 0, "got %lx\n", magic);
     pLdrUnlockLoaderLock(0, magic);
 }
 
diff --git a/include/winternl.h b/include/winternl.h
index d7f2f50..a95a016 100644
--- a/include/winternl.h
+++ b/include/winternl.h
@@ -2020,14 +2020,14 @@ NTSYSAPI NTSTATUS  WINAPI LdrGetDllHandle(LPCWSTR, ULONG, const UNICODE_STRING*,
 NTSYSAPI NTSTATUS  WINAPI LdrGetProcedureAddress(HMODULE, const ANSI_STRING*, ULONG, void**);
 NTSYSAPI void      WINAPI LdrInitializeThunk(void*,ULONG_PTR,ULONG_PTR,ULONG_PTR);
 NTSYSAPI NTSTATUS  WINAPI LdrLoadDll(LPCWSTR, DWORD, const UNICODE_STRING*, HMODULE*);
-NTSYSAPI NTSTATUS  WINAPI LdrLockLoaderLock(ULONG,ULONG*,ULONG*);
+NTSYSAPI NTSTATUS  WINAPI LdrLockLoaderLock(ULONG,ULONG*,ULONG_PTR*);
 IMAGE_BASE_RELOCATION * WINAPI LdrProcessRelocationBlock(void*,UINT,USHORT*,INT_PTR);
 NTSYSAPI NTSTATUS  WINAPI LdrQueryImageFileExecutionOptions(const UNICODE_STRING*,LPCWSTR,ULONG,void*,ULONG,ULONG*);
 NTSYSAPI NTSTATUS  WINAPI LdrQueryProcessModuleInformation(SYSTEM_MODULE_INFORMATION*, ULONG, ULONG*);
 NTSYSAPI void      WINAPI LdrShutdownProcess(void);
 NTSYSAPI void      WINAPI LdrShutdownThread(void);
 NTSYSAPI NTSTATUS  WINAPI LdrUnloadDll(HMODULE);
-NTSYSAPI NTSTATUS  WINAPI LdrUnlockLoaderLock(ULONG,ULONG);
+NTSYSAPI NTSTATUS  WINAPI LdrUnlockLoaderLock(ULONG,ULONG_PTR);
 NTSYSAPI NTSTATUS  WINAPI NtAcceptConnectPort(PHANDLE,ULONG,PLPC_MESSAGE,BOOLEAN,PLPC_SECTION_WRITE,PLPC_SECTION_READ);
 NTSYSAPI NTSTATUS  WINAPI NtAccessCheck(PSECURITY_DESCRIPTOR,HANDLE,ACCESS_MASK,PGENERIC_MAPPING,PPRIVILEGE_SET,PULONG,PULONG,NTSTATUS*);
 NTSYSAPI NTSTATUS  WINAPI NtAccessCheckAndAuditAlarm(PUNICODE_STRING,HANDLE,PUNICODE_STRING,PUNICODE_STRING,PSECURITY_DESCRIPTOR,ACCESS_MASK,PGENERIC_MAPPING,BOOLEAN,PACCESS_MASK,PBOOLEAN,PBOOLEAN);




More information about the wine-cvs mailing list