AuxKlibQueryModuleInformation---from ddk 文档
来源:互联网 发布:h3c交换机查看mac地址 编辑:程序博客网 时间:2024/06/10 20:49
AuxKlibQueryModuleInformation 例程获取操作系统已经加载的映像模块的信息。
NTSTATUS AuxKlibQueryModuleInformation( IN OUT PULONG BufferSize, IN ULONG ElementSize, OUT PVOID QueryInfo OPTIONAL );
参数
BufferSize 是指向一个包含或接受缓冲区大小的位置的指针。如果参数 QueryInfo 为空,这个位置就接受驱动程序(调用了该函数)必须申请用来接受(保存)获取的信息的数组大小的字节数。如果QueryInfo 不为空,这个位置就必须包含一个给定的字节数。
ElementSize 是QueryInfo指针指向数组中每个元素以字节为单位的大小。这个值是sizeof(AUX_MODULE_BASIC_iNFO)或sizeof(AUX_MODULE_EXTENDED_INFO).
QueryInfo 一个指向AUX_MODULE_BASIC_INFO或AUX_MODULE_EXTENDED_INFO结构的数组的指针,该数组用来接受已加载模块的信息。如果这个指针为空,AuxKlibQueryModuleInformation 会将需要写入的缓冲区大小写到BufferSize指向的位置。
返回值
如果操作成功,返回 STATUS_SUCCESS。
如果 QueryInfo 不为空,并且驱动程序提供的缓冲区大小不够用,返回 STATUS_BUFFER_TOO_SMALL 。
可能还有其他的 NT_STATUS 值 。
评论
要获取操作系统家族模块的信息,驱动程序必须:
1.将参数QueryInfo设为NULL,调用AuxKlibQueryModuleInformation ,BufferSize 指向的位置包含驱动程序需要申请数组大小的字节数。
2.调用内存申请例程,例如ExAllocatePoolWithTag,为该数组申请缓冲区。
3.再调用AuxKlibQueryModuleInformation ,这次QueryInfo指针必须包含已申请缓冲区的地址。函数返回后,缓冲区包含模块信息的数组。
在第一次和第二次调用AuxKlibQueryModuleInformation的过程中已加载模块的数量可以改变。
这导致,即便申请了第一次返回的需要数组的大小,第二次调用可能返回 STATUS_BUFFER_TOO_SMALL。
如果调用成功,该例程将映像基址(ImageBase)指写到QueryInfo 数组的每个元素。每个ImageBase值是指向已加载驱动映像基址(base)的指针。只要该驱动仍处于加载状态,这个指针就有效。 调用者因该假设这个驱动可以在任何时刻被卸载,除非调用者能够确保其他情况。例如,驱动可能在调用AuxKlibQueryModuleInformation 获取指向驱动映像的指针与调用使用了该指针的AuxLibGetImageExportDirectory的过程中被卸载。
驱动在使用AuxKlibQueryModuleInformation之前必须调用AuxKlibInitialize 。
例子,下面的代码按照前面的评论段的步骤进行描叙
(***from ddk***)NTSTATUS status;ULONG modulesSize;AUX_MODULE_EXTENDED_INFO* modules;ULONG numberOfModules;//// Get the required array size.//status = AuxKlibQueryModuleInformation( &modulesSize, sizeof(AUX_MODULE_EXTENDED_INFO), NULL );if (!NT_SUCCESS(status) || modulesSize == 0) { break; }// Calculate the number of modules.计算模块数量numberOfModules = modulesSize / sizeof(AUX_MODULE_EXTENDED_INFO);// Allocate memory to receive data.modules = (AUX_MODULE_EXTENDED_INFO*) ExAllocatePoolWithTag( PagedPool, modulesSize, '3LxF' );if (modules == NULL) { status = STATUS_INSUFFICIENT_RESOURCES; break; }RtlZeroMemory(modules,modulesSize);//初始化// Obtain the module information.status = AuxKlibQueryModuleInformation( &modulesSize, sizeof(AUX_MODULE_EXTENDED_INFO), modules );if (!NT_SUCCESS(status)) { break; } -------- typedef struct _AUX_MODULE_BASIC_INFO { PVOID ImageBase;} AUX_MODULE_BASIC_INFO, *PAUX_MODULE_BASIC_INFO; typedef struct _AUX_MODULE_EXTENDED_INFO { AUX_MODULE_BASIC_INFO BasicInfo; ULONG ImageSize; USHORT FileNameOffset; UCHAR FullPathName [AUX_KLIB_MODULE_PATH_LEN];} AUX_MODULE_EXTENDED_INFO, *PAUX_MODULE_EXTENDED_INFO;
要求
头文件:定义在 Aux_klib.h,include Aux_klib.h 。
- AuxKlibQueryModuleInformation---from ddk 文档
- system worker thread---from ddk
- Accessing DDK Help from Visual Studio
- DDK
- DDk
- Kernel Streaming Driver(DDK文档翻译1)-
- Kernel Streaming Driver(DDK文档翻译2)- -
- Kernel Streaming Driver(DDK文档翻译3)- -
- 过滤钩子驱动程序一(微软DDK文档,FLASHSKY翻译)
- Determining whether the operating system is running in safe mode--from ddk
- 内核流驱动设计向导(翻译自ddk帮助文档)第一章 内核流总览
- 内核流驱动设计向导(翻译自ddk帮助文档)二
- 流Mini驱动开发指南(选自DDK联机文档)(一)
- windows DDK
- windows ddk
- WinXP DDK
- DDK/WDK
- DDK Tips
- this与super的区别
- scrollview和gridview嵌套使用的注意事项
- 为什么会需要消息队列(MQ)?
- Git指令集
- Windows 如何将分卷文件合并为一个文件
- AuxKlibQueryModuleInformation---from ddk 文档
- Python 入门实践
- pi64之raspi-config问题
- 关于android 使用MINA还是RMI框架的问题
- Tech Insight携阿里云Link物联网平台助力实现“IoT全栈开发”
- oracle-dbms_random随机函数
- 实用css特殊属性
- 不容易系列之(4)——考新郎(hdu2049)(错排)
- Java关键字final、static使用总结(转)