首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> VC >> 關於VC++

Native API 探測 Windows 2000/XP/2003 系統資訊:NtQuerySystemInformation 深度解析

     編輯:關於VC++

前言

Windows 使用者模式下的 Native API 是 Win32 API 的底層支撐。微軟未公開文件化,但透過 NtQuerySystemInformation 可取得極豐富的系統資訊(進程、執行緒、記憶體、I/O、效能計數器等 50+ 類別)。本文整理核心結構與呼叫範例,僅供研究學習,生產環境請優先使用 Win32 API (PSAPI/ToolHelp32/WMI)。

函數原型

typedef NTSTATUS (__stdcall *NTQUERYSYSTEMINFORMATION)(
    IN SYSTEM_INFORMATION_CLASS SystemInformationClass,
    IN OUT PVOID SystemInformation,
    IN ULONG SystemInformationLength,
    OUT PULONG ReturnLength OPTIONAL
);

動態載入:GetProcAddress(GetModuleHandle("ntdll.dll"), "NtQuerySystemInformation")。

關鍵資訊類別與結構

1. 系統進程/執行緒資訊 (SystemProcessInformation = 5)


typedef struct _SYSTEM_PROCESSES {
    ULONG NextEntryDelta;        // 下一筆偏移
    ULONG ThreadCount;
    ULONG Reserved1[6];
    LARGE_INTEGER CreateTime;    // 建立時間
    LARGE_INTEGER UserTime;      // User-mode CPU 時間
    LARGE_INTEGER KernelTime;    // Kernel-mode CPU 時間
    UNICODE_STRING ProcessName;  // 進程名稱
    KPRIORITY BasePriority;
    ULONG ProcessId;
    ULONG InheritedFromProcessId; // 父進程 PID
    ULONG HandleCount;
    ULONG Reserved2[2];
    VM_COUNTERS VmCounters;      // 虛擬記憶體計數
    IO_COUNTERS IoCounters;      // I/O 計數
    SYSTEM_THREADS Threads[1];   // 執行緒陣列
} SYSTEM_PROCESSES, *PSYSTEM_PROCESSES;

typedef struct _SYSTEM_THREADS {
    LARGE_INTEGER KernelTime, UserTime, CreateTime;
    ULONG WaitTime;
    PVOID StartAddress;
    CLIENT_ID ClientId;
    KPRIORITY Priority, BasePriority;
    ULONG ContextSwitchCount;
    THREAD_STATE State;
    KWAIT_REASON WaitReason;
} SYSTEM_THREADS;

遍歷方式:依 NextEntryDelta 移動指標,直到為 0。

2. 系統效能資訊 (SystemPerformanceInformation = 2)

提供 70+ 效能計數器:IdleProcessTime、ReadOperationCount、PageFaultCount、CommitPages、PoolPagedBytes 等,適合自製工作管理員效能頁籤。

3. 其他常用類別

  • SystemMemoryInformation (5) — 記憶體總覽
  • SystemHandleInformation (16) — 系統控制碼表
  • SystemModuleInformation (11) — 載入驅動模組清單

呼叫範例:列舉所有進程


NTSTATUS status;
ULONG len = 0;
PVOID buf = NULL;

// 第一次呼叫取得所需緩衝區大小
status = NtQuerySystemInformation(SystemProcessInformation, NULL, 0, &len);
buf = VirtualAlloc(NULL, len, MEM_COMMIT, PAGE_READWRITE);
status = NtQuerySystemInformation(SystemProcessInformation, buf, len, NULL);

PSYSTEM_PROCESSES p = (PSYSTEM_PROCESSES)buf;
while (true) {
    wprintf(L"PID: %u  Name: %wZ  Threads: %u  Handles: %u\n",
        p->ProcessId, &p->ProcessName, p->ThreadCount, p->HandleCount);
    if (p->NextEntryDelta == 0) break;
    p = (PSYSTEM_PROCESSES)((BYTE*)p + p->NextEntryDelta);
}
VirtualFree(buf, 0, MEM_RELEASE);

風險提示

  • 結構定義可能隨 OS 版本變更(Win2K/XP/2003 差異較小,Vista 後大幅調整)
  • 未經文件化,微軟不保證相容性
  • 需連結 ntdll.lib 或動態載入

作者資訊

FZ5FZ 團隊,專注網路/系統安全研究與原創技術分享。

原始碼下載

完整 Demo 含進程/執行緒/模組/控制碼/記憶體/效能等多頁籤監控介面。

本文配套源碼

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved