다음을 통해 공유


ExInitializePagedLookasideList 함수(wdm.h)

ExInitializePagedLookasideList 루틴은 지정된 크기의 페이징 가능한 항목에 대한 lookaside 목록을 초기화합니다.

구문

void ExInitializePagedLookasideList(
  [out]          PPAGED_LOOKASIDE_LIST Lookaside,
  [in, optional] PALLOCATE_FUNCTION    Allocate,
  [in, optional] PFREE_FUNCTION        Free,
  [in]           ULONG                 Flags,
  [in]           SIZE_T                Size,
  [in]           ULONG                 Tag,
  [in]           USHORT                Depth
);

매개 변수

[out] Lookaside

초기화할 PAGED_LOOKASIDE_LIST 구조체에 대한 포인터입니다. 호출자는 이 lookaside 목록의 항목이 페이징 가능한 메모리에서 할당되더라도 구조체에 페이징되지 않은 시스템 공간을 사용해야 합니다. 64비트 플랫폼에서 이 구조체는 16비트 정렬되어야 합니다.

[in, optional] Allocate

lookaside 목록이 비어 있을 때 항목을 할당하기 위한 호출자 제공 함수 또는 NULL에 대한 포인터입니다. NULL이 아닌 경우 포인터는 프로토타입을 사용하는 함수에 대한 것입니다.

PVOID XxxAllocate(
  __in POOL_TYPE  PoolType,           // PagedPool 
  __in SIZE_T  NumberOfBytes,         // value of Size
  __in ULONG  Tag                     // value of Tag
);

Allocate 매개 변수가 NULL이면 lookaside 목록이 비어 있을 때마다 ExAllocateFromPagedLookasideList에 대한 후속 호출이 자동으로 항목을 할당합니다.

[in, optional] Free

lookaside 목록이 가득 찼을 때마다 항목을 해제하기 위한 호출자 제공 함수 또는 NULL에 대한 포인터입니다. NULL이 아닌 경우 포인터는 프로토타입을 사용하는 함수에 대한 것입니다.

VOID XxxFree(
  __in PVOID  Buffer
);

Free 매개 변수가 NULL인 경우 ExFreeToPagedLookasideList에 대한 후속 호출은 목록이 가득 찼을 때마다 지정된 항목을 페이징 풀로 자동으로 해제합니다. 즉, 현재 시스템에서 결정한 최대 항목 수를 보유합니다.

[in] Flags

Windows 8 이 매개 변수는 ExInitializePagedLookasideList 루틴의 기본 동작을 수정하는 선택적 플래그 값을 지정합니다. 호환되는 플래그 비트에는 다음이 포함됩니다.

플래그 비트 의미
POOL_RAISE_IF_ALLOCATION_FAILURE 할당이 실패하면 예외를 발생합니다.

POOL_NX_ALLOCATION 플래그를 지정해도 아무런 효과가 없습니다. 모든 페이징 가능한 메모리는 NX로 할당됩니다.

Windows 8 전에 이 매개 변수는 사용되지 않으며 0이어야 합니다.

[in] Size

lookaside 목록에 있는 각 항목의 크기(바이트)를 지정합니다.

[in] Tag

lookaside 목록 항목을 할당할 때 사용할 풀 태그를 지정합니다. 풀 태그에 대한 자세한 내용은 ExAllocatePoolWithTagTag 매개 변수를 참조하세요.

[in] Depth

예약되어 있습니다. 0이어야 합니다.

반환 값

없음

설명

ExInitializePagedLookasideList를 호출한 후 호출자 지정 Size의 블록을 에서 할당하고 ExAllocateFromPagedLookasideListExFreeToPagedLookasideList를 각각 호출하여 lookaside 목록으로 해제할 수 있습니다. 이러한 동적으로 할당되고 해제된 항목은 시스템이 실행되는 동안 호출자가 사용하는 모든 데이터 구조 또는 고정 크기 버퍼일 수 있으며, 특히 호출자가 특정 순간에 사용할 항목 수를 미리 확인할 수 없는 경우 입니다. 각 고정 크기 항목의 레이아웃 및 콘텐츠는 호출자가 결정합니다.

