AuxKlibQueryModuleInformation 函数 (aux_klib.h)

AuxKlibQueryModuleInformation 例程检索有关操作系统加载的映像模块的信息。

语法

NTSTATUS AuxKlibQueryModuleInformation(
  [in, out]       PULONG BufferSize,
  [in]            ULONG  ElementSize,
  [out, optional] PVOID  QueryInfo
);

参数

[in, out] BufferSize

指向包含或接收缓冲区大小(以字节为单位)的位置的指针。 如果 QueryInfoNULL,则位置将接收驱动程序必须为接收检索信息的数组分配的字节数。 如果 QueryInfoNULL,则位置必须包含指定的字节数。

[in] ElementSize

QueryInfo 指向的数组的每个元素的大小(以字节为单位)。 此值必须 sizeofAUX_MODULE_BASIC_INFO)或 sizeofAUX_MODULE_EXTENDED_INFO)。

[out, optional] QueryInfo

指向接收已加载图像模块信息的 AUX_MODULE_BASIC_INFOAUX_MODULE_EXTENDED_INFO 结构的数组的指针。 如果此指针 NULLAuxKlibQueryModuleInformation 会将所需的缓冲区大小写入 BufferSize 指向的位置。

返回值

AuxKlibQueryModuleInformation 如果操作成功,则返回STATUS_SUCCESS。 AuxKlibQueryModuleInformation 如果 QueryInfo 指针未 NULL,并且驱动程序提供的 BufferSize 值太小,则返回STATUS_BUFFER_TOO_SMALL。

例程可能会返回其他 NTSTATUS 值。

言论

若要获取有关操作系统加载的映像模块的信息,驱动程序必须:

  1. 使用 NULLQueryInfo 指针调用 AuxKlibQueryModuleInformationAuxKlibQueryModuleInformation 返回后,BufferSize 参数指向的位置将包含驱动程序必须为数组分配的字节数。
  2. 调用内存分配例程(如 ExAllocatePoolWithTag),为数组分配缓冲区。
  3. 再次调用 AuxKlibQueryModuleInformation。 这一次,QueryInfo 指针必须包含已分配缓冲区的地址。 AuxKlibQueryModuleInformation 返回后,缓冲区包含模块信息的数组。
加载的模块数可以在 AuxKlibQueryModuleInformation的第一次和第二次调用之间更改。 因此,对 AuxKlibQueryModuleInformation 的第二次调用可能会 返回STATUS_BUFFER_TOO_SMALL,即使驱动程序分配的缓冲区基于第一次调用获取的大小。

如果调用 AuxKlibQueryModuleInformation 成功,则例程会将 ImageBase 值写入 QueryInfo 数组中的每个元素。 每个 ImageBase 值都是指向已加载驱动程序映像的基数的指针。 仅当驱动程序保持加载状态时,此指针才有效。 调用方应假定驱动程序可以随时卸载,除非调用方可以保证否则。 例如,在调用 AuxKlibQueryModuleInformation 之间卸载驱动程序,该调用可获取指向驱动程序映像的指针,以及调用 AuxKlibGetImageExportDirectory 使用此指针。

驱动程序必须在调用 AuxKlibQueryModuleInformation之前调用 AuxKlibInitialize

例子

下面的代码示例演示了前面“备注”部分中列出的步骤。

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;
    }

要求

要求 价值
最低支持的客户端 从 Windows 2000 开始支持。
目标平台 普遍
标头 aux_klib.h (include Aux_klib.h)
Aux_Klib.lib
IRQL PASSIVE_LEVEL

另请参阅

AUX_MODULE_BASIC_INFO

AUX_MODULE_EXTENDED_INFO

AuxKlibGetImageExportDirectory

AuxKlibInitialize

ExAllocatePoolWithTag