ExAllocatePoolWithQuotaTag 함수(wdm.h)
ExAllocatePoolWithQuotaTag 루틴은 풀 메모리를 할당하여 현재 프로세스에 대한 할당량을 청구합니다.
경고
ExAllocatePoolWithQuotaTag는 Windows 10 버전 2004에서 더 이상 사용되지 않으며 ExAllocatePool2로 대체되었습니다. 자세한 내용은 ExAllocatePool2 및 ExAllocatePool3에 더 이상 사용되지 않는 ExAllocatePool 호출 업데이트를 참조하세요.
구문
PVOID ExAllocatePoolWithQuotaTag(
[in] __drv_strictTypeMatch(__drv_typeExpr)POOL_TYPE PoolType,
[in] SIZE_T NumberOfBytes,
[in] ULONG Tag
);
매개 변수
[in] PoolType
할당할 풀 메모리의 유형을 지정합니다. 사용 가능한 풀 메모리 유형에 대한 설명은 POOL_TYPE 참조하세요.
이 값을 POOL_QUOTA_FAIL_INSTEAD_OF_RAISE 플래그로 비트 ORing하여 PoolType 값을 수정할 수 있습니다. 이 플래그를 사용하면 요청을 충족할 수 없는 경우 루틴이 NULL 값을 반환합니다.
마찬가지로 이 값을 커널에 대한 힌트로 POOL_COLD_ALLOCATION 플래그로 비트 ORing하여 PoolType 값을 수정하여 빠르게 페이징될 가능성이 있는 페이지의 메모리를 할당할 수 있습니다. 상주 풀 메모리의 양을 최대한 줄이려면 이러한 할당을 자주 참조해서는 안 됩니다. POOL_COLD_ALLOCATION 플래그는 권고에 불과하며 Windows XP 이상 버전의 Windows 운영 체제에서 지원됩니다.
[in] NumberOfBytes
할당할 바이트 수를 지정합니다.
[in] Tag
할당된 메모리의 풀 태그를 지정합니다. 자세한 내용은 ExAllocatePoolWithTag의 Tag 매개 변수를 참조하세요.
반환 값
ExAllocatePoolWithQuotaTag 는 할당된 풀에 대한 포인터를 반환합니다.
요청을 충족할 수 없는 경우 exAllocatePoolWithQuotaTag 는 POOL_QUOTA_FAIL_INSTEAD_OF_RAISE 지정하지 않는 한 예외를 발생합니다. 성능상의 이유로 POOL_QUOTA_FAIL_INSTEAD_OF_RAISE 사용하는 것이 좋습니다.
설명
이 루틴은 원래 I/O 요청을 수행한 프로세스의 컨텍스트에서 요청을 충족하기 위해 메모리를 할당하는 최상위 드라이버에 의해 호출됩니다. 하위 수준 드라이버는 ExAllocatePoolWithTag 를 대신 호출합니다.
NumberOfBytes가 PAGE_SIZE 이상인 경우 페이지 맞춤 버퍼가 할당됩니다. PAGE_SIZE 이하의 메모리 할당은 페이지 내에 할당되며 페이지 경계를 넘지 않습니다. PAGE_SIZE 미만의 메모리 할당은 반드시 페이지 정렬은 아니지만 32비트 시스템의 8 바이트 경계와 64비트 시스템의 16 바이트 경계에 맞춰집니다.
시스템은 풀 태그를 할당된 메모리와 연결합니다. WinDbg와 같은 프로그래밍 도구는 할당된 각 버퍼와 연결된 풀 태그를 표시할 수 있습니다. 태그 값은 일반적으로 역순으로 표시됩니다. 예를 들어 호출자가 'Fred'를 태그로 전달하는 경우 풀이 덤프되거나 디버거에서 풀 사용량을 추적할 때 'derF'로 표시됩니다.
할당된 버퍼는 ExFreePool 또는 ExFreePoolWithTag를 사용하여 해제할 수 있습니다.
NumberOfBytes = 0을 설정하지 마세요. 풀 헤더 공간을 낭비하고 대부분의 경우 호출 코드에서 잠재적인 유효성 검사 문제를 나타내므로 길이가 0인 할당을 방지합니다. 이러한 이유로 드라이버 검증 도구 는 이러한 할당에 가능한 오류로 플래그를 지정합니다.
풀의 양(페이징 또는 페이징되지 않음)이 높거나 낮을 때 시스템은 특정 표준 이벤트 개체를 자동으로 설정합니다. 드라이버는 이러한 이벤트가 풀 사용량을 조정할 때까지 기다릴 수 있습니다. 자세한 내용은 표준 이벤트 개체를 참조하세요.
NUMA(비균등 메모리 액세스) 다중 프로세서 아키텍처에서 ExAllocatePoolWithQuotaTag 는 ExAllocatePoolWithQuotaTag를 호출하는 프로세서에 로컬인 메모리를 할당하려고 시도합니다. 사용할 수 있는 로컬 메모리가 없는 경우 ExAllocatePoolWithQuotaTag 는 사용 가능한 가장 가까운 메모리를 할당합니다.
ExAllocatePoolWithQuotaTag가 할당하는 메모리는 초기화되지 않습니다. 커널 모드 드라이버는 사용자 모드 소프트웨어에 표시하려면 먼저 이 메모리를 0으로 설정해야 합니다(잠재적으로 권한 있는 콘텐츠가 누출되지 않도록 방지).
ExAllocatePoolWithQuotaTag의 호출자는 IRQL <= DISPATCH_LEVEL 실행되어야 합니다. DISPATCH_LEVEL 실행되는 호출자는 PoolType에 대해 NonPagedXxx 값을 지정해야 합니다. IRQL <= APC_LEVEL 실행되는 호출자는 모든 POOL_TYPE 값을 지정할 수 있지만 IRQL 및 환경도 풀 유형을 결정하는 데 고려해야 합니다.
요구 사항
요구 사항 | 값 |
---|---|
대상 플랫폼 | 유니버설 |
헤더 | wdm.h(Wdm.h, Ntddk.h, Ntifs.h 포함) |
라이브러리 | NtosKrnl.lib |
DLL | NtosKrnl.exe |
IRQL | <= DISPATCH_LEVEL(설명 섹션 참조) |
DDI 규정 준수 규칙 | HwStorPortProhibitedDDIs(storport), SpNoWait(storport), StorPortStartIo(storport), UnsafeAllocatePool(kmdf) |