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 목록 항목을 할당할 때 사용할 풀 태그를 지정합니다. 풀 태그에 대한 자세한 내용은 ExAllocatePoolWithTag의 Tag 매개 변수를 참조하세요.
[in] Depth
예약되어 있습니다. 0이어야 합니다.
반환 값
없음
설명
ExInitializePagedLookasideList를 호출한 후 호출자 지정 Size의 블록을 에서 할당하고 ExAllocateFromPagedLookasideList 및 ExFreeToPagedLookasideList를 각각 호출하여 lookaside 목록으로 해제할 수 있습니다. 이러한 동적으로 할당되고 해제된 항목은 시스템이 실행되는 동안 호출자가 사용하는 모든 데이터 구조 또는 고정 크기 버퍼일 수 있으며, 특히 호출자가 특정 순간에 사용할 항목 수를 미리 확인할 수 없는 경우 입니다. 각 고정 크기 항목의 레이아웃 및 콘텐츠는 호출자가 결정합니다.
ExInitializePagedLookasideList 는 다음과 같이 시스템 상태를 초기화하여 지정된 lookaside 목록의 사용량을 추적합니다.
항목에 대해 유지 관리할 카운터를 0으로 초기화합니다.
호출자가 제공한 Xxx할당 및 XxxFree 루틴의 진입점을 저장하거나 이러한 진입점을 각각 ExAllocatePoolWithTag 및 ExFreePool로 설정합니다.
시스템 스핀 잠금을 초기화하여 할당을 제어하고 필요한 경우 다중 프로세서로부터 안전한 방식으로 lookaside 목록으로 해제합니다.
호출자가 제공한 항목 크기 및 목록 태그를 저장 합니다.
조회 목록에 보관할 항목 수에 대한 시스템 결정 제한(최소 및 최대값)을 설정합니다. 이 제한은 시스템 차원의 항목 수요가 예상보다 높거나 낮은 경우 나중에 조정할 수 있습니다.
나중에 항목이 할당될 메모리 유형을 제어하는 시스템 결정 플래그를 설정합니다.
시스템은 사용 중인 모든 lookaside 목록 집합을 유지 관리합니다. 시스템이 실행되는 동안 lookaside 목록 항목 및 사용 가능한 페이징 메모리에 대한 수요가 달라짐에 따라 시스템은 페이징된 각 lookaside 목록에 동적으로 보관할 항목 수에 대한 제한을 조정합니다.
드라이버는 언로드하기 전에 만든 모든 lookaside 목록을 항상 명시적으로 해제해야 합니다. 그렇지 않으면 심각한 프로그래밍 오류입니다. ExDeletePagedLookasideList를 사용하여 목록을 해제합니다.
ExInitializePagedLookasideList 는 호출자가 제공한 위치에서 불투명 목록 헤드를 설정하지만 목록 항목에 대한 메모리를 미리 할당하지 않습니다. 그 후 ExAllocateFromPagedLookasideList 에 대한 호출이 발생할 때 초기 항목이 동적으로 할당되고 ExFreeToPagedLookasideList 에 대한 상호 호출이 발생하면 이러한 초기 항목이 lookaside 목록에 유지됩니다. 시스템 결정 최대값에 도달할 때까지 지정된 lookaside 목록에서 항목이 수집되며, 추가 항목은 해제될 때 페이징된 풀로 반환됩니다. 목록이 비어 있으면 목록 초기화에 지정된 XxxAllocate 함수 또는 ExAllocatePoolWithTag에 의해 할당 요청이 충족됩니다.
lookaside 목록의 사용자가 고정 크기 항목을 할당하고 해제할 때마다 ExInitializePagedLookasideList의 할당 및 무료 매개 변수에 대해 NULL 포인터를 전달하는 것이 더 효율적입니다. 그러나 lookaside 목록을 사용하는 모든 구성 요소는 할당하고 해제하는 항목 수에 대한 상태를 유지 관리하여 자체 동적 메모리 사용량을 추적하는 것과 같은 추가 호출자 결정 처리를 수행하는 이러한 함수를 제공할 수 있습니다.
ExInitializePagedLookasideList의 호출자가 XxxAllocate 함수를 제공하는 경우 해당 함수는 ExAllocatePoolWithTag를 호출할 때 지정된 입력 매개 변수를 사용하여 lookaside 목록에 대한 항목을 할당해야 합니다.
비슷한 루틴인 Windows Vista부터 ExInitializeLookasideListEx는 LOOKASIDE_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