NtQuerySystemInformation 遍歷進程
阿新 • • 發佈:2018-03-21
win 遍歷進程
// ConsoleApplication1.cpp : 定義控制臺應用程序的入口點。
//
#include "stdafx.h"
#include <windows.h>
// 線程狀態的枚舉常量
typedef enum _THREAD_STATE
{
StateInitialized, // 初始化狀態
StateReady, // 準備狀態
StateRunning, // 運行狀態
StateStandby, //
StateTerminated,//關閉
StateWait, // 等待
StateTransition, // 切換???
StateUnknown
}THREAD_STATE;
// 線程處於等待的原因的枚舉常量
typedef enum _KWAIT_REASON
{
Executive,
FreePage,
PageIn,
PoolAllocation,
DelayExecution,
Suspended,
UserRequest,
WrExecutive,
WrFreePage,
WrPageIn,
WrPoolAllocation,
WrDelayExecution,
WrSuspended,
WrUserRequest,
WrEventPair,
WrQueue,
WrLpcReceive,
WrLpcReply,
WrVirtualMemory,
WrPageOut,
WrRendezvous,
Spare2,
Spare3,
Spare4,
Spare5,
Spare6,
WrKernel,
MaximumWaitReason
}KWAIT_REASON;
typedef LONG NTSTATUS;
typedef LONG KPRIORITY;
typedef struct _CLIENT_ID
{
DWORD UniqueProcess;
DWORD UniqueThread;
} CLIENT_ID, *PCLIENT_ID;
typedef struct _VM_COUNTERS
{
SIZE_T PeakVirtualSize;
SIZE_T VirtualSize;
ULONG PageFaultCount;
SIZE_T PeakWorkingSetSize;
SIZE_T WorkingSetSize;
SIZE_T QuotaPeakPagedPoolUsage;
SIZE_T QuotaPagedPoolUsage;
SIZE_T QuotaPeakNonPagedPoolUsage;
SIZE_T QuotaNonPagedPoolUsage;
SIZE_T PagefileUsage;
SIZE_T PeakPagefileUsage;
} VM_COUNTERS;
// 線程信息結構體
typedef struct _SYSTEM_THREAD_INFORMATION
{
LARGE_INTEGER KernelTime;
LARGE_INTEGER UserTime;
LARGE_INTEGER CreateTime;
ULONG WaitTime;
PVOID StartAddress;
CLIENT_ID ClientId;
KPRIORITY Priority;
KPRIORITY BasePriority;
ULONG ContextSwitchCount;
LONG State;// 狀態,是THREAD_STATE枚舉類型中的一個值
LONG WaitReason;//等待原因, KWAIT_REASON中的一個值
} SYSTEM_THREAD_INFORMATION, *PSYSTEM_THREAD_INFORMATION;
typedef struct _UNICODE_STRING
{
USHORT Length;
USHORT MaximumLength;
PWSTR Buffer;
} UNICODE_STRING, *PUNICODE_STRING;
// 進程信息結構體
typedef struct _SYSTEM_PROCESS_INFORMATION
{
ULONG NextEntryDelta; // 指向下一個結構體的指針
ULONG ThreadCount; // 本進程的總線程數
ULONG Reserved1[6]; // 保留
LARGE_INTEGER CreateTime; // 進程的創建時間
LARGE_INTEGER UserTime; // 在用戶層的使用時間
LARGE_INTEGER KernelTime; // 在內核層的使用時間
UNICODE_STRING ProcessName; // 進程名
KPRIORITY BasePriority; //
ULONG ProcessId; // 進程ID
ULONG InheritedFromProcessId;
ULONG HandleCount; // 進程的句柄總數
ULONG Reserved2[2]; // 保留
VM_COUNTERS VmCounters;
IO_COUNTERS IoCounters;
SYSTEM_THREAD_INFORMATION Threads[5]; // 子線程信息數組
}SYSTEM_PROCESS_INFORMATION, *PSYSTEM_PROCESS_INFORMATION;
int main()
{
typedef long (_stdcall*FUN)
(
UINT SystemInformationClass,
PVOID SystemInformation,
ULONG SystemInformationLength,
PULONG ReturnLength
);
FUN fun;
HMODULE hNtDll= LoadLibrary(L"Ntdll.dll");
fun=(FUN)GetProcAddress(hNtDll,"NtQuerySystemInformation");
ULONG dwNeedSize = 0;
int status = fun(5, NULL, 0, &dwNeedSize);
BYTE *buf = new BYTE[dwNeedSize];
PSYSTEM_PROCESS_INFORMATION p = (PSYSTEM_PROCESS_INFORMATION)buf;
status = fun(5, (PVOID)buf, dwNeedSize, NULL);
do
{
printf("%d %S\n", p->ProcessId, p->ProcessName.Buffer);
p=(PSYSTEM_PROCESS_INFORMATION)(((PUCHAR)p) + p->NextEntryDelta);
} while (p->NextEntryDelta != 0);
return 0;
}
NtQuerySystemInformation 遍歷進程