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_INFO 或 AUX_MODULE_EXTENDED_INFO 结构的数组的指针。 如果此指针 NULL,AuxKlibQueryModuleInformation 会将所需的缓冲区大小写入 BufferSize 指向的位置。
返回值
AuxKlibQueryModuleInformation 如果操作成功,则返回STATUS_SUCCESS。 AuxKlibQueryModuleInformation 如果 QueryInfo 指针未 NULL,并且驱动程序提供的 BufferSize 值太小,则返回STATUS_BUFFER_TOO_SMALL。
例程可能会返回其他
言论
若要获取有关操作系统加载的映像模块的信息,驱动程序必须:
- 使用 NULLQueryInfo 指针调用 AuxKlibQueryModuleInformation。 AuxKlibQueryModuleInformation 返回后,BufferSize 参数指向的位置将包含驱动程序必须为数组分配的字节数。
- 调用内存分配例程(如 ExAllocatePoolWithTag),为数组分配缓冲区。
- 再次调用 AuxKlibQueryModuleInformation。 这一次,QueryInfo 指针必须包含已分配缓冲区的地址。 AuxKlibQueryModuleInformation 返回后,缓冲区包含模块信息的数组。
如果调用 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 |