diff --git a/dlls/kernel32/kernel32.spec b/dlls/kernel32/kernel32.spec index 458b4259b0a..4da6f063488 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 347d4aa89ad..4e2c0982aa4 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 ad037168b39..07e0cb54eb1 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 0b8e5b065b6..a2d7ac425c5 100644 --- a/dlls/psapi/psapi_main.c +++ b/dlls/psapi/psapi_main.c @@ -262,52 +262,6 @@ DWORD WINAPI GetMappedFileNameW(HANDLE hProcess, LPVOID lpv, LPWSTR lpFilename, return 0; } -/*********************************************************************** - * 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.@) */