AuxKlibQueryModuleInformation---from ddk 文档

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 。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值