Поделиться через


Функция AuxKlibQueryModuleInformation (aux_klib.h)

Подпрограмма AuxKlibQueryModuleInformation извлекает сведения о модулях образа, загруженных операционной системой.

Синтаксис

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

Параметры

[in, out] BufferSize

Указатель на расположение, содержащее или получающее размер буфера в байтах. Если QueryInfoNULL, расположение получает количество байтов, которые драйвер должен выделить для массива, получающего полученную информацию. Если QueryInfo не NULL, расположение должно содержать указанное количество байтов.

[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, AuxKlibQueryModuleInformation записывает требуемый размер буфера в расположение, на которое BufferSize указывает.

Возвращаемое значение

AuxKlibQueryModuleInformation возвращает STATUS_SUCCESS, если операция выполнена успешно. AuxKlibQueryModuleInformation возвращает STATUS_BUFFER_TOO_SMALL, если указатель QueryInfo не NULL, а значение BufferSize, предоставленное драйвером, слишком мало.

Подпрограмма может возвращать другие значения NTSTATUS .

Замечания

Чтобы получить сведения о загруженных модулях образа операционной системы, драйвер должен:

  1. Вызов AuxKlibQueryModuleInformation с указателем NULLQueryInfo. После AuxKlibQueryModuleInformation расположение, на которое указывает параметр BufferSize, будет содержать количество байтов, которые драйвер должен выделить для массива.
  2. Вызовите подпрограмму выделения памяти, например ExAllocatePoolWithTag, чтобы выделить буфер для массива.
  3. Снова вызовите AuxKlibQueryModuleInformation. На этот раз указатель QueryInfo должен содержать адрес выделенного буфера. После AuxKlibQueryModuleInformation буфер содержит массив сведений о модуле.
Число загруженных модулей может меняться между первым и вторым вызовами на AuxKlibQueryModuleInformation. В результате второй вызов AuxKlibQueryModuleInformation может возвращать STATUS_BUFFER_TOO_SMALL даже если драйвер выделяет буфер, основанный на размере, полученном из первого вызова.

Если вызов AuxKlibQueryModuleInformation выполнен, подпрограмма записывает значение ImageBase для каждого элемента в массиве QueryInfo. Каждое значение ImageBase — это указатель на базу загруженного образа драйвера. Этот указатель остается допустимым только в то время как драйвер остается загруженным. Вызывающий объект должен предположить, что драйвер можно выгрузить в любое время, если вызывающий объект не может гарантировать в противном случае. Например, драйвер может быть выгружен между вызовом AuxKlibQueryModuleInformation, который получает указатель на образ драйвера и вызов AuxKlibGetImageExportDirectory, использующий этот указатель.

Драйверы должны вызывать AuxKlibInitialize перед вызовом AuxKlibQueryModuleInformation.

Примеры

В следующем примере кода показаны шаги, перечисленные в предыдущем разделе "Примечания".

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.
целевая платформа Всеобщий
заголовка aux_klib.h (включить Aux_klib.h)
библиотеки Aux_Klib.lib
IRQL PASSIVE_LEVEL

См. также

AUX_MODULE_BASIC_INFO

AUX_MODULE_EXTENDED_INFO

AuxKlibGetImageExportDirectory

AuxKlibInitialize

ExAllocatePoolWithTag