Jacek Caban : kernel32: Moved EnumProcessModules implementation to kernel32 .
Alexandre Julliard
julliard at winehq.org
Tue May 10 13:33:39 CDT 2011
Module: wine
Branch: master
Commit: 362a7d571e42243262c79bc47eddad086167074e
URL: http://source.winehq.org/git/wine.git/?a=commit;h=362a7d571e42243262c79bc47eddad086167074e
Author: Jacek Caban <jacek at 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,
More information about the wine-cvs
mailing list