1. 程式人生 > >NtQuerySystemInformation 遍歷進程

NtQuerySystemInformation 遍歷進程

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 遍歷進程