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

Windows服务器
Windows 2000系统Ping不通 缓存在作怪
Windows 2000中如何突破注册表容量限制
浅析Windows 2000系统中的关机技巧
Windows 2000/XP安装驱动的兼容问题
在Windows 2000系统下共享ADSL的办法
时尚 让Win2k也用上XP绚丽主题
领先在起点—Win 2000操作系统的启动优化
Windows 2000 Server系统帐号安全设置技巧
轻松给Windows 2000搭建邮件服务器
让你的Windows 2000安全些,再安全些
详述Windows 2000日志及其删除方法
轻松取消Windows 2000默认共享
浅析Windows 2000操作系统中的关机技巧
更改Windows 2000系统收藏夹位置的方法
Windows操作系统的十则高级应用技巧
关于windows 2000各种服务的简要说明
Windows 2000操作系统内存优化全攻略
让Windows 2000服务运行得更好
Windows 2000操作技巧完全手册(上)
Windows 2000操作技巧完全手册(下)

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


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