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


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

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

Синтаксис

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

Параметры

[in, out] BufferSize

Указатель на расположение, содержащее или получающее размер буфера в байтах. Если параметр QueryInfo имеет значение NULL, расположение получает количество байтов, которое драйвер должен выделить для массива, получающего полученные сведения. Если значение 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 с указателем QueryInfo NULL. После возврата 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