kernel32: Moved EnumProcesses implementation to kernel32.
This commit is contained in:
parent
a4d0d63489
commit
1fa36c85bd
@ -770,6 +770,7 @@
|
|||||||
@ stdcall K32EmptyWorkingSet(long)
|
@ stdcall K32EmptyWorkingSet(long)
|
||||||
@ stdcall K32GetProcessImageFileNameA(long ptr long)
|
@ stdcall K32GetProcessImageFileNameA(long ptr long)
|
||||||
@ stdcall K32GetProcessImageFileNameW(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 K32Thk1632Epilog() krnl386.exe16.K32Thk1632Epilog
|
||||||
@ stdcall -i386 -private -register K32Thk1632Prolog() krnl386.exe16.K32Thk1632Prolog
|
@ stdcall -i386 -private -register K32Thk1632Prolog() krnl386.exe16.K32Thk1632Prolog
|
||||||
@ stdcall LCIDToLocaleName(long ptr long long)
|
@ 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;
|
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.@)
|
* ProcessIdToSessionId (KERNEL32.@)
|
||||||
* This function is available on Terminal Server 4SP4 and Windows 2000
|
* This function is available on Terminal Server 4SP4 and Windows 2000
|
||||||
|
@ -3,7 +3,7 @@
|
|||||||
@ stdcall EnumPageFilesA(ptr ptr)
|
@ stdcall EnumPageFilesA(ptr ptr)
|
||||||
@ stdcall EnumPageFilesW(ptr ptr)
|
@ stdcall EnumPageFilesW(ptr ptr)
|
||||||
@ stdcall EnumProcessModules(long ptr long 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 GetDeviceDriverBaseNameA(ptr ptr long)
|
||||||
@ stdcall GetDeviceDriverBaseNameW(ptr ptr long)
|
@ stdcall GetDeviceDriverBaseNameW(ptr ptr long)
|
||||||
@ stdcall GetDeviceDriverFileNameA(ptr ptr long)
|
@ stdcall GetDeviceDriverFileNameA(ptr ptr long)
|
||||||
|
@ -178,55 +178,6 @@ BOOL WINAPI EnumPageFilesW( PENUM_PAGE_FILE_CALLBACKW callback, LPVOID context )
|
|||||||
return FALSE;
|
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.@)
|
* EnumProcessModules (PSAPI.@)
|
||||||
*
|
*
|
||||||
|
Loading…
x
Reference in New Issue
Block a user