函数ZwQuerySystemInformation小结

该函数存在于NTDLL.DLL动态链接库中。NTDLL.DLL负责ring3与ring0之间的通信。当使用子系统方式进行系统调用的时候,ntdll.dll和SSDT会配合使用。关于SSDT技术以后会讲解到。

关于ZwQuerySystemInformation这个函数可以用来查询进程信息、内核信息、硬件信息(例如CPU数目)、句柄信息、时间信息等54个系统信息。

该函数的原型是

NTSTATUS WINAPI ZwQuerySystemInformation(

__in          SYSTEM_INFORMATION_CLASSSystemInformationClass,

__in_out     PVOIDSystemInformation,

__in          ULONGSystemInformationLength,

__out_opt    PULONGReturnLength

);

至于第一个参数SYSTEM_INFORMATION_CLASS是一个枚举结构。枚举了所有的54个系统信息。该结构在最后将会列举出来。

一、用户模式下的ZwQuerySystemInformation

在用户模式下必须用LoadLibrary与GetProcAddress来获取该函数地址。

代码如下,先声明一个函数。

typedef NTSTATUS (WINAPI *NTQUERYSYSTEMINFORMATION)(INSYSTEM_INFORMATION_CLASS,IN OUT PVOID,INULONG,OUTPULONG);

加载NTDLL.DLL,获取函数地址。

NTQUERYSYSTEMINFORMATIONZwQuerySystemInformation = NULL;

ZwQuerySystemInformation =

(NTQUERYSYSTEMINFORMATION)GetProcAddress(ntdll.dll,"ZwQuerySystemInfromation");

举例:枚举进程信息

要想获取进程信息,必须使用第二个参数,第二个参数指向一块内存。必须使用参数1中每个系统信息对应的结构体来将该内存进行转换。

假设我们要枚举进程信息,必须使用下列结构,该结构描述了进程名,线程数,指向下一个模块的指针,创建时间等等。结构描述如下:

图1 参数2指针指向的结构

PSYSTEM_PROCESSESpsp=NULL;

//先为参数2设为空,dwNeedSize获取保存该结构体的内存大小

status = ZwQuerySystemInformation(SystemProcessesAndThreadsInformation,      NULL, 0, &dwNeedSize);

//若用户提供的缓冲//区大小不够,则返回STATUS_INFO_LENGTH_MISMATCH,并返回实际需要的缓冲区大小

if ( status ==STATUS_INFO_LENGTH_MISMATCH ) {

pBuffer = new BYTE[dwNeedSize];

status =ZwQuerySystemInformation(SystemProcessesAndThreadsInformation, (PVOID)pBuffer,dwNeedSize, NULL);

if ( status ==STATUS_SUCCESS )

{

psp = (PSYSTEM_PROCESSES)pBuffer; //强制转换

printf("PID  线程数工作集大小进程名\n");

do {

printf("%-4d",psp->ProcessId);

printf(" %3d",psp->ThreadCount);

printf(" %8dKB",psp->VmCounters.WorkingSetSize/1024);

wprintf(L" %s\n",psp->ProcessName.Buffer);

psp = (PSYSTEM_PROCESSES)((ULONG)psp +psp->NextEntryDelta );

}while ( psp->NextEntryDelta != 0 );//循环遍历

}

delete []pBuffer;

pBuffer =NULL;

}

二、内核模式下的ZwQuerySystemInformation

内核模式下的ZwQuerySystemInformation的地址的获取没有应用层那么麻烦。直接声明一下该函数即可。详细参见:http://www.2cto.com/kf/200901/31447.html

NTSYSAPI

NTSTATUS

NTAPI ZwQuerySystemInformation(

IN ULONG SystemInformationClass,

IN OUT PVOID SystemInformation,

IN ULONG SystemInformationLength,

OUT PULONG ReturnLength);

直接使用即可:

ZwQuerySystemInformation(SystemProcessesAndThreadsInformation,pBuffer, cbBuffer, NULL);

这是一个C代码程序,该程序是在ring3层写的,主要内容是获取CPU个数,枚举进程,枚举内核模块。该代码是从网上下载的,因为要用到这个函数,所以小小地研究了一下。

