Funzione AuxKlibQueryModuleInformation (aux_klib.h)

La routine AuxKlibQueryModuleInformation recupera informazioni sui moduli di immagine caricati dal sistema operativo.

Sintassi

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

Parametri

[in, out] BufferSize

Puntatore a una posizione contenente o riceve una dimensione del buffer, in byte. Se QueryInfo è NULL, il percorso riceve il numero di byte che il driver deve allocare per la matrice che riceve le informazioni recuperate. Se QueryInfo non è NULL, il percorso deve contenere il numero specificato di byte.

[in] ElementSize

Dimensioni, in byte, di ogni elemento della matrice a cui QueryInfo punta. Questo valore deve essere sizeof(AUX_MODULE_BASIC_INFO) o sizeof(AUX_MODULE_EXTENDED_INFO).

[out, optional] QueryInfo

Puntatore a una matrice di strutture AUX_MODULE_BASIC_INFO o AUX_MODULE_EXTENDED_INFO che ricevono informazioni sui moduli di immagine caricati. Se questo puntatore è NULL, AuxKlibQueryModuleInformation scrive le dimensioni del buffer necessarie nella posizione in cui BufferSize punta.

Valore restituito

AuxKlibQueryModuleInformation restituisce STATUS_SUCCESS se l'operazione ha esito positivo. AuxKlibQueryModuleInformation restituisce STATUS_BUFFER_TOO_SMALL se il puntatore QueryInfo non è NULL e il valore BufferSize fornito dal driver è troppo piccolo.

La routine potrebbe restituire altri valori NTSTATUS.

Commenti

Per ottenere informazioni sui moduli immagine caricati dal sistema operativo, un driver deve:

  1. Chiamare AuxKlibQueryModuleInformation con un puntatoreNULLQueryInfo . Dopo che AuxKlibQueryModuleInformation restituisce , il percorso a cui punta il parametro BufferSize conterrà il numero di byte che il driver dovrà allocare per la matrice.
  2. Chiamare una routine di allocazione della memoria, ad esempio ExAllocatePoolWithTag, per allocare un buffer per la matrice.
  3. Chiamare di nuovo AuxKlibQueryModuleInformation . Questa volta, il puntatore QueryInfo deve contenere l'indirizzo del buffer allocato. Dopo aver restituito AuxKlibQueryModuleInformation , il buffer contiene una matrice di informazioni sul modulo.
Il numero di moduli caricati può cambiare tra la prima e la seconda chiamata a AuxKlibQueryModuleInformation. Di conseguenza, la seconda chiamata a AuxKlibQueryModuleInformation potrebbe restituire STATUS_BUFFER_TOO_SMALL anche se il driver alloca un buffer basato sulle dimensioni ottenute dalla prima chiamata.

Se una chiamata a AuxKlibQueryModuleInformation ha esito positivo, la routine scrive un valore ImageBase in ogni elemento della matrice QueryInfo . Ogni valore imageBase è un puntatore alla base di un'immagine del driver caricata. Questo puntatore rimane valido solo mentre il driver rimane caricato. Il chiamante deve presumere che il driver possa essere scaricato in qualsiasi momento, a meno che il chiamante non possa garantire altrimenti. Ad esempio, un driver potrebbe essere scaricato tra una chiamata a AuxKlibQueryModuleInformation che ottiene un puntatore all'immagine del driver e una chiamata a AuxKlibGetImageExportDirectory che usa questo puntatore.

I driver devono chiamare AuxKlibInitialize prima di chiamare AuxKlibQueryModuleInformation.

Esempio

Nell'esempio di codice seguente vengono illustrati i passaggi elencati nella sezione Osservazioni precedenti.

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

Requisiti

Requisito Valore
Client minimo supportato Supportato a partire da Windows 2000.
Piattaforma di destinazione Universale
Intestazione aux_klib.h (includere Aux_klib.h)
Libreria Aux_Klib.lib
IRQL PASSIVE_LEVEL

Vedi anche

AUX_MODULE_BASIC_INFO

AUX_MODULE_EXTENDED_INFO

AuxKlibGetImageExportDirectory

AuxKlibInitialize

ExAllocatePoolWithTag