Module: wine Branch: master Commit: 362a7d571e42243262c79bc47eddad086167074e URL: http://source.winehq.org/git/wine.git/?a=commit;h=362a7d571e42243262c79bc47e...
Author: Jacek Caban jacek@codeweavers.com Date: Tue May 10 09:16:39 2011 +0000
kernel32: Moved EnumProcessModules implementation to kernel32.
---
dlls/kernel32/kernel32.spec | 1 + dlls/kernel32/process.c | 82 +++++++++++++++++++++++++++++++++++++++++++ dlls/psapi/psapi.spec | 2 +- dlls/psapi/psapi_main.c | 30 ---------------- 4 files changed, 84 insertions(+), 31 deletions(-)
diff --git a/dlls/kernel32/kernel32.spec b/dlls/kernel32/kernel32.spec index aae17e9..2ac24b4 100644 --- a/dlls/kernel32/kernel32.spec +++ b/dlls/kernel32/kernel32.spec @@ -770,6 +770,7 @@ @ stdcall K32EmptyWorkingSet(long) @ stdcall K32GetProcessImageFileNameA(long ptr long) @ stdcall K32GetProcessImageFileNameW(long ptr long) +@ stdcall K32EnumProcessModules(long ptr long ptr) @ stdcall K32EnumProcesses(ptr long ptr) @ stdcall -i386 -private -register K32Thk1632Epilog() krnl386.exe16.K32Thk1632Epilog @ stdcall -i386 -private -register K32Thk1632Prolog() krnl386.exe16.K32Thk1632Prolog diff --git a/dlls/kernel32/process.c b/dlls/kernel32/process.c index 668230d..6ca1279 100644 --- a/dlls/kernel32/process.c +++ b/dlls/kernel32/process.c @@ -3501,6 +3501,88 @@ BOOL WINAPI K32EnumProcesses(DWORD *lpdwProcessIDs, DWORD cb, DWORD *lpcbUsed) return TRUE; }
+typedef struct { + HANDLE process; + PLIST_ENTRY head, current; + LDR_MODULE ldr_module; +} MODULE_ITERATOR; + +static BOOL init_module_iterator(MODULE_ITERATOR *iter, HANDLE process) +{ + PROCESS_BASIC_INFORMATION pbi; + PPEB_LDR_DATA ldr_data; + NTSTATUS status; + + /* Get address of PEB */ + status = NtQueryInformationProcess(process, ProcessBasicInformation, + &pbi, sizeof(pbi), NULL); + if (status != STATUS_SUCCESS) + { + SetLastError(RtlNtStatusToDosError(status)); + return FALSE; + } + + /* Read address of LdrData from PEB */ + if (!ReadProcessMemory(process, &pbi.PebBaseAddress->LdrData, + &ldr_data, sizeof(ldr_data), NULL)) + return FALSE; + + /* Read address of first module from LdrData */ + if (!ReadProcessMemory(process, + &ldr_data->InLoadOrderModuleList.Flink, + &iter->current, sizeof(iter->current), NULL)) + return FALSE; + + iter->head = &ldr_data->InLoadOrderModuleList; + iter->process = process; + + return TRUE; +} + +static int module_iterator_next(MODULE_ITERATOR *iter) +{ + if (iter->current == iter->head) + return 0; + + if (!ReadProcessMemory(iter->process, + CONTAINING_RECORD(iter->current, LDR_MODULE, InLoadOrderModuleList), + &iter->ldr_module, sizeof(iter->ldr_module), NULL)) + return -1; + + iter->current = iter->ldr_module.InLoadOrderModuleList.Flink; + return 1; +} + +/*********************************************************************** + * K32EnumProcessModules (KERNEL32.@) + * + * NOTES + * Returned list is in load order. + */ +BOOL WINAPI K32EnumProcessModules(HANDLE process, HMODULE *lphModule, + DWORD cb, DWORD *needed) +{ + MODULE_ITERATOR iter; + INT ret; + + if (!init_module_iterator(&iter, process)) + return FALSE; + + *needed = 0; + + while ((ret = module_iterator_next(&iter)) > 0) + { + if (cb >= sizeof(HMODULE)) + { + *lphModule++ = iter.ldr_module.BaseAddress; + cb -= sizeof(HMODULE); + } + *needed += sizeof(HMODULE); + } + + return ret == 0; +} + /*********************************************************************** * ProcessIdToSessionId (KERNEL32.@) * This function is available on Terminal Server 4SP4 and Windows 2000 diff --git a/dlls/psapi/psapi.spec b/dlls/psapi/psapi.spec index f3c960c..70f1144 100644 --- a/dlls/psapi/psapi.spec +++ b/dlls/psapi/psapi.spec @@ -2,7 +2,7 @@ @ stdcall EnumDeviceDrivers(ptr long ptr) @ stdcall EnumPageFilesA(ptr ptr) @ stdcall EnumPageFilesW(ptr ptr) -@ stdcall EnumProcessModules(long ptr long ptr) +@ stdcall EnumProcessModules(long ptr long ptr) kernel32.K32EnumProcessModules @ stdcall EnumProcesses(ptr long ptr) kernel32.K32EnumProcesses @ stdcall GetDeviceDriverBaseNameA(ptr ptr long) @ stdcall GetDeviceDriverBaseNameW(ptr ptr long) diff --git a/dlls/psapi/psapi_main.c b/dlls/psapi/psapi_main.c index 7e05601..34dfeed 100644 --- a/dlls/psapi/psapi_main.c +++ b/dlls/psapi/psapi_main.c @@ -179,36 +179,6 @@ BOOL WINAPI EnumPageFilesW( PENUM_PAGE_FILE_CALLBACKW callback, LPVOID context ) }
/*********************************************************************** - * EnumProcessModules (PSAPI.@) - * - * NOTES - * Returned list is in load order. - */ -BOOL WINAPI EnumProcessModules(HANDLE hProcess, HMODULE *lphModule, - DWORD cb, LPDWORD lpcbNeeded) -{ - MODULE_ITERATOR iter; - INT ret; - - if (!PSAPI_ModuleIteratorInit(&iter, hProcess)) - return FALSE; - - *lpcbNeeded = 0; - - while ((ret = PSAPI_ModuleIteratorNext(&iter)) > 0) - { - if (cb >= sizeof(HMODULE)) - { - *lphModule++ = iter.LdrModule.BaseAddress; - cb -= sizeof(HMODULE); - } - *lpcbNeeded += sizeof(HMODULE); - } - - return (ret == 0); -} - -/*********************************************************************** * GetDeviceDriverBaseNameA (PSAPI.@) */ DWORD WINAPI GetDeviceDriverBaseNameA(LPVOID ImageBase, LPSTR lpBaseName,