AuxKlibQueryModuleInformation 함수(aux_klib.h)

AuxKlibQueryModuleInformation 루틴은 운영 체제가 로드한 이미지 모듈에 대한 정보를 검색합니다.

구문

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

매개 변수

[in, out] BufferSize

버퍼 크기를 포함하거나 받는 위치에 대한 포인터(바이트)입니다. QueryInfoNULL인 경우 위치는 드라이버가 검색된 정보를 수신하는 배열에 할당해야 하는 바이트 수를 받습니다. QueryInfoNULL이 아닌 경우 위치에 지정된 바이트 수가 포함되어야 합니다.

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

반환 값

작업이 성공하면 AuxKlibQueryModuleInformation은 STATUS_SUCCESS 반환합니다. AuxKlibQueryModuleInformationQueryInfo 포인터가 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