Jacek Caban : kernel32: Moved EnumProcesses implementation to kernel32.

Alexandre Julliard julliard at winehq.org
Wed May 4 13:47:39 CDT 2011


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

Author: Jacek Caban <jacek at codeweavers.com>
Date:   Tue May  3 21:08:42 2011 +0000

kernel32: Moved EnumProcesses implementation to kernel32.

---

 dlls/kernel32/kernel32.spec |    1 +
 dlls/kernel32/process.c     |   44 ++++++++++++++++++++++++++++++++++++++
 dlls/psapi/psapi.spec       |    2 +-
 dlls/psapi/psapi_main.c     |   49 -------------------------------------------
 4 files changed, 46 insertions(+), 50 deletions(-)

diff --git a/dlls/kernel32/kernel32.spec b/dlls/kernel32/kernel32.spec
index 946bce0..aae17e9 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 K32EnumProcesses(ptr long ptr)
 @ stdcall -i386 -private -register K32Thk1632Epilog() krnl386.exe16.K32Thk1632Epilog
 @ stdcall -i386 -private -register K32Thk1632Prolog() krnl386.exe16.K32Thk1632Prolog
 @ stdcall LCIDToLocaleName(long ptr long long)
diff --git a/dlls/kernel32/process.c b/dlls/kernel32/process.c
index d1d6a3b..668230d 100644
--- a/dlls/kernel32/process.c
+++ b/dlls/kernel32/process.c
@@ -3458,6 +3458,50 @@ DWORD WINAPI K32GetProcessImageFileNameW( HANDLE process, LPWSTR file, DWORD siz
 }
 
 /***********************************************************************
+ *           K32EnumProcesses (KERNEL32.@)
+ */
+BOOL WINAPI K32EnumProcesses(DWORD *lpdwProcessIDs, DWORD cb, DWORD *lpcbUsed)
+{
+    SYSTEM_PROCESS_INFORMATION *spi;
+    ULONG size = 0x4000;
+    void *buf = NULL;
+    NTSTATUS status;
+
+    do {
+        size *= 2;
+        HeapFree(GetProcessHeap(), 0, buf);
+        buf = HeapAlloc(GetProcessHeap(), 0, size);
+        if (!buf)
+            return FALSE;
+
+        status = NtQuerySystemInformation(SystemProcessInformation, buf, size, NULL);
+    } while(status == STATUS_INFO_LENGTH_MISMATCH);
+
+    if (status != STATUS_SUCCESS)
+    {
+        HeapFree(GetProcessHeap(), 0, buf);
+        SetLastError(RtlNtStatusToDosError(status));
+        return FALSE;
+    }
+
+    spi = buf;
+
+    for (*lpcbUsed = 0; cb >= sizeof(DWORD); cb -= sizeof(DWORD))
+    {
+        *lpdwProcessIDs++ = HandleToUlong(spi->UniqueProcessId);
+        *lpcbUsed += sizeof(DWORD);
+
+        if (spi->NextEntryOffset == 0)
+            break;
+
+        spi = (SYSTEM_PROCESS_INFORMATION *)(((PCHAR)spi) + spi->NextEntryOffset);
+    }
+
+    HeapFree(GetProcessHeap(), 0, buf);
+    return TRUE;
+}
+
+/***********************************************************************
  * 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 25e39cc..f3c960c 100644
--- a/dlls/psapi/psapi.spec
+++ b/dlls/psapi/psapi.spec
@@ -3,7 +3,7 @@
 @ stdcall EnumPageFilesA(ptr ptr)
 @ stdcall EnumPageFilesW(ptr ptr)
 @ stdcall EnumProcessModules(long ptr long ptr)
-@ stdcall EnumProcesses(ptr long ptr)
+@ stdcall EnumProcesses(ptr long ptr) kernel32.K32EnumProcesses
 @ stdcall GetDeviceDriverBaseNameA(ptr ptr long)
 @ stdcall GetDeviceDriverBaseNameW(ptr ptr long)
 @ stdcall GetDeviceDriverFileNameA(ptr ptr long)
diff --git a/dlls/psapi/psapi_main.c b/dlls/psapi/psapi_main.c
index 07863ea..7e05601 100644
--- a/dlls/psapi/psapi_main.c
+++ b/dlls/psapi/psapi_main.c
@@ -179,55 +179,6 @@ BOOL WINAPI EnumPageFilesW( PENUM_PAGE_FILE_CALLBACKW callback, LPVOID context )
 }
 
 /***********************************************************************
- *           EnumProcesses (PSAPI.@)
- */
-BOOL WINAPI EnumProcesses(DWORD *lpdwProcessIDs, DWORD cb, DWORD *lpcbUsed)
-{
-    SYSTEM_PROCESS_INFORMATION *spi;
-    NTSTATUS status;
-    PVOID pBuf = NULL;
-    ULONG nAlloc = 0x8000;
-
-    do {
-        if (pBuf != NULL) 
-        {
-            HeapFree(GetProcessHeap(), 0, pBuf);
-            nAlloc *= 2;
-        }
-
-        pBuf = HeapAlloc(GetProcessHeap(), 0, nAlloc);
-        if (pBuf == NULL)
-            return FALSE;
-
-        status = NtQuerySystemInformation(SystemProcessInformation, pBuf,
-                                          nAlloc, NULL);
-    } while (status == STATUS_INFO_LENGTH_MISMATCH);
-
-    if (status != STATUS_SUCCESS)
-    {
-        HeapFree(GetProcessHeap(), 0, pBuf);
-        SetLastError(RtlNtStatusToDosError(status));
-        return FALSE;
-    }
-
-    spi = pBuf;
-
-    for (*lpcbUsed = 0; cb >= sizeof(DWORD); cb -= sizeof(DWORD))
-    {
-        *lpdwProcessIDs++ = HandleToUlong(spi->UniqueProcessId);
-        *lpcbUsed += sizeof(DWORD);
-
-        if (spi->NextEntryOffset == 0)
-            break;
-
-        spi = (SYSTEM_PROCESS_INFORMATION *)(((PCHAR)spi) + spi->NextEntryOffset);
-    }
-
-    HeapFree(GetProcessHeap(), 0, pBuf);
-    return TRUE;
-}
-
-/***********************************************************************
  *           EnumProcessModules (PSAPI.@)
  *
  * NOTES




More information about the wine-cvs mailing list