다음을 통해 공유


ExAllocatePool2 함수(wdm.h)

ExAllocatePool2 루틴은 지정된 형식의 풀 메모리를 할당하고 할당된 블록에 대한 포인터를 반환합니다.

구문

DECLSPEC_RESTRICT PVOID ExAllocatePool2(
  POOL_FLAGS Flags,
  SIZE_T     NumberOfBytes,
  ULONG      Tag
);

매개 변수

Flags

필요한 특성 및 선택적 특성과 함께 풀 메모리 유형을 지정하는 ULONG64 형식의 값입니다. 비트 단위 OR를 사용하여 여러 플래그 값을 결합할 수 있습니다. 가능한 값은 POOL_FLAGS 참조하세요.

NumberOfBytes

할당할 바이트 수를 0이 아닌 수로 지정합니다.

Tag

할당된 메모리에 사용할 풀 태그입니다. 풀 태그를 작은따옴표로 구분된 1~4자의 0이 아닌 문자 리터럴로 지정합니다(예 Tag1: ). 문자열은 일반적으로 역순으로 지정됩니다(예: 1gaT). 태그의 각 ASCII 문자는 0x7E(타일)에 0x20(공간) 범위의 값이어야 합니다. 각 할당 코드 경로는 디버거와 검증 도구가 코드 경로를 식별하는 데 도움이 되도록 고유한 풀 태그를 사용해야 합니다.

반환 값

ExAllocatePool2 는 할당된 메모리에 대한 포인터를 반환합니다.

다음 조건으로 인해 함수는 기본적으로 NULL을 반환합니다. POOL_FLAG_RAISE_ON_FAILURE 지정하면 함수에서 예외가 발생합니다.

  • 메모리 부족
  • 태그 가 0으로 설정되었거나 잘못된 POOL_FLAGS 지정됨

설명

Windows 10 버전 2004 이전의 Windows 버전을 대상으로 하는 드라이버를 빌드하는 경우 ExAllocatePoolZero, ExAllocatePoolUninitialized, ExAllocatePoolQuotaZero 또는 ExAllocatePoolQuotaUninitialized를 사용합니다.

이 루틴은 이전 할당 루틴과 다음과 같은 차이점이 있습니다(ExAllocatePoolWithTag, ExAllocatePoolWithQuotaTag, ExAllocatePoolWithTagPriority).

  1. POOL_FLAG_UNINITIALIZED 지정하지 않으면 메모리가 초기화되지 않습니다.

  2. 할당에 실패한 경우 동작을 반환합니다. ExAllocatePoolWithQuotaTag 는 기본적으로 예외를 발생합니다.

  3. 값이 0인 태그가 잘못되었습니다.

ExAllocatePoolWithQuotaTagExAllocatePool2로 바꾸는 경우 POOL_FLAG_USE_QUOTA 플래그를 지정해야 합니다. 풀 플래그에 대한 자세한 내용은 POOL_FLAGS.

NumberOfBytes 이상이 PAGE_SIZE 면 페이지 정렬 버퍼가 할당됩니다. 이하의 PAGE_SIZE 메모리 할당은 페이지 내에서 할당되며 페이지 경계를 넘지 않습니다. 보다 PAGE_SIZE 작은 메모리 할당은 반드시 페이지 정렬은 아니지만 32비트 시스템의 8비트 경계와 64비트 시스템의 16비트 경계에 맞춰집니다.

드라이버는 명시적으로 할당한 NumberOfBytes 까지만 사용할 수 있습니다. 이 범위를 벗어난 메모리에 액세스하면 풀이 손상되어 시스템이 충돌할 수 있습니다.

시스템은 풀 태그를 할당된 메모리와 연결합니다. WinDbg와 같은 프로그래밍 도구는 할당된 각 버퍼와 연결된 풀 태그를 표시할 수 있습니다. Windows용 디버깅 도구에 포함된 도구인 Gflags는 특정 풀 태그에 대한 특수 풀에서 할당을 요청하는 시스템 기능을 설정합니다. WDK에 포함된 Poolmon은 풀 태그별로 메모리를 추적합니다.

Tag 값은 역방향(little-endian) 순서로 저장되고 경우에 따라 표시됩니다. 예를 들어 호출자가 태그로 전달 Fred 되면 풀 덤프 및 디버거의 풀 사용량 추적에서 로 표시 derF 되고 레지스트리 및 도구에서와 같이 0x64657246 표시됩니다.

ExFreePool 또는 ExFreePoolWithTag를 사용하여 할당된 버퍼를 해제할 수 있습니다.

ExAllocatePool2의 호출자는 IRQL <= DISPATCH_LEVEL 실행되어야 합니다. DISPATCH_LEVEL 실행되는 호출자는 플래그POOL_FLAG_NON_PAGED 또는 POOL_FLAG_NON_PAGED_EXECUTABLE 지정해야 합니다. IRQL <= APC_LEVEL 실행되는 호출자는 POOL_FLAG_PAGED 지정할 수 있지만 DISPATCH_LEVEL 실행되는 코드에서 메모리에 액세스하는 경우에도 페이징되지 않은 메모리를 할당해야 합니다.

NUMA(비균등 메모리 액세스) 다중 프로세서 아키텍처에서 ExAllocatePool2ExAllocatePool2를 호출하는 프로세서에 로컬인 메모리를 할당하려고 시도합니다. 사용할 수 있는 로컬 메모리가 없는 경우 ExAllocatePool2 는 사용 가능한 가장 가까운 메모리를 할당합니다.

ExAllocatePool2에서 할당하는 메모리는 0이 초기화됩니다. 커널 모드 드라이버는 중요한 정보가 공개되지 않도록 신뢰할 수 없는 위치(사용자 모드, 네트워크를 통해 등)로 복사되는 할당에 대해 0을 옵트아웃해서는 안 됩니다.

요구 사항

요구 사항
지원되는 최소 클라이언트 Windows 10, 버전 2004
대상 플랫폼 유니버설
헤더 wdm.h(Wdm.h, Ntddk.h, Ntifs.h 포함)
라이브러리 NtosKrnl.lib
DLL NtosKrnl.exe
IRQL IRQL <= DISPATCH_LEVEL(주의 섹션 참조)
DDI 규정 준수 규칙 HwStorPortProhibitedDDIs, SpNoWait, StorPortStartIo

추가 정보

ExAllocatePool3