Jacek Caban : kernel32: Moved GetModuleInformation implementation to kernel32.

Alexandre Julliard julliard at winehq.org
Thu May 12 13:57:50 CDT 2011


Module: wine
Branch: master
Commit: 0d0f2fa4a95050292d7c7ed92b477c03231925b1
URL:    http://source.winehq.org/git/wine.git/?a=commit;h=0d0f2fa4a95050292d7c7ed92b477c03231925b1

Author: Jacek Caban <jacek at codeweavers.com>
Date:   Thu May 12 12:23:45 2011 +0000

kernel32: Moved GetModuleInformation implementation to kernel32.

---

 dlls/kernel32/kernel32.spec |    1 +
 dlls/kernel32/module.c      |   24 ++++++++
 dlls/psapi/psapi.spec       |    2 +-
 dlls/psapi/psapi_main.c     |  136 -------------------------------------------
 4 files changed, 26 insertions(+), 137 deletions(-)

diff --git a/dlls/kernel32/kernel32.spec b/dlls/kernel32/kernel32.spec
index 3f85557..31680fe 100644
--- a/dlls/kernel32/kernel32.spec
+++ b/dlls/kernel32/kernel32.spec
@@ -776,6 +776,7 @@
 @ stdcall K32GetModuleBaseNameW(long long ptr long)
 @ stdcall K32GetModuleFileNameExA(long long ptr long)
 @ stdcall K32GetModuleFileNameExW(long long ptr long)
