typedef NTSTATUS (__stdcall *NTQUERYSYSTEMINFORMATION)
(
IN SYSTEM_INFORMATION_CLASS SystemInformationClass,
IN OUT PVOID SystemInformation,
IN ULONG SystemInformationLength,
OUT PULONG ReturnLength OPTIONAL
);NTQUERYSYSTEMINFORMATION NtQuerySystemInformation;
这个参数最终根据需要取得的信息而变,表示要获取的系统信息, 包括下面的值:
1)SystemBasicInformation:在SYSTEM_BASIC_INFORMATION结构体中返回处理器的数量,用GetSystemInfo函数代替
2)SystemExceptionInformation:返回不透明(opaque)SYSTEM_EXCEPTION_INFORMATION结构体用来产生随机数生成器的不确定种子。用CryptGenRandom函数代替
3)SystemInterruptInformation:返回不透明(opaque)SYSTEM_INTERRUPT_INFORMATION结构体用来产生随机数生成器的不确定种子。用CryptGenRandom函数代替
4)SystemLookasideInformation:返回不透明(opaque)SYSTEM_LOOKASIDE_INFORMATION结构体用来产生随机数生成器的不确定种子。用CryptGenRandom函数代替
5)SystemPerformanceInformation:返回不透明SYSTEM_PERFORMANCE_INFORMATION结构体用来产生随机数生成器的不确定种子。用CryptGenRandom函数代替
6)SystemProcessInformation:返回SYSTEM_PROCESS_INFORMATION结构体数组,每组包含系统中运行的一个进程的信息。这个结构体包括每个进程资源使用信息,包括进程使用的句柄数、页-文件使用峰值,以及内存分配的内存页的数量。
7)SystemProcessorPerformanceInformation:返回
SYSTEM_PROCESSOR_PERFORMANCE_INFORMATION结构体数组,每组包含系统中已安装的一个进程处理器。
8)SystemQueryPerformanceCounterInformation:返回
SYSTEM_QUERY_PERFORMANCE_COUNTER_INFORMATION结构体,通过
QueryPerformanceCounter函数的调用来确定系统是否需要一个内核过渡检测高分辨率性能计数器信息
9)SystemRegistryQuotaInformation:返回SYSTEM_REGISTRY_QUOTA_INFORMATION结构体
10)SystemTimeOfDayInformation:返回不透明(opaque)
SYSTEM_TIMEOFDAY_INFORMATION结构体用来产生随机数生成器的不确定种子。用CryptGenRandom函数代替
这个参数指向接收取来的信息的缓存结构,它的大小和结构体的信息取决于SystemInformationClass 参数的值:
如果SystemInformationClass 参数的值为 SystemBasicInformation,被SystemInformation 参数指向的缓冲区大小应该足够包含单个如下格式的SYSTEM_BASIC_INFORMATION结构体:
typedef struct _SYSTEM_BASIC_INFORMATION {
BYTE Reserved1[24];
PVOID Reserved2[4];
CCHAR NumberOfProcessors;
} SYSTEM_BASIC_INFORMATION;
NumberOfProcessors 变量的值为当前系统中处理器的数量。用GetSystemInfo 函数代替获取这个信息.结构体中的其他参数被操作系统作为内部应用保留了。
如果SystemInformationClass 参数的值为SystemExceptionInformation,SystemInformation参数所指的缓冲区大小应该足够存放一个SYSTEM_EXCEPTION_INFORMATION 结构体的内容,这些内容用来为随机数生成器产生不确定的种子。为了达到这个目的,结构体具有如下格式:
typedef struct _SYSTEM_EXCEPTION_INFORMATION {
BYTE Reserved1[16];
} SYSTEM_EXCEPTION_INFORMATION;
结构体的成员被操作系统保留以做内部使用。用CryptGenRandom函数代替来生成加密的随机数据
如果SystemInformationClass参数的值为SystemInterruptInformation,被SystemInformation参数指向的缓冲区的大小应该足够保存和SYSTEM_INTERRUPT_INFORMATION 结构体一样多的数组,数组中有系统中已经安装的所有处理器。每个结构体或者数组作为一个整体,可以被用来为随机数生成器产生一个不可预知的种子。 为了达到这个目的,该结构体具有如下格式:
typedef struct _SYSTEM_INTERRUPT_INFORMATION {
BYTE Reserved1[24];
} SYSTEM_INTERRUPT_INFORMATION;
结构体中的每个变量被操作系统保留以做内部应用。用CryptGenRandom函数代替来产生加密的随机数据。
如果SystemInformationClass参数的值为SystemLookasideInformation,被SystemInformation 参数指向的缓冲区大小应该足够容纳 SYSTEM_LOOKASIDE_INFORMATION 结构体的内容。该结构体用来为随机数生成器产生一个不可预知的种子。 为了达到这个目的,该结构体具有如下格式:
typedef struct _SYSTEM_LOOKASIDE_INFORMATION {
BYTE Reserved1[32];
} SYSTEM_LOOKASIDE_INFORMATION;
结构体中的每个变量被操作系统保留以做内部应用。用CryptGenRandom函数代替来产生加密的随机数据。
如果SystemInformationClass参数的值为SystemPerformanceInformation,被SystemInformation 参数指向的缓冲区大小应该足够容纳包含尽可能多的SYSTEM_PERFORMANCE_INFORMATION结构体信息的数组。该结构体用来为随机数生成器产生一个不可预知的种子。为了达到这个目的,该结构体具有如下格式:
typedef struct _SYSTEM_PERFORMANCE_INFORMATION {
BYTE Reserved1[312];
} SYSTEM_PERFORMANCE_INFORMATION;
结构体中的每个变量被操作系统保留以做内部应用。用CryptGenRandom函数代替来产生加密的随机数据。
如果SystemInformationClass参数的值为SystemProcessInformation,被SystemInformation 参数指向的缓冲区应该足够容纳这样的一个数组,该数组包含尽可能多的SYSTEM_PROCESS_INFORMATION结构体信息,该结构体包含系统中正在运行进程。每个结构体都有如下格式:
typedef struct _SYSTEM_PROCESS_INFORMATION {
ULONG NextEntryOffset;
BYTE Reserved1[52];
PVOID Reserved2[3];
HANDLE UniqueProcessId;
PVOID Reserved3;
ULONG HandleCount;
BYTE Reserved4[4];
PVOID Reserved5[11];
SIZE_T PeakPagefileUsage;
SIZE_T PrivatePageCount;
LARGE_INTEGER Reserved6[6];
} SYSTEM_PROCESS_INFORMATION;
数组下一项的起始位置为当前项的地址加上为NextEntryOffset 成员的值。数组中最后一项,NextEntryOffset值为0。
HandleCount 成员值为请求中被进程正在使用的所有的句柄数量; 用 GetProcessHandleCount 函数替代获取该信息。
PeakPagefileUsage 成员包含进程占用的页-文件存储的字节的最大值,并且PrivatePageCount 成员包含相应进程被分配的内存页数。你可以通过GetProcessMemoryInfo函数或Win32_Process类来获取这些信息。
结构体中的其他成员被操作系统保留作为内部应用。
如果SystemInformationClass参数的值为SystemProcessInformation,被SystemInformation参数指向的缓冲区应该足够容纳这样的一个数组,这个数组包含尽可能多的SYSTEM_PROCESSOR_PERFORMANCE_INFORMATION结构体信息,而该结构体包含系统中已安装的处理器(CPUs)。每个结构体都有如下格式:
typedef struct
_SYSTEM_PROCESSOR_PERFORMANCE_INFORMATION {
LARGE_INTEGER IdleTime;
LARGE_INTEGER KernelTime;
LARGE_INTEGER UserTime;
LARGE_INTEGER Reserved1[2];
ULONG Reserved2;
} SYSTEM_PROCESSOR_PERFORMANCE_INFORMATION;
IdleTime 成员包含大量系统处于空闲状态的时间,间隔100纳秒(十亿分之一秒).
KernelTime 成员包含大量系统运行在内核模式(包括所有处理器上的所有进程的所有线程)的时间, 间隔100纳秒。
UserTime 成员包含大量系统运行在用户模式(包括所有处理器上的所有进程的所有线程)的时间,间隔100纳秒。
用GetSystemTimes 函数代替获取这些信息。
如果SystemInformationClass参数的值为SystemQueryPerformanceCounterInformation,被SystemInformation参数指向的缓冲区应该足够容纳单个具有如下格式的SYSTEM_QUERY_PERFORMANCE_COUNTER_INFORMATION结构体:
typedef struct _SYSTEM_QUERY_PERFORMANCE_COUNTER_INFORMATION {
ULONG Version;
QUERY_PERFORMANCE_COUNTER_FLAGS Flags;
QUERY_PERFORMANCE_COUNTER_FLAGS ValidFlags;
} SYSTEM_QUERY_PERFORMANCE_COUNTER_INFORMATION;
Flags和ValidFlags 成员属于QUERY_PERFORMANCE_COUNTER_FLAGS 结构体,该结构体格式如下:
typedef struct _QUERY_PERFORMANCE_COUNTER_FLAGS {
union {
struct {
ULONG KernelTransition:1;
ULONG Reserved:31;
};
ULONG ul;
};
} QUERY_PERFORMANCE_COUNTER_FLAGS;
SYSTEM_QUERY_PERFORMANCE_COUNTER_INFORMATION 结构体的ValidFlags 成员指明Flags 成员哪个字节包含有效信息。当请求内核转换时,KernelTransition 字节在ValidFlags和Flags中都被设置. 若没有请求内核转换,则KernelTransition 字节在ValidFlags 中进行设置而Flags中被清除。
如果SystemInformationClass参数的值为SystemRegistryQuotaInformation,被SystemInformation 参数指向的缓冲区大小应该足够容纳具有如下格式的单个 SYSTEM_REGISTRY_QUOTA_INFORMATION结构体。
typedef struct _SYSTEM_REGISTRY_QUOTA_INFORMATION {
ULONG RegistryQuotaAllowed;
ULONG RegistryQuotaUsed;
PVOID Reserved1;
} SYSTEM_REGISTRY_QUOTA_INFORMATION;
RegistryQuotaAllowed 成员为注册表在本系统中可获得的最大值,单位为字节(bytes)
RegistryQuotaUsed 成员为注册表当前大小,单位为字节(bytes)
用 GetSystemRegistryQuota 函数代替获取这些信息。结构体中的其他成员被操作系统保留作为内部应用。
如果SystemInformationClass参数的值为SystemTimeOfDayInformation,被SystemInformation 参数指向的缓冲区大小应该足够容纳SYSTEM_TIMEOFDAY_INFORMATION结构体,该结构体为随机数生成器产生不可预知的种子。为此,该结构体具有如下格式:
typedef struct _SYSTEM_TIMEOFDAY_INFORMATION {
BYTE Reserved1[48];
} SYSTEM_TIMEOFDAY_INFORMATION;
结构体的每个成员被操作系统保留用于内部应用。
用CryptGenRandom 函数代替产生加密的随机数据。
指出SystemInformation指向的缓存结构的大小
可选的指针指向实际返回的数据的大小。如果这个值小于或等于SystemInformationLength参数,此函数将信息拷贝到 SystemInformation 缓冲区;否则,就返回一个NTSTATUS 错误代码并且返回接收请求信息的必要的缓冲区大小到 ReturnLength 中。
返回一个NTSTATUS成功或失败代码。NTSTATUS错误代码的形式和意义在DDK的Ntstatus.h头文件中已列出,且在DDK文档中进行了描述.
NtQuerySystemInformation函数和它返回的结构体属于操作系统内部信息,和windows发布版本的变更主题或标志。为了保持应用程序的兼容性,最好用先前提到的可替换函数来代替。
如果你必须使用NtQuerySystemInformation,通过运行时的动态链接来获取该函数,这样的话当该函数在操作系统中被更改或移除时,你的代码有机会响应的更好。鲜明改变也可能不被发现。
这个功能没有与导入库联系。你必须用LoadLibrary 和 GetProcAddress 函数来动态链接到Ntdll.dll动态库。
头文件:Winternl.h
动态库:Ntdll.dll
GetSystemInfo
GetProcessHandleCount
GetProcessMemoryInfo
GetSystemTimes
GetSystemRegistryQuota