ExAllocatePoolWithQuotaTag 루틴은 풀 메모리를 할당하여 현재 프로세스에 대한 할당량을 청구합니다.
경고
ExAllocatePoolWithQuotaTag는 Windows 10 버전 2004에서 더 이상 사용되지 않으며 ExAllocatePool2대체되었습니다. 자세한 내용은 더 이상 사용되지 않는 ExAllocatePool 호출을 ExAllocatePool2 및 ExAllocatePool3 업데이트하는참조하세요.
통사론
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
할당된 메모리의 풀 태그를 지정합니다. 자세한 내용은 ExAllocatePoolWithTagTag 매개 변수를 참조하세요.
반환 값
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(비균등 메모리 액세스) 다중 프로세서 아키텍처에서 ExAllocatePoolWithQuotaTagExAllocatePoolWithQuotaTag호출하는 프로세서에 로컬 메모리를 할당하려고 시도합니다. 사용할 수 있는 로컬 메모리가 없는 경우 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) |