ExAllocatePool2 함수(wdm.h)
ExAllocatePool2 루틴은 지정된 형식의 풀 메모리를 할당하고 할당된 블록에 대한 포인터를 반환합니다.
통사론
DECLSPEC_RESTRICT PVOID ExAllocatePool2(
POOL_FLAGS Flags,
SIZE_T NumberOfBytes,
ULONG Tag
);
매개 변수
Flags
필요한 특성 및 선택적 특성과 함께 풀 메모리의 형식을 지정하는 ULONG64 형식의 값입니다. 비트 단위 OR를 사용하여 여러 플래그 값을 결합할 수 있습니다. 가능한 값은 POOL_FLAGS 참조하세요.
NumberOfBytes
할당할 바이트 수를 0이 아닌 수로 지정합니다.
Tag
할당된 메모리에 사용할 풀 태그입니다. 풀 태그를 작은따옴표(예: Tag1
)로 구분된 1~4자의 0이 아닌 문자 리터럴로 지정합니다. 문자열은 일반적으로 역순으로 지정됩니다(예: 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)에서 다음과 같은 차이점이 있습니다.
POOL_FLAG_UNINITIALIZED 지정하지 않으면 메모리가 초기화되지 않습니다.
할당에 실패한 경우의 동작을 반환합니다. ExAllocatePoolWithQuotaTag 기본적으로 예외가 발생합니다.
값이 0인 태그가 잘못되었습니다.
ExAllocatePoolWithQuotaTagExAllocatePool2바꿀 때 POOL_FLAG_USE_QUOTA 플래그를 지정해야 합니다. 풀 플래그에 대한 자세한 내용은 POOL_FLAGS참조하세요.
NumberOfBytesPAGE_SIZE
이상이면 페이지 맞춤 버퍼가 할당됩니다.
PAGE_SIZE
이하의 메모리 할당은 페이지 내에서 할당되며 페이지 경계를 넘지 않습니다.
PAGE_SIZE
미만의 메모리 할당은 반드시 페이지 정렬은 아니지만 32비트 시스템의 8비트 경계와 64비트 시스템의 16비트 경계에 맞춰집니다.
드라이버는 명시적으로 할당된 최대 NumberOfBytes만 사용할 수 있습니다. 이 범위를 벗어난 메모리에 액세스하면 풀이 손상되어 시스템이 충돌할 수 있습니다.
시스템은 풀 태그를 할당된 메모리와 연결합니다. WinDbg와 같은 프로그래밍 도구는 할당된 각 버퍼와 연결된 풀 태그를 표시할 수 있습니다. Windows용 디버깅 도구에 포함된 도구인 Gflags는 특정 풀 태그에 대한 특수 풀에서 할당을 요청하는 시스템 기능을 설정합니다. WDK에 포함된 Poolmon은 풀 태그별로 메모리를 추적합니다.
태그 값은 역방향(little-endian) 순서로 저장되고 때로는 표시됩니다. 예를 들어 호출자가 Fred
태그로 전달하는 경우 풀 덤프 및 디버거의 풀 사용 추적에서 derF
표시되고 레지스트리 및 도구에서 0x64657246
표시됩니다.
할당된 버퍼는 exFreePool 또는 ExFreePoolWithTag 사용하여 해제할 수 있습니다.
ExAllocatePool2 호출자는 IRQL <= DISPATCH_LEVEL 실행되어야 합니다. DISPATCH_LEVEL 실행 중인 호출자는 Flags대한 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 |