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

Windows服务器
win2003 3389手工修改方法
windows2003 shtml支持设置方法
由于这台计算机没有终端服务器客户端访问许可证,远程会话被中断
Microsoft VBScript 运行时错误 错误 ''800a0046'' 没有权限
win2003 sp2 iis 上传文件不能超过200K的解决方案
win7 iis7.5 乱码 和 解析不了ASP的ADO连接数据库 的解决方法
让IIS支持Flv的详细设置方法
Win2003 服务器安全配置技巧
win2003 服务器安全设置教程(权限+防火墙)
win2003 服务器 安全设置 技术实例(比较安全的方法)
windows 服务器 目录 安全详细设置(PJblog 博客)
WinRAR 任务计划 免费定时备份
Windows7 apache启动失败的解决方法
Windows服务器SNMP服务的配置方法
Windows2008 AHCI功能开启方法(提升硬盘加速)
Windows2003 MSSQL 安全设置教程
IIS 服务器 防范攻击3条安全设置技巧
win2003 administrator 内置系统管理员账号名称修改方法
IP策略实现服务器禁止Ping
有史以来最好的windows 虚拟主机安全配置

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


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