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