AuxKlibQueryModuleInformation 函数 (aux_klib.h)
AuxKlibQueryModuleInformation 例程检索有关操作系统已加载的映像模块的信息。
语法
NTSTATUS AuxKlibQueryModuleInformation(
[in, out] PULONG BufferSize,
[in] ULONG ElementSize,
[out, optional] PVOID QueryInfo
);
参数
[in, out] BufferSize
指向包含或接收缓冲区大小(以字节为单位)的位置的指针。 如果 QueryInfo 为 NULL,则位置接收驱动程序必须为接收检索到信息的数组分配的字节数。 如果 QueryInfo 不是 NULL,则位置必须包含指定的字节数。
[in] ElementSize
QueryInfo 指向的数组中每个元素的大小(以字节为单位)。 此值的 size 必须为 (AUX_MODULE_BASIC_INFO) 或 size 为 (AUX_MODULE_EXTENDED_INFO) 。
[out, optional] QueryInfo
指向 AUX_MODULE_BASIC_INFO 或 AUX_MODULE_EXTENDED_INFO 结构的数组的指针,这些结构接收有关加载的图像模块的信息。 如果此指针为 NULL, 则 AuxKlibQueryModuleInformation 会将所需的缓冲区大小写入 BufferSize 指向的位置。
返回值
如果操作成功,AuxKlibQueryModuleInformation 将返回STATUS_SUCCESS。 如果 QueryInfo 指针不是 NULL 且驱动程序提供的 BufferSize 值太小,则 AuxKlibQueryModuleInformation 将返回STATUS_BUFFER_TOO_SMALL。
例程可能会返回其他 NTSTATUS 值。
注解
若要获取有关操作系统加载的映像模块的信息,驱动程序必须:
- 使用 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 (包括 Aux_klib.h) |
Library | Aux_Klib.lib |
IRQL | PASSIVE_LEVEL |
另请参阅
反馈
https://aka.ms/ContentUserFeedback。
即将发布:在整个 2024 年,我们将逐步淘汰作为内容反馈机制的“GitHub 问题”,并将其取代为新的反馈系统。 有关详细信息,请参阅:提交和查看相关反馈