ExAllocatePoolWithTag 함수(wdm.h)
ExAllocatePoolWithTag 루틴은 지정된 형식의 풀 메모리를 할당하고 할당된 블록에 대한 포인터를 반환합니다.
중요
ExAllocatePoolWithTag는 Windows 10 버전 2004에서 더 이상 사용되지 않으며 ExAllocatePool2로 대체되었습니다. 자세한 내용은 ExAllocatePool2 및 ExAllocatePool3에 대한 사용되지 않는 ExAllocatePool 호출 업데이트를 참조하세요.
구문
PVOID ExAllocatePoolWithTag(
[in] __drv_strictTypeMatch(__drv_typeExpr)POOL_TYPE PoolType,
[in] SIZE_T NumberOfBytes,
[in] ULONG Tag
);
매개 변수
[in] PoolType
할당할 풀 메모리의 형식입니다. 사용 가능한 풀 메모리 형식에 대한 설명은 POOL_TYPE 참조하세요.
이 값을 POOL_RAISE_IF_ALLOCATION_FAILURE 플래그로 비트 ORing하여 PoolType 값을 수정할 수 있습니다. 이 플래그를 사용하면 요청을 충족할 수 없는 경우 예외가 발생합니다. 비용이 많이 들기 때문에 POOL_RAISE_IF_ALLOCATION_FAILURE 플래그를 사용하지 않는 것이 좋습니다.
마찬가지로, 이 값을 커널에 대한 힌트로 POOL_COLD_ALLOCATION 플래그로 비트 ORing하여 PoolType 값을 수정하여 빠르게 페이징될 가능성이 있는 페이지의 메모리를 할당할 수 있습니다. 상주 풀 메모리의 양을 최대한 줄이려면 이러한 할당을 자주 참조해서는 안 됩니다. POOL_COLD_ALLOCATION 플래그는 권고에 불과하며 Windows XP부터 지원됩니다.
[in] NumberOfBytes
할당할 바이트 수입니다.
[in] Tag
할당된 메모리에 사용할 풀 태그입니다. 풀 태그를 작은따옴표(예: 'Tag1')로 구분된 1~4자의 0이 아닌 문자 리터럴로 지정합니다. 문자열은 일반적으로 역순으로 지정됩니다(예: '1gaT'). 태그의 각 ASCII 문자는 0x7E(타일)에 0x20(공백) 범위의 값이어야 합니다. 각 할당 코드 경로는 디버거와 검증 도구가 코드 경로를 식별하는 데 도움이 되도록 고유한 풀 태그를 사용해야 합니다.
반환 값
ExAllocatePoolWithTag 는 요청을 충족하기 위해 사용 가능한 풀에 메모리가 부족한 경우 NULL 을 반환합니다. 그렇지 않으면 루틴은 할당된 메모리에 대한 포인터를 반환합니다.
설명
이 루틴은 메모리의 일반 풀 할당에 사용됩니다.
NumberOfBytes가 PAGE_SIZE 이상인 경우 페이지 정렬 버퍼가 할당됩니다. PAGE_SIZE 이하의 메모리 할당은 페이지 내에서 할당되며 페이지 경계를 넘지 않습니다. PAGE_SIZE 미만의 메모리 할당은 반드시 페이지 정렬은 아니지만 32비트 시스템의 8 바이트 경계와 64비트 시스템의 16비트 경계에 맞춰집니다.
페이징하지 않은 풀의 numberOfBytes < PAGE_SIZE 요청하는 성공적인 할당은 호출자에게 요청된 메모리 바이트 수를 정확하게 제공합니다. NumberOfBytes > PAGE_SIZE 대한 할당 요청이 성공하고 NumberOfBytes가 정확한 PAGE_SIZE 배수가 아닌 경우 할당의 마지막 페이지에는 호출자 할당의 일부가 아닌 바이트가 포함됩니다. 가능하면 풀 할당자는 이러한 바이트를 사용합니다. 다른 커널 모드 구성 요소에 속하는 데이터가 손상되는 것을 방지하려면 드라이버는 명시적으로 할당된 스토리지 주소에만 액세스해야 합니다.
시스템은 풀 태그를 할당된 메모리와 연결합니다. WinDbg와 같은 프로그래밍 도구는 할당된 각 버퍼와 연결된 풀 태그를 표시할 수 있습니다. Windows 디버깅 도구에 포함된 도구인 Gflags는 특정 풀 태그에 대한 특수 풀에서 할당을 요청하는 시스템 기능을 켭니다. WDK에 포함된 Poolmon은 풀 태그별로 메모리를 추적합니다.
Tag 값은 역방향(little-endian) 순서로 저장되고 경우에 따라 표시됩니다. 예를 들어 호출자가 'Fred'를 태그로 전달하는 경우 풀 덤프 및 디버거의 풀 사용량 추적에서 "derF"로 표시되고 레지스트리 및 도구에서 0x64657246 표시됩니다.
할당된 버퍼는 ExFreePool 또는 ExFreePoolWithTag를 사용하여 해제할 수 있습니다.
풀(페이징 또는 페이징되지 않은)의 양이 높거나 낮을 때 시스템은 특정 표준 이벤트 개체를 자동으로 설정합니다. 드라이버는 이러한 이벤트가 풀 사용량을 튜닝할 때까지 기다릴 수 있습니다. 자세한 내용은 표준 이벤트 개체를 참조하세요.
ExAllocatePoolWithTag의 호출자는 IRQL <= DISPATCH_LEVEL 실행되어야 합니다. DISPATCH_LEVEL 실행되는 호출자는 PoolType에 대해 NonPagedXxx 값을 지정해야 합니다. IRQL <= APC_LEVEL 실행되는 호출자는 POOL_TYPE 값을 지정할 수 있지만 IRQL 및 환경도 페이지 형식을 결정하는 데 고려해야 합니다.
요구 사항
| 지원되는 최소 클라이언트 | Windows 2000부터 사용할 수 있습니다. |
| 대상 플랫폼 | 유니버설 |
| 헤더 | wdm.h(Wdm.h, Ntddk.h, Ntifs.h 포함) |
| 라이브러리 | NtosKrnl.lib |
| DLL | NtosKrnl.exe |
| IRQL | <= DISPATCH_LEVEL(주의 섹션 참조) |
| DDI 규정 준수 규칙 | CheckDeviceObjectFlags(wdm), HwStorPortProhibitedDDIs(storport), IrqlExAllocatePool(wdm), IrqlExFree1(wdm), PowerDownAllocate(wdm), PowerUpFail(wdm), SpNoWait(storport), StorPortStartIo(storport), UnsafeAllocatePool(kmdf), UnsafeAllocatePool(wdm) |
참고 항목
피드백
다음에 대한 사용자 의견 제출 및 보기