1
0
mirror of https://github.com/rbmm/SC synced 2026-06-08 17:03:41 +00:00
Files
rbmm 5d262174b1 ++
2025-02-02 01:53:40 +02:00

206 lines
3.7 KiB
C++

#include "stdafx.h"
#include "print.h"
#define TSN(r) case r: return #r
PCSTR GetThreadWaitReason(KWAIT_REASON wr, PSTR buf, ULONG cch)
{
switch (wr)
{
TSN(Executive);
TSN(FreePage);
TSN(PageIn);
TSN(PoolAllocation);
TSN(DelayExecution);
TSN(Suspended);
TSN(UserRequest);
TSN(WrExecutive);
TSN(WrFreePage);
TSN(WrPageIn);
TSN(WrPoolAllocation);
TSN(WrDelayExecution);
TSN(WrSuspended);
TSN(WrUserRequest);
TSN(WrEventPair); //WrSpare0
TSN(WrQueue);
TSN(WrLpcReceive);
TSN(WrLpcReply);
TSN(WrVirtualMemory);
TSN(WrPageOut);
TSN(WrRendezvous);
TSN(WrKeyedEvent);
TSN(WrTerminated);
TSN(WrProcessInSwap);
TSN(WrCpuRateControl);
TSN(WrCalloutStack);
TSN(WrKernel);
TSN(WrResource);
TSN(WrPushLock);
TSN(WrMutex);
TSN(WrQuantumEnd);
TSN(WrDispatchInt);
TSN(WrPreempted);
TSN(WrYieldExecution);
TSN(WrFastMutex);
TSN(WrGuardedMutex);
TSN(WrRundown);
TSN(WrAlertByThreadId);
TSN(WrDeferredPreempt);
TSN(WrPhysicalFault);
TSN(WrIoRing);
TSN(WrMdlCache);
}
sprintf_s(buf, cch, "[%x]", wr);
return buf;
}
PCSTR GetThreadStateName(KTHREAD_STATE st, PSTR buf, ULONG cch)
{
switch (st)
{
TSN(Initialized);
TSN(Ready);
TSN(Running);
TSN(Standby);
TSN(Terminated);
TSN(Waiting);
TSN(Transition);
TSN(DeferredReady);
TSN(GateWaitObsolete);
TSN(WaitingForProcessInSwap);
}
sprintf_s(buf, cch, "[%x]", st);
return buf;
}
/*
* List all running processes (name + pid)
*/
NTSTATUS List_all_running_processes()
{
NTSTATUS status;
ULONG cb = 0x40000;
do
{
status = STATUS_INSUFFICIENT_RESOURCES;
if (PVOID buf = new BYTE[cb += PAGE_SIZE])
{
if (0 <= (status = NtQuerySystemInformation(SystemProcessInformation, buf, cb, &cb)))
{
union {
PVOID pv;
PBYTE pb;
PSYSTEM_PROCESS_INFORMATION pspi;
};
pv = buf;
ULONG NextEntryOffset = 0, i = 0;
do
{
pb += NextEntryOffset;
DbgPrint("%x: %x(%x) [%x] %x \"%wZ\"\r\n", i++,
pspi->UniqueProcessId,
pspi->InheritedFromUniqueProcessId,
pspi->SessionId,
pspi->NumberOfThreads,
pspi->ImageName);
} while (NextEntryOffset = pspi->NextEntryOffset);
}
delete [] (buf);
}
} while(status == STATUS_INFO_LENGTH_MISMATCH);
return status;
}
NTSTATUS DumpProcessThreads(ULONG_PTR dwProcessId)
{
NTSTATUS status;
ULONG cb = 0x40000;
do
{
status = STATUS_INSUFFICIENT_RESOURCES;
if (PVOID buf = new BYTE[cb += PAGE_SIZE])
{
if (0 <= (status = NtQuerySystemInformation(SystemExtendedProcessInformation, buf, cb, &cb)))
{
status = STATUS_NOT_FOUND;
union {
PVOID pv;
PBYTE pb;
PSYSTEM_PROCESS_INFORMATION pspi;
};
pv = buf;
ULONG NextEntryOffset = 0;
do
{
pb += NextEntryOffset;
if ((HANDLE)dwProcessId == pspi->UniqueProcessId)
{
ULONG NumberOfThreads = pspi->NumberOfThreads;
DbgPrint("PID=%u NumberOfThreads=%u\r\n", dwProcessId, NumberOfThreads);
status = STATUS_SUCCESS;
if (NumberOfThreads)
{
PSYSTEM_EXTENDED_THREAD_INFORMATION TH = pspi->Threads;
do
{
char sz[16];
DbgPrint("%x: %p %p %hs\r\n",
TH->ClientId.UniqueThread,
TH->TebBase,
TH->Win32StartAddress,
Waiting == TH->ThreadState
? GetThreadWaitReason(TH->WaitReason, sz, _countof(sz))
: GetThreadStateName(TH->ThreadState, sz, _countof(sz))
);
} while (TH++, --NumberOfThreads);
}
break;
}
} while (NextEntryOffset = pspi->NextEntryOffset);
}
delete [] (buf);
}
} while(status == STATUS_INFO_LENGTH_MISMATCH);
DbgPrint("DumpProcessThreads(%u)=%x\r\n", dwProcessId, status);
if (status)
{
PrintError(HRESULT_FROM_NT(status));
}
return status;
}