Jacek Caban : kernel32: Moved GetModuleBaseName[AW] implementation to kernel32.

Alexandre Julliard julliard at winehq.org
Thu May 12 13:57:50 CDT 2011


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

Author: Jacek Caban <jacek at codeweavers.com>
Date:   Thu May 12 12:22:59 2011 +0000

kernel32: Moved GetModuleBaseName[AW] implementation to kernel32.

---

 dlls/kernel32/kernel32.spec |    2 +
 dlls/kernel32/module.c      |   72 +++++++++++++++++++++++++++++++++++++++++++
 dlls/psapi/psapi.spec       |    4 +-
 dlls/psapi/psapi_main.c     |   46 ---------------------------
 4 files changed, 76 insertions(+), 48 deletions(-)

diff --git a/dlls/kernel32/kernel32.spec b/dlls/kernel32/kernel32.spec
index 458b425..4da6f06 100644
--- a/dlls/kernel32/kernel32.spec
+++ b/dlls/kernel32/kernel32.spec
@@ -772,6 +772,8 @@
 @ stdcall K32GetProcessImageFileNameW(long ptr long)
 @ stdcall K32EnumProcessModules(long ptr long ptr)
 @ stdcall K32EnumProcesses(ptr long ptr)
+@ stdcall K32GetModuleBaseNameA(long long ptr long)
+@ stdcall K32GetModuleBaseNameW(long long ptr long)
 @ stdcall K32GetProcessMemoryInfo(long ptr long)
 @ stdcall K32QueryWorkingSet(long ptr long)
 @ stdcall K32QueryWorkingSetEx(long ptr long)
diff --git a/dlls/kernel32/module.c b/dlls/kernel32/module.c
index 347d4aa..4e2c098 100644
--- a/dlls/kernel32/module.c
+++ b/dlls/kernel32/module.c
@@ -1125,6 +1125,29 @@ static int module_iterator_next(MODULE_ITERATOR *iter)
     return 1;
 }
 
+static BOOL get_ldr_module(HANDLE process, HMODULE module, LDR_MODULE *ldr_module)
+{
+    MODULE_ITERATOR iter;
+    INT ret;
+
+    if (!init_module_iterator(&iter, process))
+        return FALSE;
+
+    while ((ret = module_iterator_next(&iter)) > 0)
+        /* When hModule is NULL we return the process image - which will be
+         * the first module since our iterator uses InLoadOrderModuleList */
+        if (!module || module == iter.ldr_module.BaseAddress)
+        {
+            *ldr_module = iter.ldr_module;
+            return TRUE;
+        }
+
+    if (ret == 0)
+        SetLastError(ERROR_INVALID_HANDLE);
+
+    return FALSE;
+}
+
 /***********************************************************************
  *           K32EnumProcessModules (KERNEL32.@)
  *
@@ -1155,6 +1178,55 @@ BOOL WINAPI K32EnumProcessModules(HANDLE process, HMODULE *lphModule,
     return ret == 0;
 }
 
+/***********************************************************************
+ *           K32GetModuleBaseNameW (KERNEL32.@)
+ */
+DWORD WINAPI K32GetModuleBaseNameW(HANDLE process, HMODULE module,
+                                   LPWSTR base_name, DWORD size)
+{
+    LDR_MODULE ldr_module;
+
+    if (!get_ldr_module(process, module, &ldr_module))
+        return 0;
+
+    size = min(ldr_module.BaseDllName.Length / sizeof(WCHAR), size);
+    if (!ReadProcessMemory(process, ldr_module.BaseDllName.Buffer,
+                           base_name, size * sizeof(WCHAR), NULL))
+        return 0;
+
+    base_name[size] = 0;
+    return size;
+}
+
+/***********************************************************************
+ *           K32GetModuleBaseNameA (KERNEL32.@)
+ */
+DWORD WINAPI K32GetModuleBaseNameA(HANDLE process, HMODULE module,
+                                   LPSTR base_name, DWORD size)
+{
+    WCHAR *base_name_w;
+    DWORD len, ret = 0;
+
+    if(!base_name || !size) {
+        SetLastError(ERROR_INVALID_PARAMETER);
+        return 0;
+    }
+
+    base_name_w = HeapAlloc(GetProcessHeap(), 0, sizeof(WCHAR) * size);
+    if(!base_name_w)
+        return 0;
+
+    len = K32GetModuleBaseNameW(process, module, base_name_w, size);
+    TRACE("%d, %s\n", len, debugstr_w(base_name_w));
+    if (len)
+    {
+        ret = WideCharToMultiByte(CP_ACP, 0, base_name_w, len,
+                                  base_name, size, NULL, NULL);
+        if (ret < size) base_name[ret] = 0;
+    }
+    HeapFree(GetProcessHeap(), 0, base_name_w);
+    return ret;
+}
 
 #ifdef __i386__
 
