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 呼叫。

驅動程式必須先呼叫 AuxKlibInitialize ,才能呼叫 AuxKlibQueryModuleInformation

範例

下列程式代碼範例說明上述一節中列出的步驟。

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 開始支援。
目標平台 Universal
標頭 aux_klib.h (包含 Aux_klib.h)
程式庫 Aux_Klib.lib
IRQL PASSIVE_LEVEL

另請參閱

AUX_MODULE_BASIC_INFO

AUX_MODULE_EXTENDED_INFO

AuxKlibGetImageExportDirectory

AuxKlibInitialize

ExAllocatePoolWithTag