輔助材料……原文地址:http://hi.baidu.com/ring3world/blog/item/3f0fb1dbf1fa0a65d0164eab.html
Native API乃Windows用戶模式中為上層Win32 API提供接口的本機(jī)系統(tǒng)服務(wù)。平常我們總是調(diào)用MS為我們提供的公用的Win32 API函數(shù)來實現(xiàn)來實現(xiàn)我們系統(tǒng)的功能。今天我們要談的是如何通過本機(jī)系統(tǒng)服務(wù)(Native API)來探測本機(jī)系統(tǒng)信息。當(dāng)然,微軟沒有為我們提供關(guān)于本機(jī)系統(tǒng)服務(wù)的文檔 (Undocumented),也就是不會為對它的使用提供任何的保證,所以我們不提倡使用Native API來開發(fā)軟件。不過在特殊情況下,本機(jī)系統(tǒng)服務(wù)卻為我們提供了通向“秘密”的捷徑。本文提到的信息僅在Windows2000/XP/2003上測試 過。
今天,我們主要討論的是一個函數(shù)NtQuerySystemInformation(ZwQuerySystemInformation)。當(dāng)然,你不要小看這么一個函數(shù),它卻為我們提供了豐富的系統(tǒng)信息,同時還包括對某些信息的控制和設(shè)置。以下是這個函數(shù)的原型:
typedef NTSTATUS (__stdcall *NTQUERYSYSTEMINFORMATION)
(IN SYSTEM_INFORMATION_CLASS SystemInformationClass,
IN OUT PVOID SystemInformation,
IN ULONG SystemInformationLength,
OUT PULONG ReturnLength OPTIONAL);
NTQUERYSYSTEMINFORMATION NtQuerySystemInformation;
NtQuerySystemInformation這個函數(shù)有四個參數(shù):
第一個參數(shù)是dwRecordType,這個參數(shù)指定了我們所查詢的系統(tǒng)信息類型,為了查詢系統(tǒng)HANDLE列表,我們定義一個常量#define NT_HANDLE_LIST 16(這個數(shù)值我是查資料得到的,如果誰有更詳細(xì)的資料,也請讓我共享一下)。
第二個參數(shù)是一個指針,這個指針用來返回系統(tǒng)句柄列表,在調(diào)用NtQuerySystemInformation函數(shù)之前,必須為這個指針分配足夠的內(nèi)存空間,否則函數(shù)調(diào)用會出錯。
第三個參數(shù)是指定你為HandleList所分配的內(nèi)存空間大小,單位是byte。
第四個參數(shù)是NtQuerySystemInformation返回的HandleList的大?。蝗绻鸑tQuerySystemInformation函數(shù)調(diào)用成功,返回值將是0,否則可以使用GetLastError()獲得詳細(xì)的錯誤代碼。
從中可以看到,SystemInformationClass是一個類型信息,它大概提供了50余種信息,也就是我們可以通過這個函數(shù)對大約50多種 的系統(tǒng)信息進(jìn)行探測或設(shè)置。SystemInformation是一個LPVOID型的指針,它為我們提供需要獲得的信息,或是我們需要設(shè)置的系統(tǒng)信息。 SystemInformationLength是SystemInformation的長度,它根據(jù)探測的信息類型來決定。至于 ReturnLength則是系統(tǒng)返回的需要的長度,通??梢栽O(shè)置為空指針(NULL)。
首先,我們來看看大家比較熟悉的系統(tǒng)進(jìn)程/線程相關(guān)的信息。這個題目在網(wǎng)上已經(jīng)討論了N多年了,所以我就不在老生常談了,呵呵。那么就提出這個結(jié)構(gòu)類型的定義:
typedef struct _SYSTEM_PROCESSES
{
ULONG NextEntryDelta; //構(gòu)成結(jié)構(gòu)序列的偏移量;
ULONG ThreadCount; //線程數(shù)目;
ULONG Reserved1[6];
LARGE_INTEGER CreateTime; //創(chuàng)建時間;
LARGE_INTEGER UserTime; //用戶模式(Ring 3)的CPU時間;
LARGE_INTEGER KernelTime; //內(nèi)核模式(Ring 0)的CPU時間;
UNICODE_STRING ProcessName; //進(jìn)程名稱;
KPRIORITY BasePriority; //進(jìn)程優(yōu)先權(quán);
ULONG ProcessId; //進(jìn)程標(biāo)識符;
ULONG InheritedFromProcessId; //父進(jìn)程的標(biāo)識符;
ULONG HandleCount; //句柄數(shù)目;
ULONG Reserved2[2];
VM_COUNTERS VmCounters; //虛擬存儲器的結(jié)構(gòu),見下;
IO_COUNTERS IoCounters; //IO計數(shù)結(jié)構(gòu),見下;
SYSTEM_THREADS Threads[1]; //進(jìn)程相關(guān)線程的結(jié)構(gòu)數(shù)組,見下;
}SYSTEM_PROCESSES,*PSYSTEM_PROCESSES;
typedef struct _SYSTEM_THREADS
{
LARGE_INTEGER KernelTime; //CPU內(nèi)核模式使用時間;
LARGE_INTEGER UserTime; //CPU用戶模式使用時間;
LARGE_INTEGER CreateTime; //線程創(chuàng)建時間;
ULONG WaitTime; //等待時間;
PVOID StartAddress; //線程開始的虛擬地址;
CLIENT_ID ClientId; //線程標(biāo)識符;
KPRIORITY Priority; //線程優(yōu)先級;
KPRIORITY BasePriority; //基本優(yōu)先級;
ULONG ContextSwitchCount; //環(huán)境切換數(shù)目;
THREAD_STATE State; //當(dāng)前狀態(tài);
KWAIT_REASON WaitReason; //等待原因;
}SYSTEM_THREADS,*PSYSTEM_THREADS;
typedef struct _VM_COUNTERS
{
ULONG PeakVirtualSize; //虛擬存儲峰值大小;
ULONG VirtualSize; //虛擬存儲大?。?br>ULONG PageFaultCount; //頁故障數(shù)目;
ULONG PeakWorkingSetSize; //工作集峰值大小;
ULONG WorkingSetSize; //工作集大?。?br>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讀操作數(shù)目;
LARGE_INTEGER WriteOperationCount; //I/O寫操作數(shù)目;
LARGE_INTEGER OtherOperationCount; //I/O其他操作數(shù)目;
LARGE_INTEGER ReadTransferCount; //I/O讀數(shù)據(jù)數(shù)目;
LARGE_INTEGER WriteTransferCount; //I/O寫數(shù)據(jù)數(shù)目;
LARGE_INTEGER OtherTransferCount; //I/O其他操作數(shù)據(jù)數(shù)目;
}IO_COUNTERS,*PIO_COUNTERS;
以上這些信息應(yīng)該是比較全面的了,在Win32 API里為我們提供了PSAPI(進(jìn)程狀態(tài))和ToolHelp32這兩種探測系統(tǒng)進(jìn)程/線程信息的方式,在Windows2K/XP/2003都支持它們。
現(xiàn)在,我們來看看系統(tǒng)的性能信息,性能結(jié)構(gòu)SYSTEM_PERFORMANCE_INFORMATION為我們提供了70余種系統(tǒng)性能方面的信息,真是太豐富了,請慢慢體會~
typedef struct _SYSTEM_PERFORMANCE_INFORMATION
{
LARGE_INTEGER IdleTime; //CPU空閑時間;
LARGE_INTEGER ReadTransferCount; //I/O讀操作數(shù)目;
LARGE_INTEGER WriteTransferCount; //I/O寫操作數(shù)目;
LARGE_INTEGER OtherTransferCount; //I/O其他操作數(shù)目;
ULONG ReadOperationCount; //I/O讀數(shù)據(jù)數(shù)目;
ULONG WriteOperationCount; //I/O寫數(shù)據(jù)數(shù)目;
ULONG OtherOperationCount; //I/O其他操作數(shù)據(jù)數(shù)目;
ULONG AvailablePages; //可獲得的頁數(shù)目;
ULONG TotalCommittedPages; //總共提交頁數(shù)目;
ULONG TotalCommitLimit; //已提交頁數(shù)目;
ULONG PeakCommitment; //頁提交峰值;
ULONG PageFaults; //頁故障數(shù)目;
ULONG WriteCopyFaults; //Copy-On-Write故障數(shù)目;
ULONG TransitionFaults; //軟頁故障數(shù)目;
ULONG Reserved1;
ULONG DemandZeroFaults; //需求0故障數(shù);
ULONG PagesRead; //讀頁數(shù)目;
ULONG PageReadIos; //讀頁I/O操作數(shù);
ULONG Reserved2[2];
ULONG PagefilePagesWritten; //已寫頁文件頁數(shù);
ULONG PagefilePageWriteIos; //已寫頁文件操作數(shù);
ULONG MappedFilePagesWritten; //已寫映射文件頁數(shù);
ULONG MappedFileWriteIos; //已寫映射文件操作數(shù);
ULONG PagedPoolUsage; //分頁池使用;
ULONG NonPagedPoolUsage; //非分頁池使用;
ULONG PagedPoolAllocs; //分頁池分配情況;
ULONG PagedPoolFrees; //分頁池釋放情況;
ULONG NonPagedPoolAllocs; //非分頁池分配情況;
ULONG NonPagedPoolFress; //非分頁池釋放情況;
ULONG TotalFreeSystemPtes; //系統(tǒng)頁表項釋放總數(shù);
ULONG SystemCodePage; //操作系統(tǒng)代碼頁數(shù);
ULONG TotalSystemDriverPages; //可分頁驅(qū)動程序頁數(shù);
ULONG TotalSystemCodePages; //操作系統(tǒng)代碼頁總數(shù);
ULONG SmallNonPagedLookasideListAllocateHits; //小非分頁側(cè)視列表分配次數(shù);
ULONG SmallPagedLookasideListAllocateHits; //小分頁側(cè)視列表分配次數(shù);
ULONG Reserved3;
ULONG MmSystemCachePage; //系統(tǒng)緩存頁數(shù);
ULONG PagedPoolPage; //分頁池頁數(shù);
ULONG SystemDriverPage; //可分頁驅(qū)動頁數(shù);
ULONG FastReadNoWait; //異步快速讀數(shù)目;
ULONG FastReadWait; //同步快速讀數(shù)目;
ULONG FastReadResourceMiss; //快速讀資源沖突數(shù);
ULONG FastReadNotPossible; //快速讀失敗數(shù);
ULONG FastMdlReadNoWait; //異步MDL快速讀數(shù)目;
ULONG FastMdlReadWait; //同步MDL快速讀數(shù)目;
ULONG FastMdlReadResourceMiss; //MDL讀資源沖突數(shù);
ULONG FastMdlReadNotPossible; //MDL讀失敗數(shù);
ULONG MapDataNoWait; //異步映射數(shù)據(jù)次數(shù);
ULONG MapDataWait; //同步映射數(shù)據(jù)次數(shù);
ULONG MapDataNoWaitMiss; //異步映射數(shù)據(jù)沖突次數(shù);
ULONG MapDataWaitMiss; //同步映射數(shù)據(jù)沖突次數(shù);
ULONG PinMappedDataCount; //牽制映射數(shù)據(jù)數(shù)目;
ULONG PinReadNoWait; //牽制異步讀數(shù)目;
ULONG PinReadWait; //牽制同步讀數(shù)目;
ULONG PinReadNoWaitMiss; //牽制異步讀沖突數(shù)目;
ULONG PinReadWaitMiss; //牽制同步讀沖突數(shù)目;
ULONG CopyReadNoWait; //異步拷貝讀次數(shù);
ULONG CopyReadWait; //同步拷貝讀次數(shù);
ULONG CopyReadNoWaitMiss; //異步拷貝讀故障次數(shù);
ULONG CopyReadWaitMiss; //同步拷貝讀故障次數(shù);
ULONG MdlReadNoWait; //異步MDL讀次數(shù);
ULONG MdlReadWait; //同步MDL讀次數(shù);
ULONG MdlReadNoWaitMiss; //異步MDL讀故障次數(shù);
ULONG MdlReadWaitMiss; //同步MDL讀故障次數(shù);
ULONG ReadAheadIos; //向前讀操作數(shù)目;
ULONG LazyWriteIos; //LAZY寫操作數(shù)目;
ULONG LazyWritePages; //LAZY寫頁文件數(shù)目;
ULONG DataFlushes; //緩存刷新次數(shù);
ULONG DataPages; //緩存刷新頁數(shù);
ULONG ContextSwitches; //環(huán)境切換數(shù)目;
ULONG FirstLevelTbFills; //第一層緩沖區(qū)填充次數(shù);
ULONG SecondLevelTbFills; //第二層緩沖區(qū)填充次數(shù);
ULONG SystemCall; //系統(tǒng)調(diào)用次數(shù);
}SYSTEM_PERFORMANCE_INFORMATION,*PSYSTEM_PERFORMANCE_INFORMATION;
現(xiàn)在看到的是結(jié)構(gòu)SYSTEM_PROCESSOR_TIMES提供的系統(tǒng)處理器的使用情況,包括各種情況下的使用時間及中斷數(shù)目:
typedef struct __SYSTEM_PROCESSOR_TIMES
{
LARGE_INTEGER IdleTime; //空閑時間;
LARGE_INTEGER KernelTime; //內(nèi)核模式時間;
LARGE_INTEGER UserTime; //用戶模式時間;
LARGE_INTEGER DpcTime; //延遲過程調(diào)用時間;
LARGE_INTEGER InterruptTime; //中斷時間;
ULONG InterruptCount; //中斷次數(shù);
}SYSTEM_PROCESSOR_TIMES,*PSYSTEM_PROCESSOR_TIMES;
頁文件的使用情況,SYSTEM_PAGEFILE_INFORMATION提供了所需的相關(guān)信息:
typedef struct _SYSTEM_PAGEFILE_INFORMATION
{
ULONG NetxEntryOffset; //下一個結(jié)構(gòu)的偏移量;
ULONG CurrentSize; //當(dāng)前頁文件大??;
ULONG TotalUsed; //當(dāng)前使用的頁文件數(shù);
ULONG PeakUsed; //當(dāng)前使用的頁文件峰值數(shù);
UNICODE_STRING FileName; //頁文件的文件名稱;
}SYSTEM_PAGEFILE_INFORMATION,*PSYSTEM_PAGEFILE_INFORMATION;
系統(tǒng)高速緩存的使用情況參見結(jié)構(gòu)SYSTEM_CACHE_INFORMATION提供的信息:
typedef struct _SYSTEM_CACHE_INFORMATION
{
ULONG SystemCacheWsSize; //高速緩存大??;
ULONG SystemCacheWsPeakSize; //高速緩存峰值大小;
ULONG SystemCacheWsFaults; //高速緩存頁故障數(shù)目;
ULONG SystemCacheWsMinimum; //高速緩存最小頁大小;
ULONG SystemCacheWsMaximum; //高速緩存最大頁大?。?br>ULONG TransitionSharedPages; //共享頁數(shù)目;
ULONG TransitionSharedPagesPeak; //共享頁峰值數(shù)目;
ULONG Reserved[2];
}SYSTEM_CACHE_INFORMATION,*PSYSTEM_CACHE_INFORMATION;