diff --git a/dlls/psapi/psapi.spec b/dlls/psapi/psapi.spec
index ad03716..07e0cb5 100644
--- a/dlls/psapi/psapi.spec
+++ b/dlls/psapi/psapi.spec
@@ -10,8 +10,8 @@
 @ stdcall GetDeviceDriverFileNameW(ptr ptr long)
 @ stdcall GetMappedFileNameA(long ptr ptr long)
 @ stdcall GetMappedFileNameW(long ptr ptr long)
-@ stdcall GetModuleBaseNameA(long long ptr long)
-@ stdcall GetModuleBaseNameW(long long ptr long)
+@ stdcall GetModuleBaseNameA(long long ptr long) kernel32.K32GetModuleBaseNameA
+@ stdcall GetModuleBaseNameW(long long ptr long) kernel32.K32GetModuleBaseNameW
 @ stdcall GetModuleFileNameExA(long long ptr long)
 @ stdcall GetModuleFileNameExW(long long ptr long)
 @ stdcall GetModuleInformation(long long ptr long)
diff --git a/dlls/psapi/psapi_main.c b/dlls/psapi/psapi_main.c
index 0b8e5b0..a2d7ac4 100644
--- a/dlls/psapi/psapi_main.c
+++ b/dlls/psapi/psapi_main.c
@@ -263,52 +263,6 @@ DWORD WINAPI GetMappedFileNameW(HANDLE hProcess, LPVOID lpv, LPWSTR lpFilename,
 }
 
 /***********************************************************************
- *           GetModuleBaseNameA (PSAPI.@)
- */
-DWORD WINAPI GetModuleBaseNameA(HANDLE hProcess, HMODULE hModule, 
-                                LPSTR lpBaseName, DWORD nSize)
-{
-    WCHAR *lpBaseNameW;
-    DWORD buflenW, ret = 0;
-
-    if(!lpBaseName || !nSize) {
-        SetLastError(ERROR_INVALID_PARAMETER);
-        return 0;
-    }
-    lpBaseNameW = HeapAlloc(GetProcessHeap(), 0, sizeof(WCHAR) * nSize);
-    buflenW = GetModuleBaseNameW(hProcess, hModule, lpBaseNameW, nSize);
-    TRACE("%d, %s\n", buflenW, debugstr_w(lpBaseNameW));
-    if (buflenW)
-    {
-        ret = WideCharToMultiByte(CP_ACP, 0, lpBaseNameW, buflenW,
-                                  lpBaseName, nSize, NULL, NULL);
-        if (ret < nSize) lpBaseName[ret] = 0;
-    }
-    HeapFree(GetProcessHeap(), 0, lpBaseNameW);
-    return ret;
-}
-
-/***********************************************************************
- *           GetModuleBaseNameW (PSAPI.@)
- */
-DWORD WINAPI GetModuleBaseNameW(HANDLE hProcess, HMODULE hModule, 
-                                LPWSTR lpBaseName, DWORD nSize)
-{
-    LDR_MODULE LdrModule;
-
-    if (!PSAPI_GetLdrModule(hProcess, hModule, &LdrModule))
-        return 0;
-
-    nSize = min(LdrModule.BaseDllName.Length / sizeof(WCHAR), nSize);
-    if (!ReadProcessMemory(hProcess, LdrModule.BaseDllName.Buffer,
-                           lpBaseName, nSize * sizeof(WCHAR), NULL))
-        return 0;
-
-    lpBaseName[nSize] = 0;
-    return nSize;
-}
-
-/***********************************************************************
  *           GetModuleFileNameExA (PSAPI.@)
  */
 DWORD WINAPI GetModuleFileNameExA(HANDLE hProcess, HMODULE hModule, 




More information about the wine-cvs mailing list