地址:http://nokyo.blogbus.com/logs/33162795.html

SYSTEM_INFORMATION_CLASS枚举结构,大家有兴趣的话可以去好好研究。

typedef enum _SYSTEM_INFORMATION_CLASS

{

SystemBasicInformation,                 //  0 Y N

SystemProcessorInformation,             //  1 Y N

SystemPerformanceInformation,           //  2 Y N

SystemTimeOfDayInformation,             //  3 Y N

SystemNotImplemented1,                  //  4 Y N

SystemProcessesAndThreadsInformation,   //  5 Y N

SystemCallCounts,                       //  6 Y N

SystemConfigurationInformation,         //  7 Y N

SystemProcessorTimes,                   //  8 Y N

SystemGlobalFlag,                       //  9 Y Y

SystemNotImplemented2,                  // 10 Y N

SystemModuleInformation,                // 11 Y N

SystemLockInformation,                  // 12 Y N

SystemNotImplemented3,                  // 13 Y N

SystemNotImplemented4,                  // 14 Y N

SystemNotImplemented5,                  // 15 Y N

SystemHandleInformation,                // 16 Y N

SystemObjectInformation,                // 17 Y N

SystemPagefileInformation,              // 18 Y N

SystemInstructionEmulationCounts,       // 19 Y N

SystemInvalidInfoClass1,                // 20

SystemCacheInformation,                 // 21 Y Y

SystemPoolTagInformation,               // 22 Y N

SystemProcessorStatistics,              // 23 Y N

SystemDpcInformation,                   // 24 Y Y

SystemNotImplemented6,                  // 25 Y N

SystemLoadImage,                        // 26 N Y

SystemUnloadImage,                      // 27 N Y

SystemTimeAdjustment,                   // 28 Y Y

SystemNotImplemented7,                  // 29 Y N

SystemNotImplemented8,                  // 30 Y N

SystemNotImplemented9,                  // 31 Y N

SystemCrashDumpInformation,             // 32 Y N

SystemExceptionInformation,             // 33 Y N

SystemCrashDumpStateInformation,        // 34 Y Y/N

SystemKernelDebuggerInformation,        // 35 Y N

SystemContextSwitchInformation,         // 36 Y N

SystemRegistryQuotaInformation,         // 37 Y Y

SystemLoadAndCallImage,                 // 38 N Y

SystemPrioritySeparation,               // 39 N Y

SystemNotImplemented10,                 // 40 Y N

SystemNotImplemented11,                 // 41 Y N

SystemInvalidInfoClass2,                // 42

SystemInvalidInfoClass3,                // 43

SystemTimeZoneInformation,              // 44 Y N

SystemLookasideInformation,             // 45 Y N

SystemSetTimeSlipEvent,                 // 46 N Y

SystemCreateSession,                    // 47 N Y

SystemDeleteSession,                    // 48 N Y

SystemInvalidInfoClass4,                // 49

SystemRangeStartInformation,            // 50 Y N

SystemVerifierInformation,              // 51 Y Y

SystemAddVerifier,                      // 52 N Y

SystemSessionProcessesInformation       // 53 Y N

} SYSTEM_INFORMATION_CLASS;

时间: 2024-10-10 04:21:53

函数ZwQuerySystemInformation小结的相关文章

SQL中convert()函数使用小结

