https://blog.youkuaiyun.com/suppercoder/article/details/9341941 这是一篇介绍分别在Ring0 和 Ring3 下是使用ZwQuerySystemInformation 函数来获取一些系统信息的函数。比如可以获取进程表和句柄表。可以参考看看。
//声明ZwQueryAyatemInformation
NTSTATUS ZwQuerySystemInformation(
IN ULONG SystemInformationClass, //处理进程信息,只需要处理类别为5的即可
OUT PVOID SystemInformation,
IN ULONG SystemInformationLength,
OUT PULONG ReturnLength
);
由函数中 IN OUT 即可知哪些是输入参数哪些是输出参数,
第一个参数 由字面意思即 系统信息类别,我们这里只关心进程信息(其宏定义为5),
第二个参数 存储返回结果信息的缓冲区
第三个参数 是 第二个缓冲区的大小
第四个参数是 实际返回消息的大小
下面给出ZwQuerySystemInformation 使用代码,以及注释。
#include "stdafx.h"
#include <windows.h>
#include <intrin.h>
#define STATUS_INFO_LENGTH_MISMATCH 0xc0000004 // 一个报错返回值。
#define nullptr NULL
/*
* 下面是一个枚举结构,每一个枚举值对应一类系统信息,
* 比如 SystemPerformanceInformation 代表所有的进程信息。
*/
typedef enum _SYSTEM_INFORMATION_CLASS // Q S
{
SystemBasicInformation, // 00 Y N
SystemProcessorInformation, // 01 Y N
SystemPerformanceInformation, // 02 Y N
SystemTimeOfDayInformation, // 03 Y N
SystemNotImplemented1, // 04 Y N
SystemProcessesAndThreadsInformation, // 05 Y N
SystemCallCounts, // 06 Y N
SystemConfigurationInformation, // 07 Y N
SystemProcessorTimes, // 08 Y N
SystemGlobalFlag, // 09 Y Y
SystemNotImplemented2, // 10 Y N
SystemModuleInformation, // 11 Y N
SystemLockInformation, // 12 Y N
SystemNotImplemented3,