kernel32: Moved EnumProcesses implementation to kernel32.
This commit is contained in:
parent
a4d0d63489
commit
1fa36c85bd
|
@ -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)
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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)
|
||||
|
|
|
@ -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.@)
|
||||
*
|
||||
|
|
Loading…
Reference in New Issue