RtlInitializeGenericTableAvl 함수(ntddk.h)
RtlInitializeGenericTableAvl 루틴은 AVL(Adelson-Velsky/Landis) 트리를 사용하여 제네릭 테이블을 초기화합니다.
통사론
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
초기화된 제네릭 테이블 구조를 포함하려면 (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 매개 변수는 다음과 같습니다.
Table(CompareRoutine)
제네릭 테이블에 대한 포인터입니다.
FirstStruct
비교할 첫 번째 항목에 대한 포인터입니다.
SecondStruct
비교할 두 번째 항목에 대한 포인터입니다.
CompareRoutine 특정 요소를 식별할 수 있도록 제네릭 테이블의 모든 요소 순서를 엄격하게 추적해야 합니다. 요소 데이터에 대한 호출자 정의 구조에는 일반적으로 값이 고유하고 정렬 키로 사용할 수 있는 멤버가 포함됩니다. 모든 Rtl... GenericTableAvlCompareRoutine 호출하는 루틴은 버퍼 포인터를 매개 변수로 사용합니다. 이 포인터는 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)
제네릭 테이블에 대한 포인터입니다.
완충기
삭제되는 요소에 대한 포인터입니다.
Rtl... GenericTableAvl 루틴은 FreeRoutine 호출하여 제네릭 테이블에서 삭제할 요소에 대한 메모리 할당을 취소합니다. FreeRoutineAllocateRoutine반대입니다.
[in, optional] TableContext
제네릭 테이블에 대한 호출자 제공 컨텍스트에 대한 선택적 포인터입니다. 이 매개 변수는 NULL 수 있습니다.
반환 값
없음
발언
파일 시스템은 RtlInitializeGenericTableAvl 호출하여 현재 열려 있는 파일에 대한 이름 조회 정보와 같은 파일 시스템별 데이터를 저장하도록 제네릭 테이블을 초기화합니다. 요소의 정렬 순서, 구조 및 내용은 호출자 정의입니다.
파일 시스템은 다른 Rtl을 사용하기 전에 RtlInitializeGenericTableAvl 호출하여 제네릭 테이블을 초기화해야 합니다. GenericTableAvl은 새 제네릭 테이블에 루틴을. 초기화된 제네릭 테이블 구조는 불투명한 것으로 간주되어야 합니다.
Rtl의 호출자... GenericTableAvl 루틴은 제네릭 테이블에 대한 액세스를 독점적으로 동기화합니다. 배타적인 빠른 뮤텍스는 이 용도로 사용할 수 있는 가장 효율적인 동기화 메커니즘입니다.
호출자가 제공한 CompareRoutineAllocateRoutine 전에 호출되어 새 요소를 삽입해야 하는 적절한 위치를 찾습니다. CompareRoutineFreeRoutine 전에 호출되어 삭제할 요소를 찾습니다.
RtlInitializeGenericTableAvl 루틴은 AVL 트리를 사용하는 제네릭 테이블을 명시적으로 할당합니다. 이 루틴 및 다른 Rtl 사용... GENERICTableAvl 루틴은 AVL 트리 기반 테이블이 필요하고 RTL_USE_AVL_TABLES Ntddk.h포함하기 전에 정의되지 않은 경우에 필요합니다.
제네릭 테이블 루틴을 구성하려면 Rtl을 ... GenericTable드라이버에서 트리를 실행하지 않고 AVL 트리를 사용하려면 Ntddk.h포함하기 전에 공통 헤더 파일에 다음 정의 문을 삽입합니다.
`#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