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 が指す配列の各要素のサイズ (バイト単位)。 この値は 、sizeof(AUX_MODULE_BASIC_INFO) または sizeof(AUX_MODULE_EXTENDED_INFO) である必要があります。

[out, optional] QueryInfo

読み込まれたイメージ モジュールに関する情報 受け取るAUX_MODULE_BASIC_INFO構造体または AUX_MODULE_EXTENDED_INFO 構造体の配列へのポインター。 このポインターが NULL の場合、 AuxKlibQueryModuleInformationBufferSize が指す場所に必要なバッファー サイズを書き込みます。

戻り値

操作が成功した場合、AuxKlibQueryModuleInformation はSTATUS_SUCCESSを返します。 QueryInfo ポインターが NULL ではなく、ドライバー指定の BufferSize 値が小さすぎる場合、AuxKlibQueryModuleInformation はSTATUS_BUFFER_TOO_SMALLを返します。

ルーチンは、他の NTSTATUS 値を返す場合があります。

注釈

オペレーティング システムの読み込まれたイメージ モジュールに関する情報を取得するには、ドライバーで次の操作を行う必要があります。

  1. NULLQueryInfo ポインターを使用して AuxKlibQueryModuleInformation を呼び出します。 AuxKlibQueryModuleInformation が返された後、BufferSize パラメーターが指す場所には、ドライバーが配列に割り当てる必要があるバイト数が含まれます。
  2. ExAllocatePoolWithTag などのメモリ割り当てルーチンを呼び出して、配列のバッファーを割り当てます。
  3. AuxKlibQueryModuleInformation をもう一度呼び出します。 今回は、 QueryInfo ポインターに割り当てられたバッファーのアドレスが含まれている必要があります。 AuxKlibQueryModuleInformation が返された後、バッファーにはモジュール情報の配列が含まれます。
読み込まれたモジュールの数は、 AuxKlibQueryModuleInformation の 1 回目と 2 回目の呼び出しの間で変更できます。 その結果、 AuxKlibQueryModuleInformation への 2 回目の呼び出しは、ドライバーが最初の呼び出しから取得したサイズに基づくバッファーを割り当てた場合でも、STATUS_BUFFER_TOO_SMALLを返す可能性があります。

AuxKlibQueryModuleInformation の呼び出しが成功した場合、ルーチンは、QueryInfo 配列内の各要素に ImageBase 値を書き込みます。 各 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 以降でサポートされています。
対象プラットフォーム ユニバーサル
Header aux_klib.h (Aux_klib.h を含む)
Library Aux_Klib.lib
IRQL PASSIVE_LEVEL

こちらもご覧ください

AUX_MODULE_BASIC_INFO

AUX_MODULE_EXTENDED_INFO

AuxKlibGetImageExportDirectory

AuxKlibInitialize

ExAllocatePoolWithTag