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

Windows服务器
Windows Server 2003 R2 Beta 2将公测
Windows 2003组策略和安全模板的应用
Windows 2003 64位正式版抢先体验
微软发布WinServer2003 R2 Beta2
Windows Server 2003 安全配置实战演习
快速关闭Windows 2003的三种方法
windows 2003服务器防止海洋木马的安全设置
制作无盘Windows 2003之无忧Ghost文件
为Windows 2003加装视频压缩
安全配置向导为Win2003打造“铜墙铁壁”
用Win 2003 SP1向导功能打造安全服务器
在Win 2003系统中挖掘免费刻录软件
Windows 2003优化系列之系统服务的开关
发扬DIY精神 为Windows 2003移植系统还原
活学活用Win2003分区增容功能
轻松管理Win 2003的“远程桌面”
自动管理Windows 2003好用的“远程桌面”
活学活用Windows Server 2003分区增容功能
使用Web接口远程维护Win2003服务器
教你一招:Windows2003系统优化大有玄机

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


出处:互联网   整理: 软晨网(RuanChen.com)   发布: 2009-11-02   浏览: 37 ::
收藏到网摘: 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;        //分页池使用