AuxKlibQueryModuleInformation 函数 (aux_klib.h)

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

语法

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

参数

[in, out] BufferSize

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

[in] ElementSize

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

[out, optional] QueryInfo

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

返回值

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

例程可能会返回其他 NTSTATUS 值

备注

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

  1. 使用 NULLQueryInfo 指针调用 AuxKlibQueryModuleInformation在 AuxKlibQueryModuleInformation 返回后,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 (包括 Aux_klib.h)
Library Aux_Klib.lib
IRQL PASSIVE_LEVEL

另请参阅

AUX_MODULE_BASIC_INFO

AUX_MODULE_EXTENDED_INFO

AuxKlibGetImageExportDirectory

AuxKlibInitialize

ExAllocatePoolWithTag