Função AuxKlibQueryModuleInformation (aux_klib.h)

A rotina AuxKlibQueryModuleInformation recupera informações sobre os módulos de imagem que o sistema operacional carregou.

Sintaxe

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

Parâmetros

[in, out] BufferSize

Um ponteiro para um local que contém ou recebe um tamanho de buffer, em bytes. Se QueryInfo for NULL, o local receberá o número de bytes que o driver deve alocar para a matriz que recebe as informações recuperadas. Se QueryInfo não for NULL, o local deverá conter o número especificado de bytes.

[in] ElementSize

O tamanho, em bytes, de cada elemento da matriz para o qual QueryInfo aponta. Esse valor deve ser sizeof(AUX_MODULE_BASIC_INFO) ou sizeof(AUX_MODULE_EXTENDED_INFO).

[out, optional] QueryInfo

Um ponteiro para uma matriz de estruturas de AUX_MODULE_BASIC_INFO ou AUX_MODULE_EXTENDED_INFO que recebe informações sobre módulos de imagem carregados. Se esse ponteiro for NULL, AuxKlibQueryModuleInformation gravará o tamanho do buffer necessário no local para o qual BufferSize aponta.

Retornar valor

AuxKlibQueryModuleInformation retornará STATUS_SUCCESS se a operação for bem-sucedida. AuxKlibQueryModuleInformation retornará STATUS_BUFFER_TOO_SMALL se o ponteiro QueryInfo não for NULL e o valor bufferSize fornecido pelo driver for muito pequeno.

A rotina pode retornar outros valores NTSTATUS.

Comentários

Para obter informações sobre os módulos de imagem carregados do sistema operacional, um driver deve:

  1. Chame AuxKlibQueryModuleInformation com um ponteiro NULLQueryInfo . Depois que AuxKlibQueryModuleInformation retornar, o local para o qual o parâmetro BufferSize aponta conterá o número de bytes que o driver terá que alocar para a matriz.
  2. Chame uma rotina de alocação de memória, como ExAllocatePoolWithTag, para alocar um buffer para a matriz.
  3. Chame AuxKlibQueryModuleInformation novamente. Desta vez, o ponteiro QueryInfo deve conter o endereço do buffer alocado. Depois que AuxKlibQueryModuleInformation retornar, o buffer conterá uma matriz de informações de módulo.
O número de módulos carregados pode ser alterado entre a primeira e a segunda chamadas para AuxKlibQueryModuleInformation. Como resultado, a segunda chamada para AuxKlibQueryModuleInformation pode retornar STATUS_BUFFER_TOO_SMALL mesmo que o driver aloque um buffer com base no tamanho obtido da primeira chamada.

Se uma chamada para AuxKlibQueryModuleInformation for bem-sucedida, a rotina gravará um valor ImageBase em cada elemento na matriz QueryInfo . Cada valor ImageBase é um ponteiro para a base de uma imagem de driver carregada. Esse ponteiro permanece válido somente enquanto o driver permanece carregado. O chamador deve assumir que o driver pode ser descarregado a qualquer momento, a menos que o chamador possa garantir o contrário. Por exemplo, um driver pode ser descarregado entre uma chamada para AuxKlibQueryModuleInformation que obtém um ponteiro para a imagem do driver e uma chamada para AuxKlibGetImageExportDirectory que usa esse ponteiro.

Os drivers devem chamar AuxKlibInitialize antes de chamar AuxKlibQueryModuleInformation.

Exemplos

O exemplo de código a seguir ilustra as etapas listadas na seção Comentários anterior.

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

Requisitos

Requisito Valor
Cliente mínimo com suporte Com suporte a partir do Windows 2000.
Plataforma de Destino Universal
Cabeçalho aux_klib.h (inclua Aux_klib.h)
Biblioteca Aux_Klib.lib
IRQL PASSIVE_LEVEL

Confira também

AUX_MODULE_BASIC_INFO

AUX_MODULE_EXTENDED_INFO

AuxKlibGetImageExportDirectory

AuxKlibInitialize

ExAllocatePoolWithTag