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 BufferS ize가 가리키는 위치에 필요한 버퍼 크기를 씁니다.

반환 값

AuxKlibQueryModuleInformation 작업이 성공하면 STATUS_SUCCESS 반환합니다. AuxKlibQueryModuleInformation QueryInfo 포인터가 NULL 않고 드라이버 제공 BufferSize 값이 너무 작으면 STATUS_BUFFER_TOO_SMALL 반환합니다.

루틴은다른 NTSTATUS 값을 반환할 수 있습니다.

발언

운영 체제의 로드된 이미지 모듈에 대한 정보를 얻으려면 드라이버는 다음을 수행해야 합니다.

  1. NULLQueryInfo 포인터를 사용하여 AuxKlibQueryModuleInformation 호출합니다. AuxKlibQueryModuleInformation 반환되면 BufferSize 매개 변수가 가리키는 위치에 드라이버가 배열에 할당해야 하는 바이트 수가 포함됩니다.
  2. ExAllocatePoolWithTag같은 메모리 할당 루틴을 호출하여 배열에 대한 버퍼를 할당합니다.
  3. AuxKlibQueryModuleInformation 다시 호출합니다. 이번에는 QueryInfo 포인터에 할당된 버퍼의 주소가 포함되어야 합니다. AuxKlibQueryModuleInformation 반환되면 버퍼에는 모듈 정보 배열이 포함됩니다.
로드된 모듈의 수는 AuxKlibQueryModuleInformation대한 첫 번째 호출과 두 번째 호출 간에 변경될 수 있습니다. 따라서 드라이버가 첫 번째 호출에서 가져온 크기에 따라 버퍼를 할당하더라도 AuxKlibQueryModuleInformation 두 번째 호출은 STATUS_BUFFER_TOO_SMALL 반환할 수 있습니다.

AuxKlibQueryModuleInformation 호출이 성공하면 루틴은 QueryInfo 배열의 각 요소에 ImageBase 값을 씁니다. 각 ImageBase 값은 로드된 드라이버 이미지의 기반에 대한 포인터입니다. 이 포인터는 드라이버가 로드된 상태로 유지되는 동안에만 유효합니다. 호출자는 호출자가 달리 보장할 수 없는 한 언제든지 드라이버를 언로드할 수 있다고 가정해야 합니다. 예를 들어 드라이버 이미지에 대한 포인터를 가져오는 AuxKlibQueryModuleInformation 호출과 이 포인터를 사용하는 AuxKlibGetImageExportDirectory 호출 간에 드라이버가 언로드될 수 있습니다.

드라이버는 AuxKlibQueryModuleInformation호출하기 전에 AuxKlibInitialize 호출해야 합니다.

예제

다음 코드 예제에서는 이전 주의 섹션에 나열된 단계를 보여 줍니다.

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