CONVERT(data_type,expression[,style]) convert(varchar(10),字段名,转换格式) 说明:此样式一般在时间类型(datetime,smalldatetime)与字符串类型(nchar,nvarchar,char,varchar)相互转换的时候才用到. 语句 结果SELECT CONVERT(varchar(100), GETDATE(), 0) 07 15 2009 4:06PMSELECT CONVERT(varchar(100), GETD

函数基础小结

函数基础小结 一.定义函数 只检测语法,不执行代码 二.函数定义的三种方式 有参函数 无参函数 空函数 三.调用函数 def f1(): return 123 f = f1() f1()*2 lis = [f1(),2] 四.函数的返回值 return返回返回值,函数遇到return会终止,return可以返回任意数据类型的值,同时也可以返回多个值 函数只有在调用阶段才会接收返回值,默认返回None 五.函数的参数 5.1 形参 接收实参,具有描述意义,没有具体值 5.2 实参 具有具体的值,传

C++拷贝函数的小结,关于变量的作用域等---ShinePans

#include <iostream> using namespace std; class circle { private: double r0; public: circle(double r) { r0 = r; cout << r << "调用了球体的初始化的函数\n"; } circle(const circle &t){ r0 = t.r0; cout << "r=" << r0 &l

函数练习小结

NULL值与任何值进行四则运算后,其结果均为NULL如果列别名包括空格或特殊字符,或者它是区分大小写的,那么需要双引号 把列与列,列与字符连接起来用||表示,用来合成列 输出显示关键字或者操作符的内容q'[]'表示 [ ] , ! ! , : : , { } , ( ) ,  < > , . . 等都是可以,但切记,要成对出现 distinct去重的结果是不排序的 字符和日期要包含在单引号中 字符大小写敏感,日期格式敏感 默认的日期格式是DD-MON-RR sql语句中的日期类型要与当前会话中

PHP 正则表达式常用函数使用小结

在PHP中有两套正则表达式函数库.一套是由PCRE(Perl Compatible Regular Expression)库提供的.PCRE库使用和Perl相同的语法规则实现了正则表达式的模式匹配,其使用以“preg_”为前缀命名的函数.另一套是由POSIX(Portable Operation System interface)扩展库提供的.POSIX扩展的正则表达式由POSIX 1003.2定义,一般使用以“ereg_”为前缀命名的函数. 两套函数库的功能相似,执行效率稍有不同.一般而言,实

asp.net MVC helper 和自定义函数@functions小结

asp.net Razor 视图具有.cshtml后缀,可以轻松的实现c#代码和html标签的切换,大大提升了我们的开发效率.但是Razor语法还是有一些棉花糖值得我们了解一下,可以更加强劲的提升我们的开发效率,减少开发bug的出现. Razor 采用的是@ 尾巴符号,正是这个符号成就了Mvc开发效率的提升.下面了解一下和@相关的两个可以重用的helper.functions. 作为现代化的程序员,我们尽可能的遵守一个原则.不要重复你自己.所以能够重构的代码我们都会合并,但是这是对于后台代码C#

Python: 函数参数小结

参数的类型: 函数的参数有2种类型: 1. 函数定义时用于接收值的形式参数Parameters. 2. 函数调用时用于传递值的实际参数Arguments. 参数的传递: 传递方式有2种: 1. 值传递: 将实参的值复制一份给形参, 不管此值是原始值, 指针值还是堆对象值. 2. 引用传递: 将形参与实参引用相同的对象. 传递形式有2种: 1. 按位置传递: 2. 按命名传递: 形参的定义: 函数的形参可分为: 1. 普通参数 2. 默认参数: 具有默认值的参数 3. 变长参数: 根据传递参数传递

函数作用域小结

1.变量查找顺序:LEGB,作用域局部>外层作用域>当前模块中的全局>python内部作用域 2.只有模块,类,函数才能引入新作用域 3.对于一个变量,内部作用域先声明就会覆盖外部变量,不声明直接使用,就会使用外部作用域的变量 4.内部作用域要修改外部作用域的值时,全局变量要使用global关键字,嵌套作用域变量要使用nonlocal关键字,nonlocal是python3新增关键字,有了这个关键字,就能完美的实现闭包了.

[UE4]蓝图函数库小结

蓝图函数库的功能非常强劲,如果在项目中使用的话有时能达到事半功倍的效果. 蓝图函数库,Blueprint Function Library.可以非常方便的将代码中的函数暴露给所有的蓝图使用,同时也提供了很好的代码复用性.完成的蓝图函数库可以非常轻易的在其他项目中使用或者共享给其他人.由于在函数库中定义的所有函数都能在其他的蓝图中访问,可以说是和单例模式的C++代码接合的天然素材.也可以防止为了定义一些泛用的函数而频繁的使用接口继承. 使用起来也是非常的简单明了.类似下面的代码就可以完成一个蓝图函