kernel32: Moved EnumProcesses implementation to kernel32.

This commit is contained in:
Jacek Caban 2011-05-03 21:08:42 +00:00 committed by Alexandre Julliard
parent a4d0d63489
commit 1fa36c85bd
4 changed files with 46 additions and 50 deletions

View File

@ -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)

View File

@ -3457,6 +3457,50 @@ DWORD WINAPI K32GetProcessImageFileNameW( HANDLE process, LPWSTR file, DWORD siz
return QueryFullProcessImageNameW(process, PROCESS_NAME_NATIVE, file, &size) ? size : 0;
}
/***********************************************************************
* 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

View File

@ -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)

View File

@ -178,55 +178,6 @@ BOOL WINAPI EnumPageFilesW( PENUM_PAGE_FILE_CALLBACKW callback, LPVOID context )
return FALSE;
}
/***********************************************************************
* 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.@)
*