RtlInitializeGenericTable 함수(ntddk.h)

RtlInitializeGenericTable 루틴은 제네릭 테이블을 초기화합니다.

구문

NTSYSAPI VOID RtlInitializeGenericTable(
  [out]          PRTL_GENERIC_TABLE            Table,
  [in]           PRTL_GENERIC_COMPARE_ROUTINE  CompareRoutine,
  [in]           PRTL_GENERIC_ALLOCATE_ROUTINE AllocateRoutine,
  [in]           PRTL_GENERIC_FREE_ROUTINE     FreeRoutine,
  [in, optional] PVOID                         TableContext
);

매개 변수

[out] Table

초기화된 제네릭 테이블 구조를 포함하려면 최소한 sizeof(RTL_GENERIC_TABLE) 바이트여야 하는 호출자 할당 버퍼에 대한 포인터입니다.

[in] CompareRoutine

다음과 같이 선언된 비교 콜백 루틴의 진입점입니다.

RTL_GENERIC_COMPARE_RESULTS
(*PRTL_GENERIC_COMPARE_ROUTINE) (
    __in struct _RTL_GENERIC_TABLE  *Table,
    __in PVOID  FirstStruct,
    __in PVOID  SecondStruct
    ); 

CompareRoutine 매개 변수는 다음과 같습니다.

테이블(CompareRoutine)

제네릭 테이블에 대한 포인터입니다.

FirstStruct

비교할 첫 번째 항목에 대한 포인터입니다.

SecondStruct

비교할 두 번째 항목에 대한 포인터입니다.

CompareRoutine은 특정 요소를 식별할 수 있도록 제네릭 테이블의 모든 요소 순서를 엄격하게 추적해야 합니다. 요소 데이터에 대한 호출자 정의 구조에는 일반적으로 값이 고유하고 정렬 키로 사용할 수 있는 멤버가 포함됩니다. 모든 Rtl... CompareRoutine 을 호출하는 GenericTable 루틴은 버퍼 포인터를 매개 변수로 사용합니다. 이 포인터는 CompareRoutine에 차례로 전달됩니다. 버퍼에는 CompareRoutine 에서 검색 중인 요소의 키와 일치시킬 호출자 제공 키 값이 포함됩니다.

이러한 두 키 값이 지정된 경우 CompareRoutineGenericLessThan, GenericGreaterThan 또는 GenericEqual을 반환합니다.

[in] AllocateRoutine

다음과 같이 선언된 할당 콜백 루틴의 진입점입니다.

PVOID
(*PRTL_GENERIC_ALLOCATE_ROUTINE) (
    __in struct _RTL_GENERIC_TABLE  *Table,
    __in CLONG  ByteSize
    );

AllocateRoutine 매개 변수는 다음과 같습니다.

테이블(AllocateRoutine)

제네릭 테이블에 대한 포인터입니다.

ByteSize

할당할 바이트 수입니다.

각 새 요소에 대해 AllocateRoutine 은 호출자가 제공한 데이터에 대한 메모리와 Rtl에서 사용할 추가 메모리를 할당하기 위해 호출 됩니다. GenericTable 루틴. 이 "추가 메모리"로 인해 호출자 제공 루틴은 제네릭 테이블에 있는 요소의 첫 번째(sizeof(RTL_SPLAY_LINKS) + sizeof(LIST_ENTRY)) 바이트에 액세스해서는 안 됩니다.

[in] FreeRoutine

다음과 같이 선언된 할당 취소 콜백 루틴의 진입점입니다.

VOID
(*PRTL_GENERIC_FREE_ROUTINE) (
    __in struct _RTL_GENERIC_TABLE  *Table,
    __in PVOID  Buffer
    );

FreeRoutine 매개 변수는 다음과 같습니다.

테이블(FreeRoutine)

제네릭 테이블에 대한 포인터입니다.

Buffer

삭제되는 요소에 대한 포인터입니다.

Rtl... GenericTable 루틴은 FreeRoutine 을 호출하여 제네릭 테이블에서 삭제할 요소의 메모리 할당을 취소합니다. FreeRoutineAllocateRoutine과 반대입니다.

[in, optional] TableContext

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

반환 값

없음

설명

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

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

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

호출자가 제공한 CompareRoutineAllocateRoutine 앞에 호출되어 새 요소를 삽입해야 하는 적절한 위치를 찾습니다. 또한 CompareRoutine은 삭제할 요소를 찾기 위해 FreeRoutine 앞에 호출됩니다.

기본적으로 운영 체제는 splay 트리를 사용하여 제네릭 테이블을 구현합니다. 경우에 따라 플레이 트리에서 작업을 수행하면 트리가 깊고 좁아지고 직선으로 바뀔 수도 있습니다. 매우 깊은 트리는 검색 성능을 저하합니다. AVL(Adelson-Velsky/Landis) 트리를 사용하여 제네릭 테이블의 보다 균형 있고 얕은 트리 구현을 보장할 수 있습니다. 드라이버에서 트리를 표시하지 않고 AVL 트리를 사용하도록 일반 테이블 루틴을 구성하려면 Ntddk.h를 포함하기 전에 공통 헤더 파일에 다음 define 문을 삽입합니다.

`#define RTL_USE_AVL_TABLES 0`

AVL 테이블을 사용하려는 경우 RTL_USE_AVL_TABLES 정의되지 않은 경우 제네릭 테이블 루틴의 AVL 형식을 사용해야 합니다. 예를 들어 RtlInitializeGenericTable 대신 RtlInitializeGenericTableAvl 루틴을 사용합니다. RtlInitializeGenericTableAvl은 Table 매개 변수가 가리키는 버퍼의 초기화된 RTL_AVL_TABLE테이블 구조를 반환합니다. RtlInitializeGenericTableAvl 호출에서 호출자는 유사한 PRTL_GENERIC_Xxx 형식 루틴이 아닌 PRTL_AVL_COMPARE_ROUTINE 형식의 비교 콜백 루틴, PRTL_AVL_ALLOCATE_ROUTINE 형식의 할당 콜백 루틴 및 PRTL_AVL_FREE_ROUTINE 형식의 할당 취소 콜백 루틴을 전달해야 합니다.

RtlInitializeGenericTable의 호출자는 IRQL <= DISPATCH_LEVEL 실행되어야 합니다. Rtl이면... GenericTable 루틴은 IRQL DISPATCH_LEVEL, CompareRoutine, AllocateRoutineFreeRoutine은 모두 페이지를 초과할 수 없는 코드여야 하며 AllocateRoutine은 페이지가 없는 풀에서 메모리를 할당해야 합니다.

요구 사항

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

추가 정보

ExInitializeFastMutex

RtlDeleteElementGenericTable

RtlEnumerateGenericTable

RtlEnumerateGenericTableWithoutSplaying

RtlGetElementGenericTable

RtlInsertElementGenericTable

RtlLookupElementGenericTable

RtlNumberGenericTableElements