Función AuxKlibQueryModuleInformation (aux_klib.h)

La rutina AuxKlibQueryModuleInformation recupera información sobre los módulos de imagen que el sistema operativo ha cargado.

Sintaxis

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

Parámetros

[in, out] BufferSize

Puntero a una ubicación que contiene o recibe un tamaño de búfer, en bytes. Si QueryInfo es NULL, la ubicación recibe el número de bytes que el controlador debe asignar para la matriz que recibe la información recuperada. Si QueryInfo no es NULL, la ubicación debe contener el número especificado de bytes.

[in] ElementSize

Tamaño, en bytes, de cada elemento de la matriz a la que apunta QueryInfo . Este valor debe ser sizeof(AUX_MODULE_BASIC_INFO) o sizeof(AUX_MODULE_EXTENDED_INFO).

[out, optional] QueryInfo

Puntero a una matriz de estructuras de AUX_MODULE_BASIC_INFO o AUX_MODULE_EXTENDED_INFO que recibe información sobre los módulos de imagen cargados. Si este puntero es NULL, AuxKlibQueryModuleInformation escribe el tamaño de búfer necesario en la ubicación a la que BufferSize apunta.

Valor devuelto

AuxKlibQueryModuleInformation devuelve STATUS_SUCCESS si la operación se realiza correctamente. AuxKlibQueryModuleInformation devuelve STATUS_BUFFER_TOO_SMALL si el puntero QueryInfo no es NULL y el valor bufferSize proporcionado por el controlador es demasiado pequeño.

La rutina podría devolver otros valores NTSTATUS.

Comentarios

Para obtener información sobre los módulos de imagen cargados del sistema operativo, un controlador debe:

  1. Llame a AuxKlibQueryModuleInformation con un puntero QueryInfoNULL. Una vez devuelto AuxKlibQueryModuleInformation , la ubicación a la que apunta el parámetro BufferSize contendrá el número de bytes a los que tendrá que asignar el controlador para la matriz.
  2. Llame a una rutina de asignación de memoria, como ExAllocatePoolWithTag, para asignar un búfer para la matriz.
  3. Vuelva a llamar a AuxKlibQueryModuleInformation . Esta vez, el puntero QueryInfo debe contener la dirección del búfer asignado. Después de que se devuelva AuxKlibQueryModuleInformation , el búfer contiene una matriz de información del módulo.
El número de módulos cargados puede cambiar entre la primera y la segunda llamada a AuxKlibQueryModuleInformation. Como resultado, la segunda llamada a AuxKlibQueryModuleInformation podría devolver STATUS_BUFFER_TOO_SMALL incluso si el controlador asigna un búfer basado en el tamaño obtenido de la primera llamada.

Si una llamada a AuxKlibQueryModuleInformation se realiza correctamente, la rutina escribe un valor de ImageBase en cada elemento de la matriz QueryInfo . Cada valor de ImageBase es un puntero a la base de una imagen de controlador cargada. Este puntero solo es válido mientras el controlador permanece cargado. El autor de la llamada debe suponer que el controlador se puede descargar en cualquier momento, a menos que el autor de la llamada pueda garantizar lo contrario. Por ejemplo, un controlador podría descargarse entre una llamada a AuxKlibQueryModuleInformation que obtiene un puntero a la imagen del controlador y una llamada a AuxKlibGetImageExportDirectory que usa este puntero.

Los controladores deben llamar a AuxKlibInitialize antes de llamar a AuxKlibQueryModuleInformation.

Ejemplos

En el ejemplo de código siguiente se muestran los pasos que aparecen en la sección Comentarios 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 Value
Cliente mínimo compatible Se admite a partir de Windows 2000.
Plataforma de destino Universal
Encabezado aux_klib.h (incluya Aux_klib.h)
Library Aux_Klib.lib
IRQL PASSIVE_LEVEL

Consulte también

AUX_MODULE_BASIC_INFO

AUX_MODULE_EXTENDED_INFO

AuxKlibGetImageExportDirectory

AuxKlibInitialize

ExAllocatePoolWithTag