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