程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> VC >> 關於VC++ >> 探測Windows2K/XP/2003本機系統信息

探測Windows2K/XP/2003本機系統信息

編輯:關於VC++

Native API乃Windows用戶模式中為上層Win32 API提供接口的本機系統服務。平常我們總是調用MS為我們提供的公用的Win32 API函數來實現來實現我們系統的功能。(PS:前不久,偶寫了一個Windows任務管理器,支持對桌面,進程/線程,系統性能,磁盤,環境變量,事件日志,網絡,設備驅動,Win32服務,共享,用戶,系統及關機等信息的探測和控制,完全基於Win32 API,大家可以到我們的主頁下載)。今天我們要談的是如何通過本機系統服務(Native API)來探測本機系統信息。當然,微軟沒有為我們提供關於本機系統服務的文檔(Undocumented),也就是不會為對它的使用提供任何的保證,所以我們不提倡使用Native API來開發軟件。不過在特殊情況下,本機系統服務卻為我們提供了通向“秘密”的捷徑。本文提到的信息僅在Windows2000/XP/2003上測試過。

今天,我們主要討論的是一個函數NtQuerySystemInformation(ZwQuerySystemInformation)。當然,你不要小看這麼一個函數,它卻為我們提供了豐富的系統信息,同時還包括對某些信息的控制和設置。以下是這個函數的原型:

typedef NTSTATUS (__stdcall *NTQUERYSYSTEMINFORMATION)
(IN   SYSTEM_INFORMATION_CLASS SystemInformationClass,
IN OUT PVOID          SystemInformation,
IN   ULONG          SystemInformationLength,
OUT   PULONG          ReturnLength OPTIONAL);
NTQUERYSYSTEMINFORMATION NtQuerySystemInformation;
從中可以看到,SystemInformationClass是一個類型信息,它大概提供了50余種信息,也就是我們可以通過這個函數對大約50多種的系統信息進行探測或設置。SystemInformation是一個LPVOID型的指針,它為我們提供需要獲得的信息,或是我們需要設置的系統信息。SystemInformationLength是SystemInformation的長度,它根據探測的信息類型來決定。至於ReturnLength則是系統返回的需要的長度,通常可以設置為空指針(NULL)。

 

首先,我們來看看大家比較熟悉的系統進程/線程相關的信息。這個題目在網上已經討論了N多年了,所以我就不在老生常談了,呵呵。那麼就提出這個結構類型的定義:typedef struct _SYSTEM_PROCESSES
{
  ULONG     NextEntryDelta;     //構成結構序列的偏移量;
  ULONG     ThreadCount;       //線程數目;
  ULONG     Reserved1[6];
  LARGE_INTEGER CreateTime;       //創建時間;
  LARGE_INTEGER UserTime;        //用戶模式(Ring 3)的CPU時間;
  LARGE_INTEGER KernelTime;       //內核模式(Ring 0)的CPU時間;
  UNICODE_STRING ProcessName;       //進程名稱;
  KPRIORITY   BasePriority;      //進程優先權;
  ULONG     ProcessId;        //進程標識符;
  ULONG     InheritedFromProcessId; //父進程的標識符;
  ULONG     HandleCount;       //句柄數目;
  ULONG     Reserved2[2];
  VM_COUNTERS  VmCounters;       //虛擬存儲器的結構,見下;
  IO_COUNTERS  IoCounters;       //IO計數結構,見下;
  SYSTEM_THREADS Threads[1];       //進程相關線程的結構數組,見下;
}SYSTEM_PROCESSES,*PSYSTEM_PROCESSES;
typedef struct _SYSTEM_THREADS
{
  LARGE_INTEGER KernelTime;        //CPU內核模式使用時間;
  LARGE_INTEGER UserTime;         //CPU用戶模式使用時間;
  LARGE_INTEGER CreateTime;        //線程創建時間;
  ULONG     WaitTime;         //等待時間;
  PVOID     StartAddress;       //線程開始的虛擬地址;
  CLIENT_ID   ClientId;         //線程標識符;
  KPRIORITY   Priority;         //線程優先級;
  KPRIORITY   BasePriority;       //基本優先級;
  ULONG     ContextSwitchCount;    //環境切換數目;
  THREAD_STATE State;          //當前狀態;
  KWAIT_REASON WaitReason;        //等待原因;
}SYSTEM_THREADS,*PSYSTEM_THREADS;
typedef struct _VM_COUNTERS
{
  ULONG PeakVirtualSize;         //虛擬存儲峰值大小;
  ULONG VirtualSize;           //虛擬存儲大小;
  ULONG PageFaultCount;          //頁故障數目;
  ULONG PeakWorkingSetSize;        //工作集峰值大小;
  ULONG WorkingSetSize;          //工作集大小;
  ULONG QuotaPeakPagedPoolUsage;     //分頁池使用配額峰值;
  ULONG QuotaPagedPoolUsage;       //分頁池使用配額;
  ULONG QuotaPeakNonPagedPoolUsage;    //非分頁池使用配額峰值;
  ULONG QuotaNonPagedPoolUsage;      //非分頁池使用配額;
  ULONG PagefileUsage;          //頁文件使用情況;
  ULONG PeakPagefileUsage;        //頁文件使用峰值;
}VM_COUNTERS,*PVM_COUNTERS;
typedef struct _IO_COUNTERS
{
  LARGE_INTEGER ReadOperationCount;    //I/O讀操作數目;
  LARGE_INTEGER WriteOperationCount;   //I/O寫操作數目;
  LARGE_INTEGER OtherOperationCount;   //I/O其他操作數目;
  LARGE_INTEGER ReadTransferCount;    //I/O讀數據數目;
  LARGE_INTEGER WriteTransferCount;    //I/O寫數據數目;
  LARGE_INTEGER OtherTransferCount;    //I/O其他操作數據數目;
}IO_COUNTERS,*PIO_COUNTERS;
以上這些信息應該是比較全面的了,在Win32 API裡為我們提供了PSAPI(進程狀態)和ToolHelp32這兩種探測系統進程/線程信息的方式,在Windows2K/XP/2003都支持它們。

現在,我們來看看系統的性能信息,性能結構SYSTEM_PERFORMANCE_INFORMATION為我們提供了70余種系統性能方面的信息,真是太豐富了,請慢慢體會~

關於作者:

FZ5FZ,我們主要從事網絡/系統安全的學習與研究,深入編程技術的剖析與探討,堅持原創,追求共享。

本文配套源碼

  1. 上一頁:
  2. 下一頁:
欄目導航
Copyright © 程式師世界 All Rights Reserved