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 에서 검색 중인 요소의 키와 일치시킬 호출자 제공 키 값이 포함됩니다.

이러한 두 키 값이 지정된 경우 CompareRoutineGenericLessThan, 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 을 호출하여 제네릭 테이블에서 삭제할 요소의 메모리 할당을 취소합니다. FreeRoutineAllocateRoutine과 반대입니다.

[in, optional] TableContext

제네릭 테이블에 대해 호출자가 제공한 컨텍스트에 대한 선택적 포인터입니다. 이 매개 변수는 NULL일 수 있습니다.

반환 값

없음

설명

파일 시스템은 RtlInitializeGenericTableAvl 을 호출하여 현재 열려 있는 파일에 대한 이름 조회 정보와 같은 파일 시스템별 데이터를 저장하기 위해 제네릭 테이블을 초기화합니다. 요소의 정렬 순서, 구조 및 콘텐츠는 호출자가 정의합니다.

파일 시스템은 다른 Rtl을 사용하기 전에 RtlInitializeGenericTableAvl 을 호출하여 제네릭 테이블을 초기화해야 합니다 ... 새 제네릭 테이블의 GenericTableAvl 루틴입니다. 초기화된 제네릭 테이블 구조체는 불투명한 것으로 간주되어야 합니다.

Rtl의 호출자 ... GenericTableAvl 루틴은 제네릭 테이블에 대한 액세스를 독점적으로 동기화하는 역할을 합니다. 배타적인 빠른 뮤텍스는 이 목적을 위해 사용할 수 있는 가장 효율적인 동기화 메커니즘입니다.

호출자가 제공한 CompareRoutineAllocateRoutine 앞에 호출되어 새 요소를 삽입해야 하는 적절한 위치를 찾습니다. 또한 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, AllocateRoutineFreeRoutine은 모두 페이지가 지정되지 않은 코드여야 하며 AllocateRoutine은 페이지가 없는 풀에서 메모리를 할당해야 합니다.

요구 사항

요구 사항
대상 플랫폼 유니버설
헤더 ntddk.h(Ntddk.h, Ntifs.h, Fltkernel.h 포함)
라이브러리 NtosKrnl.lib
DLL NtosKrnl.exe
IRQL IRQL <= DISPATCH_LEVEL(주의 섹션 참조)

추가 정보

ExInitializeFastMutex

RtlDeleteElementGenericTableAvl

RtlEnumerateGenericTableAvl

RtlGetElementGenericTableAvl

RtlInitializeGenericTable

RtlInsertElementGenericTableAvl

RtlLookupElementGenericTableAvl

RtlNumberGenericTableElementsAvl