+@ stdcall K32GetModuleInformation(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 94d20c3..8ee0fcd 100644
--- a/dlls/kernel32/module.c
+++ b/dlls/kernel32/module.c
@@ -37,6 +37,7 @@
 #include "winbase.h"
 #include "winternl.h"
 #include "kernel_private.h"
+#include "psapi.h"
 
 #include "wine/exception.h"
 #include "wine/debug.h"
@@ -1283,6 +1284,29 @@ DWORD WINAPI K32GetModuleFileNameExA(HANDLE process, HMODULE module,
     return strlen(file_name);
 }
 
+/***********************************************************************
+ *           K32GetModuleInformation (KERNEL32.@)
+ */
+BOOL WINAPI K32GetModuleInformation(HANDLE process, HMODULE module,
+                                    MODULEINFO *modinfo, DWORD cb)
+{
+    LDR_MODULE ldr_module;
+
+    if (cb < sizeof(MODULEINFO))
+    {
+        SetLastError(ERROR_INSUFFICIENT_BUFFER);
+        return FALSE;
+    }
+
+    if (!get_ldr_module(process, module, &ldr_module))
+        return FALSE;
+
+    modinfo->lpBaseOfDll = ldr_module.BaseAddress;
+    modinfo->SizeOfImage = ldr_module.SizeOfImage;
+    modinfo->EntryPoint  = ldr_module.EntryPoint;
+    return TRUE;
+}
+
 #ifdef __i386__
 
 /***********************************************************************
diff --git a/dlls/psapi/psapi.spec b/dlls/psapi/psapi.spec
index 0427891..aaf2931 100644
--- a/dlls/psapi/psapi.spec
+++ b/dlls/psapi/psapi.spec
@@ -14,7 +14,7 @@
 @ stdcall GetModuleBaseNameW(long long ptr long) kernel32.K32GetModuleBaseNameW
 @ stdcall GetModuleFileNameExA(long long ptr long) kernel32.K32GetModuleFileNameExA
 @ stdcall GetModuleFileNameExW(long long ptr long) kernel32.K32GetModuleFileNameExW
-@ stdcall GetModuleInformation(long long ptr long)
+@ stdcall GetModuleInformation(long long ptr long) kernel32.K32GetModuleInformation
 @ stdcall GetPerformanceInfo(ptr long)
 @ stdcall GetProcessImageFileNameA(long ptr long) kernel32.K32GetProcessImageFileNameA
 @ stdcall GetProcessImageFileNameW(long ptr long) kernel32.K32GetProcessImageFileNameW
diff --git a/dlls/psapi/psapi_main.c b/dlls/psapi/psapi_main.c
index b4cabca..b297b7b 100644
--- a/dlls/psapi/psapi_main.c
+++ b/dlls/psapi/psapi_main.c
@@ -34,119 +34,6 @@
 
 WINE_DEFAULT_DEBUG_CHANNEL(psapi);
 
-typedef struct
-{
-    HANDLE hProcess;             
-    PLIST_ENTRY pHead, pCurrent;
-    LDR_MODULE LdrModule;
-} MODULE_ITERATOR;
-
-/***********************************************************************
- *           PSAPI_ModuleIteratorInit [internal]
- *
- * Prepares to iterate through the loaded modules of the given process.
- *
- * RETURNS
- *  Success: TRUE
- *  Failure: FALSE
- */
-static BOOL PSAPI_ModuleIteratorInit(MODULE_ITERATOR *iter, HANDLE hProcess)
-{
-    PROCESS_BASIC_INFORMATION pbi;
-    PPEB_LDR_DATA pLdrData;
-    NTSTATUS status;
-
-    /* Get address of PEB */
-    status = NtQueryInformationProcess(hProcess, ProcessBasicInformation,
-                                       &pbi, sizeof(pbi), NULL);
-    if (status != STATUS_SUCCESS)
-    {
-        SetLastError(RtlNtStatusToDosError(status));
-        return FALSE;
-    }
-
-    /* Read address of LdrData from PEB */
-    if (!ReadProcessMemory(hProcess, &pbi.PebBaseAddress->LdrData,
-                           &pLdrData, sizeof(pLdrData), NULL))
-        return FALSE;
-
-    /* Read address of first module from LdrData */
-    if (!ReadProcessMemory(hProcess,
-                           &pLdrData->InLoadOrderModuleList.Flink,
-                           &iter->pCurrent, sizeof(iter->pCurrent), NULL))
-        return FALSE;
-
-    iter->pHead = &pLdrData->InLoadOrderModuleList;
-    iter->hProcess = hProcess;
-
-    return TRUE;
-}
-
-/***********************************************************************
- *           PSAPI_ModuleIteratorNext [internal]
- *
- * Iterates to the next module.
- *
- * RETURNS
- *   1 : Success
- *   0 : No more modules
- *  -1 : Failure
- *
- * NOTES
- *  Every function which uses this routine suffers from a race condition 
- *  when a module is unloaded during the enumeration which can cause the
- *  function to fail. As there is no way to lock the loader of another 
- *  process we can't avoid that.
- */
-static INT PSAPI_ModuleIteratorNext(MODULE_ITERATOR *iter)
-{
-    if (iter->pCurrent == iter->pHead)
-        return 0;
-
-    if (!ReadProcessMemory(iter->hProcess, CONTAINING_RECORD(iter->pCurrent,
-                           LDR_MODULE, InLoadOrderModuleList),
-                           &iter->LdrModule, sizeof(iter->LdrModule), NULL))
-         return -1;
-    else
-         iter->pCurrent = iter->LdrModule.InLoadOrderModuleList.Flink;
-
-    return 1;
-}
-
-/***********************************************************************
- *           PSAPI_GetLdrModule [internal]
- *
- * Reads the LDR_MODULE structure of the given module.
- *
- * RETURNS
- *  Success: TRUE
- *  Failure: FALSE
- */
-
-static BOOL PSAPI_GetLdrModule(HANDLE hProcess, HMODULE hModule, 
-                               LDR_MODULE *pLdrModule)
-{
-    MODULE_ITERATOR iter;
-    INT ret;
-
-    if (!PSAPI_ModuleIteratorInit(&iter, hProcess))
-        return FALSE;
-
-    while ((ret = PSAPI_ModuleIteratorNext(&iter)) > 0)
-        /* When hModule is NULL we return the process image - which will be
-         * the first module since our iterator uses InLoadOrderModuleList */
-        if (!hModule || hModule == iter.LdrModule.BaseAddress)
-        {
-            *pLdrModule = iter.LdrModule;
-            return TRUE;
-        }
-
-    if (ret == 0)
-        SetLastError(ERROR_INVALID_HANDLE);
-
-    return FALSE;
-}
-
 /***********************************************************************
  *           EnumDeviceDrivers (PSAPI.@)
  */
@@ -263,29 +150,6 @@ DWORD WINAPI GetMappedFileNameW(HANDLE hProcess, LPVOID lpv, LPWSTR lpFilename,
 }
 
 /***********************************************************************
- *           GetModuleInformation (PSAPI.@)
- */
-BOOL WINAPI GetModuleInformation(HANDLE hProcess, HMODULE hModule, 
-                                 LPMODULEINFO lpmodinfo, DWORD cb)
-{
-    LDR_MODULE LdrModule;
-
-    if (cb < sizeof(MODULEINFO)) 
-    {
-        SetLastError(ERROR_INSUFFICIENT_BUFFER);
-        return FALSE;
-    }
-
-    if (!PSAPI_GetLdrModule(hProcess, hModule, &LdrModule))
-        return FALSE;
-
-    lpmodinfo->lpBaseOfDll = LdrModule.BaseAddress;
-    lpmodinfo->SizeOfImage = LdrModule.SizeOfImage;
-    lpmodinfo->EntryPoint  = LdrModule.EntryPoint;
-    return TRUE;
-}
-
-/***********************************************************************
  *           GetPerformanceInfo (PSAPI.@)
  */
 BOOL WINAPI GetPerformanceInfo( PPERFORMANCE_INFORMATION info, DWORD size )




More information about the wine-cvs mailing list