Module: wine Branch: master Commit: 1fa36c85bd2e5b76f0ea3a577d4d527221e6c88b URL: http://source.winehq.org/git/wine.git/?a=commit;h=1fa36c85bd2e5b76f0ea3a577d...
Author: Jacek Caban jacek@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