ExInitializePagedLookasideList 는 다음과 같이 시스템 상태를 초기화하여 지정된 lookaside 목록의 사용량을 추적합니다.

  • 항목에 대해 유지 관리할 카운터를 0으로 초기화합니다.

  • 호출자가 제공한 Xxx할당XxxFree 루틴의 진입점을 저장하거나 이러한 진입점을 각각 ExAllocatePoolWithTagExFreePool로 설정합니다.

  • 시스템 스핀 잠금을 초기화하여 할당을 제어하고 필요한 경우 다중 프로세서로부터 안전한 방식으로 lookaside 목록으로 해제합니다.

  • 호출자가 제공한 항목 크기 및 목록 태그를 저장 합니다.

  • 조회 목록에 보관할 항목 수에 대한 시스템 결정 제한(최소 및 최대값)을 설정합니다. 이 제한은 시스템 차원의 항목 수요가 예상보다 높거나 낮은 경우 나중에 조정할 수 있습니다.

  • 나중에 항목이 할당될 메모리 유형을 제어하는 시스템 결정 플래그를 설정합니다.

시스템은 사용 중인 모든 lookaside 목록 집합을 유지 관리합니다. 시스템이 실행되는 동안 lookaside 목록 항목 및 사용 가능한 페이징 메모리에 대한 수요가 달라짐에 따라 시스템은 페이징된 각 lookaside 목록에 동적으로 보관할 항목 수에 대한 제한을 조정합니다.

드라이버는 언로드하기 전에 만든 모든 lookaside 목록을 항상 명시적으로 해제해야 합니다. 그렇지 않으면 심각한 프로그래밍 오류입니다. ExDeletePagedLookasideList를 사용하여 목록을 해제합니다.

ExInitializePagedLookasideList 는 호출자가 제공한 위치에서 불투명 목록 헤드를 설정하지만 목록 항목에 대한 메모리를 미리 할당하지 않습니다. 그 후 ExAllocateFromPagedLookasideList 에 대한 호출이 발생할 때 초기 항목이 동적으로 할당되고 ExFreeToPagedLookasideList 에 대한 상호 호출이 발생하면 이러한 초기 항목이 lookaside 목록에 유지됩니다. 시스템 결정 최대값에 도달할 때까지 지정된 lookaside 목록에서 항목이 수집되며, 추가 항목은 해제될 때 페이징된 풀로 반환됩니다. 목록이 비어 있으면 목록 초기화에 지정된 XxxAllocate 함수 또는 ExAllocatePoolWithTag에 의해 할당 요청이 충족됩니다.

lookaside 목록의 사용자가 고정 크기 항목을 할당하고 해제할 때마다 ExInitializePagedLookasideList할당무료 매개 변수에 대해 NULL 포인터를 전달하는 것이 더 효율적입니다. 그러나 lookaside 목록을 사용하는 모든 구성 요소는 할당하고 해제하는 항목 수에 대한 상태를 유지 관리하여 자체 동적 메모리 사용량을 추적하는 것과 같은 추가 호출자 결정 처리를 수행하는 이러한 함수를 제공할 수 있습니다.

ExInitializePagedLookasideList의 호출자가 XxxAllocate 함수를 제공하는 경우 해당 함수는 ExAllocatePoolWithTag를 호출할 때 지정된 입력 매개 변수를 사용하여 lookaside 목록에 대한 항목을 할당해야 합니다.

비슷한 루틴인 Windows Vista부터 ExInitializeLookasideListExLOOKASIDE_LIST_EX 구조에서 설명하는 lookaside 목록을 초기화합니다. PAGED_LOOKASIDE_LIST 구조를 사용하는 lookaside 목록에 대한 Xxx할당XxxFree 루틴과 달리 LOOKASIDE_LIST_EX 구조를 사용하는 lookaside 목록에 대한 할당 및 할당 취소 루틴은 컨텍스트 포인터를 입력 매개 변수로 받습니다. 이러한 루틴은 이 컨텍스트를 사용하여 lookaside 목록에 대한 프라이빗 데이터를 저장할 수 있습니다. 드라이버가 Windows Vista 이상 버전의 Windows에서만 실행되도록 하려면 ExInitializePagedLookasideList 대신 ExInitializeLookasideListEx를 사용하는 것이 좋습니다. 자세한 내용은 Lookaside Lists 사용을 참조하세요.

요구 사항

요구 사항
대상 플랫폼 유니버설
헤더 wdm.h(Wdm.h, Ntddk.h, Ntifs.h 포함)
라이브러리 NtosKrnl.lib
DLL NtosKrnl.exe
IRQL <= APC_LEVEL
DDI 규정 준수 규칙 HwStorPortProhibitedDDIs(storport), IrqlExApcLte2(wdm)

추가 정보

ExAllocateFromPagedLookasideList

ExAllocatePoolWithTag

ExDeletePagedLookasideList

ExFreePool

ExFreeToPagedLookasideList

ExInitializeLookasideListEx

ExInitializeNPagedLookasideList

LOOKASIDE_LIST_EX

PAGED_LOOKASIDE_LIST