Freigeben über


AuxKlibQueryModuleInformation-Funktion (aux_klib.h)

Die AuxKlibQueryModuleInformation-Routine ruft Informationen zu den Imagemodulen ab, die vom Betriebssystem geladen wurden.

Syntax

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

Parameter

[in, out] BufferSize

Ein Zeiger auf einen Speicherort, der eine Puffergröße in Bytes enthält oder empfängt. Wenn QueryInfoNULL ist, empfängt der Speicherort die Anzahl von Bytes, die der Treiber für das Array zuordnen muss, das die abgerufenen Informationen empfängt. Wenn QueryInfo nicht NULL ist, muss der Speicherort die angegebene Anzahl von Bytes enthalten.

[in] ElementSize

Die Größe jedes Elements des Arrays, auf das QueryInfo verweist, in Bytes. Dieser Wert muss sizeof(AUX_MODULE_BASIC_INFO) oder sizeof(AUX_MODULE_EXTENDED_INFO) sein.

[out, optional] QueryInfo

Ein Zeiger auf ein Array von AUX_MODULE_BASIC_INFO - oder AUX_MODULE_EXTENDED_INFO-Strukturen , die Informationen zu geladenen Bildmodulen empfängt. Wenn dieser Zeiger NULL ist, schreibt AuxKlibQueryModuleInformation die erforderliche Puffergröße in den Speicherort, auf den BufferSize zeigt.

Rückgabewert

AuxKlibQueryModuleInformation gibt STATUS_SUCCESS zurück, wenn der Vorgang erfolgreich ist. AuxKlibQueryModuleInformation gibt STATUS_BUFFER_TOO_SMALL zurück, wenn der QueryInfo-Zeiger nicht NULL und der vom Treiber bereitgestellte BufferSize-Wert zu klein ist.

Die Routine gibt möglicherweise andere NTSTATUS-Werte zurück.

Hinweise

Um Informationen zu den geladenen Imagemodulen des Betriebssystems zu erhalten, muss ein Treiber Folgendes ausführen:

  1. Rufen Sie AuxKlibQueryModuleInformation mit einem NULLQueryInfo-Zeiger auf. Nachdem AuxKlibQueryModuleInformation zurückgegeben wurde, enthält der Speicherort, auf den der BufferSize-Parameter verweist, die Anzahl der Bytes, die der Treiber für das Array zuordnen muss.
  2. Rufen Sie eine Speicherbelegungsroutine auf, z. B. ExAllocatePoolWithTag, um einen Puffer für das Array zuzuweisen.
  3. Rufen Sie AuxKlibQueryModuleInformation erneut auf. Dieses Mal muss der QueryInfo-Zeiger die Adresse des zugeordneten Puffers enthalten. Nachdem AuxKlibQueryModuleInformation zurückgegeben wurde, enthält der Puffer ein Array von Modulinformationen.
Die Anzahl der geladenen Module kann zwischen dem ersten und zweiten Aufruf von AuxKlibQueryModuleInformation geändert werden. Daher kann der zweite Aufruf von AuxKlibQueryModuleInformation STATUS_BUFFER_TOO_SMALL zurückgeben, auch wenn der Treiber einen Puffer zuordnet, der auf der Größe basiert, die beim ersten Aufruf abgerufen wurde.

Wenn ein Aufruf von AuxKlibQueryModuleInformation erfolgreich ist, schreibt die Routine einen ImageBase-Wert in jedes Element im QueryInfo-Array . Jeder ImageBase-Wert ist ein Zeiger auf die Basis eines geladenen Treiberimages. Dieser Zeiger bleibt nur gültig, während der Treiber geladen bleibt. Der Aufrufer sollte davon ausgehen, dass der Treiber jederzeit entladen werden kann, sofern der Aufrufer nichts anderes garantieren kann. Beispielsweise kann ein Treiber zwischen einem Aufruf von AuxKlibQueryModuleInformation , der einen Zeiger auf das Treiberimage abruft, und einem Aufruf von AuxKlibGetImageExportDirectory entladen werden, der diesen Zeiger verwendet.

Treiber müssen AuxKlibInitialize aufrufen, bevor AuxKlibQueryModuleInformation aufgerufen wird.

Beispiele

Im folgenden Codebeispiel werden die Schritte veranschaulicht, die im vorherigen Abschnitt Hinweise aufgeführt sind.

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;
    }

Anforderungen

Anforderung Wert
Unterstützte Mindestversion (Client) Unterstützt ab Windows 2000.
Zielplattform Universell
Header aux_klib.h (Aux_klib.h einschließen)
Bibliothek Aux_Klib.lib
IRQL PASSIVE_LEVEL

Weitere Informationen

AUX_MODULE_BASIC_INFO

AUX_MODULE_EXTENDED_INFO

AuxKlibGetImageExportDirectory

AuxKlibInitialize

ExAllocatePoolWithTag