当前位置: 首页 > 图文教程 > 服务器 > Windows服务器 > 探测Win2K/XP/2003本机系统信息

Windows服务器
实例讲解Windows 2003分区增容功能
WIN2003服务器端安全配置的一点简单经验
Windows 2003中快速建立ADSL拨号
远程如何修改Windows 2003系统机器名
微软揭示Windows 2003 R2关键性技术
Windows Server 2003组策略排障六法
感受Windows 2003 SP1安全配置向导功能
微软测试Windows Server 2003集群版
Win 2003系统传真功能的配置及使用
巧用Win 2003构筑校园网服务器防火墙
抢先看!WinServer 2003 R2 RTM发布
九招Windows 2003系统设置小技巧
巧施妙计—突破Win 2003系统的种种限制
巧妙启用Windows 2003的远程桌面功能
部署Windows Server 2003终端服务
在Win2003配置DNS的Internet访问
Windows 2003下提高FSO的安全性
Windows Server 2003 SP1 今日发布
微软将在HEC上发布Windows 2003 64-bit
快下载!值得装Windows 2003 SP1三大原因

Windows服务器 中的 探测Win2K/XP/2003本机系统信息


出处:互联网   整理: 软晨网(RuanChen.com)   发布: 2009-11-02   浏览: 38 ::
收藏到网摘: n/a

    Native API乃Windows用户模式中为上层Win32 API提供接口的本机系统服务。平常我们总是调用MS为我们提供的公用的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;        //分页池使用