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 。

原创粉丝点击