RtlInitializeGenericTableAvl 함수(ntddk.h)
RtlInitializeGenericTableAvl 루틴은 Adelson-Velsky/Landis(AVL) 트리를 사용하여 제네릭 테이블을 초기화합니다.
구문
NTSYSAPI VOID RtlInitializeGenericTableAvl(
[out] PRTL_AVL_TABLE Table,
[in] PRTL_AVL_COMPARE_ROUTINE CompareRoutine,
[in] PRTL_AVL_ALLOCATE_ROUTINE AllocateRoutine,
[in] PRTL_AVL_FREE_ROUTINE FreeRoutine,
[in, optional] PVOID TableContext
);
매개 변수
[out] Table
초기화된 제네릭 테이블 구조를 포함하려면 크기가 최소 sizeof(RTL_AVL_TABLE) 바이트여야 하는 호출자 할당 버퍼에 대한 포인터입니다.
[in] CompareRoutine
다음과 같이 선언된 비교 콜백 루틴의 진입점입니다.
RTL_GENERIC_COMPARE_RESULTS
(*PRTL_AVL_COMPARE_ROUTINE) (
__in struct _RTL_AVL_TABLE *Table,
__in PVOID FirstStruct,
__in PVOID SecondStruct
);
CompareRoutine 매개 변수는 다음과 같습니다.
테이블(CompareRoutine)
제네릭 테이블에 대한 포인터입니다.
FirstStruct
비교할 첫 번째 항목에 대한 포인터입니다.
SecondStruct
비교할 두 번째 항목에 대한 포인터입니다.
CompareRoutine은 특정 요소를 식별할 수 있도록 제네릭 테이블의 모든 요소 순서를 엄격하게 추적해야 합니다. 요소 데이터에 대한 호출자 정의 구조체에는 일반적으로 값이 고유하고 정렬 키로 사용할 수 있는 멤버가 포함됩니다. 모든 Rtl... CompareRoutine 을 호출하는 GenericTableAvl 루틴은 버퍼 포인터를 매개 변수로 사용합니다. 이 포인터는 CompareRoutine에 차례로 전달됩니다. 버퍼에는 CompareRoutine 에서 검색 중인 요소의 키와 일치시킬 호출자 제공 키 값이 포함됩니다.
이러한 두 키 값이 지정된 경우 CompareRoutine 은 GenericLessThan, GenericGreaterThan 또는 GenericEqual을 반환합니다.
[in] AllocateRoutine
다음과 같이 선언된 할당 콜백 루틴의 진입점입니다.
PVOID
(*PRTL_AVL_ALLOCATE_ROUTINE) (
__in struct _RTL_AVL_TABLE *Table,
__in CLONG ByteSize
);
AllocateRoutine 매개 변수는 다음과 같습니다.
테이블(AllocateRoutine)
제네릭 테이블에 대한 포인터입니다.
ByteSize
할당할 바이트 수입니다.
각 새 요소에 대해 AllocateRoutine 은 호출자가 제공한 데이터에 대한 메모리와 Rtl에서 사용할 추가 메모리를 할당하기 위해 호출 됩니다. GenericTableAvl 루틴. 이 "추가 메모리"로 인해 호출자 제공 루틴은 제네릭 테이블에 있는 요소의 첫 번째 sizeof(RTL_BALANCED_LINKS) 바이트에 액세스해서는 안 됩니다.
[in] FreeRoutine
다음과 같이 선언된 할당 취소 콜백 루틴의 진입점입니다.
VOID
(*PRTL_AVL_FREE_ROUTINE) (
__in struct _RTL_AVL_TABLE *Table,
__in PVOID Buffer
);
FreeRoutine 매개 변수는 다음과 같습니다.
테이블(FreeRoutine)
제네릭 테이블에 대한 포인터입니다.
Buffer
삭제되는 요소에 대한 포인터입니다.
Rtl... GenericTableAvl 루틴은 FreeRoutine 을 호출하여 제네릭 테이블에서 삭제할 요소의 메모리 할당을 취소합니다. FreeRoutine은 AllocateRoutine과 반대입니다.
[in, optional] TableContext
제네릭 테이블에 대해 호출자가 제공한 컨텍스트에 대한 선택적 포인터입니다. 이 매개 변수는 NULL일 수 있습니다.
반환 값
없음
설명
파일 시스템은 RtlInitializeGenericTableAvl 을 호출하여 현재 열려 있는 파일에 대한 이름 조회 정보와 같은 파일 시스템별 데이터를 저장하기 위해 제네릭 테이블을 초기화합니다. 요소의 정렬 순서, 구조 및 콘텐츠는 호출자가 정의합니다.
파일 시스템은 다른 Rtl을 사용하기 전에 RtlInitializeGenericTableAvl 을 호출하여 제네릭 테이블을 초기화해야 합니다 ... 새 제네릭 테이블의 GenericTableAvl 루틴입니다. 초기화된 제네릭 테이블 구조체는 불투명한 것으로 간주되어야 합니다.
Rtl의 호출자 ... GenericTableAvl 루틴은 제네릭 테이블에 대한 액세스를 독점적으로 동기화하는 역할을 합니다. 배타적인 빠른 뮤텍스는 이 목적을 위해 사용할 수 있는 가장 효율적인 동기화 메커니즘입니다.
호출자가 제공한 CompareRoutine 은 AllocateRoutine 앞에 호출되어 새 요소를 삽입해야 하는 적절한 위치를 찾습니다. 또한 CompareRoutine은 삭제할 요소를 찾기 위해 FreeRoutine 앞에 호출됩니다.
RtlInitializeGenericTableAvl 루틴은 AVL 트리를 사용하는 제네릭 테이블을 명시적으로 할당합니다. 이 루틴 및 다른 Rtl 사용... Ntddk.h를 포함하기 전에 AVL 트리 기반 테이블이 필요하고 RTL_USE_AVL_TABLES 정의되지 않은 경우 GenericTableAvl 루틴이 필요합니다.
제네릭 테이블 루틴을 구성하려면 Rtl... GenericTable- 드라이버에서 트리를 실행하지 않고 AVL 트리를 사용하려면 Ntddk.h를 포함하기 전에 공통 헤더 파일에 다음 define 문을 삽입합니다.
`#define RTL_USE_AVL_TABLES 0`
RtlInitializeGenericTableAvl의 호출자는 IRQL <= DISPATCH_LEVEL 실행되어야 합니다. Rtl인 경우... GenericTableAvl 루틴은 IRQL DISPATCH_LEVEL 사용해야 하며 CompareRoutine, AllocateRoutine 및 FreeRoutine은 모두 페이지가 지정되지 않은 코드여야 하며 AllocateRoutine은 페이지가 없는 풀에서 메모리를 할당해야 합니다.
요구 사항
요구 사항 | 값 |
---|---|
대상 플랫폼 | 유니버설 |
헤더 | ntddk.h(Ntddk.h, Ntifs.h, Fltkernel.h 포함) |
라이브러리 | NtosKrnl.lib |
DLL | NtosKrnl.exe |
IRQL | IRQL <= DISPATCH_LEVEL(주의 섹션 참조) |
추가 정보
RtlDeleteElementGenericTableAvl
RtlInsertElementGenericTableAvl