다음을 통해 공유


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 플래그를 사용하여 bitwise-ORing하여 PoolType 값을 수정할 수 있습니다. 이 플래그는 요청을 충족할 수 없는 경우 예외가 발생합니다. 비용이 많이 들기 때문에 POOL_RAISE_IF_ALLOCATION_FAILURE 플래그를 사용하지 않는 것이 좋습니다.

마찬가지로 이 값을 POOL_COLD_ALLOCATION 플래그를 커널에 대한 힌트로 사용하여 이 값을 비트 단위로 수정하여 풀타입 값을 수정하여 빠르게 페이징될 가능성이 있는 페이지의 메모리를 할당할 수 있습니다. 상주 풀 메모리의 양을 최대한 줄이려면 이러한 할당을 자주 참조해서는 안 됩니다. POOL_COLD_ALLOCATION 플래그는 권고일 뿐입니다.

[in] NumberOfBytes

할당할 바이트 수입니다.

[in] Tag

할당된 메모리에 사용할 풀 태그입니다. 풀 태그를 작은따옴표로 구분된 1~4자의 0이 아닌 문자 리터럴로 지정합니다(예: 'Tag1'). 문자열은 일반적으로 역순으로 지정됩니다(예: '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 및 환경도 페이지 유형을 결정하는 데 고려해야 합니다.

NumberOfBytes = 0을 설정하지 마세요. 풀 헤더 공간을 낭비하고 대부분의 경우 호출 코드에서 잠재적인 유효성 검사 문제를 나타내므로 길이가 0인 할당을 방지합니다. 이러한 이유로 드라이버 검증 도구는 이러한 할당에 가능한 오류로 플래그를 지정합니다.

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

ExAllocatePoolWithTag가 할당하는 메모리는 초기화되지 않습니다. 커널 모드 드라이버는 잠재적으로 권한 있는 콘텐츠가 누출되지 않도록 사용자 모드 소프트웨어에 표시하려면 먼저 이 메모리를 0으로 설정해야 합니다.

요구 사항

요구 사항
대상 플랫폼 유니버설
헤더 wdm.h(Wdm.h, Ntddk.h, Ntifs.h 포함)
라이브러리 NtosKrnl.lib
DLL NtosKrnl.exe
IRQL IRQL <= DISPATCH_LEVEL(주의 섹션 참조)
DDI 규정 준수 규칙 CheckDeviceObjectFlags(wdm), HwStorPortProhibitedDDIs(storport), IrqlExAllocatePool(wdm), IrqlExFree1(wdm), PowerDownAllocate(wdm), PowerUpFail(wdm), SpNoWait(storport), StorPortStartIo(storport), UnsafeAllocatePool(kmdf), UnsafeAllocatePool(wdm)

추가 정보

ExAllocatePoolWithQuotaTag

ExAllocatePoolWithTagPriority

ExFreePool

ExFreePoolWithTag

POOL_TYPE