다음을 통해 공유


RtlInsertElementGenericTableAvl 함수(ntddk.h)

RtlInsertElementGenericTableAvl 루틴은 제네릭 테이블에 새 항목을 추가합니다.

통사론

NTSYSAPI PVOID RtlInsertElementGenericTableAvl(
  [in]            PRTL_AVL_TABLE Table,
  [in]            PVOID          Buffer,
  [in]            CLONG          BufferSize,
  [out, optional] PBOOLEAN       NewElement
);

매개 변수

[in] Table

RtlInitializeGenericTableAvl호출하여 초기화된 제네릭 Adelson-Velsky/Landis(AVL) 테이블(RTL_AVL_TABLE)에 대한 포인터입니다.

[in] Buffer

새 요소에 복사할 사용자 데이터를 포함하는 호출자 할당 버퍼입니다. 자세한 내용은 RtlInitializeGenericTableAvl참조하세요.

[in] BufferSize

Buffer의 데이터 크기(바이트)입니다.

[out, optional] NewElement

출력에서 TRUE 값은 제네릭 테이블에 새 요소를 삽입하는 데 성공했다는 것을 의미합니다. FALSE 값은 삽입에 실패했음을 의미합니다.

반환 값

RtlInsertElementGenericTableAvl 새로 삽입된 항목의 사용자 데이터 또는 제네릭 테이블에 이미 있는 일치하는 항목에 대한 사용자 데이터에 대한 포인터를 반환합니다. 일치하는 항목을 찾을 수 없지만 RtlInsertElementGenericTableAvl 새 항목을 삽입할 수 없는 경우(예: AllocateRoutine 실패하기 때문에) RtlInsertElementGenericTableAvl NULL 반환합니다.

발언

항목을 삽입하려면 RtlInsertElementGenericTableAvlCompareRoutine 호출하고 RtlInitializeGenericTableAvl의해 제네릭 테이블을 초기화할 때 등록된 AllocateRoutine 호출합니다. 새 항목을 삽입한 후 rtlInsertElementGenericTableAvl AVL 링크 트리의 균형을.

테이블에 새 항목을 삽입하면 해당 데이터가 Buffer 새 항목으로 복사됩니다. 따라서 RtlInsertElementGenericTableAvl 반환된 포인터는 버퍼같지 않습니다.

호출자의 CompareRoutine genericEqual 반환하는 경우 Buffer 데이터는 제네릭 테이블의 기존 항목에 대한 데이터를 복제하는 것으로 간주됩니다. 이 경우 제네릭 테이블에 중복 항목이 있을 수 없으므로 RtlInsertElementGenericTableAvl 새 항목을 추가하지 않으므로 AllocateRoutine호출하지 않습니다.

일치하는 항목이 제네릭 테이블에 이미 있는 경우 RtlInsertElementGenericTableAvl 기존 항목의 데이터에 대한 포인터를 반환하고 newElement FALSE 설정합니다.

테이블에 일치하는 항목이 없는 경우RtlInsertElementGenericTableAvl 루틴은 새 항목(BufferSize)의 사용자 데이터와 새 항목과 연결된 링크를 위한 충분한 공간을 할당합니다. 따라서 총 바이트 수는 BufferSize + sizeof(RTL_BALANCED_LINKS)이상입니다. 호출자는 AllocateRoutine할당하는 메모리의 첫 번째 sizeof(RTL_BALANCED_LINKS) 바이트를 사용하면 안 됩니다.

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

기본적으로 운영 체제는 splay 트리를 사용하여 제네릭 테이블을 구현하지만 RtlInsertElementGenericTableAvl 루틴은 AVL(Adelson-Velsky/Landis) 트리에서만 작동합니다. 드라이버에서 트리를 실행하지 않고 AVL 트리를 사용하도록 제네릭 테이블 루틴을 구성하려면 Ntddk.h포함하기 전에 공통 헤더 파일에 다음 정의 문을 삽입합니다.

#define RTL_USE_AVL_TABLES 0

RTL_USE_AVL_TABLES 정의되지 않은 경우 제네릭 테이블 루틴의 AVL 형식을 사용해야 합니다. 예를 들어 RtlInsertElementGenericTable 대신 RtlInsertElementGenericTableAvl 루틴을사용합니다. RtlInsertElementGenericTableAvl호출에서 호출자는 RTL_GENERIC_TABLE대신 RTL_AVL_TABLE 테이블 구조를 전달해야 합니다.

다음 조건 중 하나가 있는 경우 RtlInsertElementGenericTableAvl 호출자는 IRQL < DISPATCH_LEVEL 실행되어야 합니다.

  • Table 또는 Buffer 호출자가 할당한 메모리는 페이징할 수 있습니다.
  • 호출자가 제공한 CompareRoutine 또는 AllocateRoutine 페이징 가능한 코드를 포함합니다.

요구 사항

요구
지원되는 최소 클라이언트 Windows XP부터 사용할 수 있습니다.
대상 플랫폼 보편적
헤더 ntddk.h(Ntddk.h, Ntifs.h 포함)
라이브러리 NtosKrnl.lib
DLL NtosKrnl.exe
IRQL < DISPATCH_LEVEL(설명 섹션 참조)

참고 항목

RtlDeleteElementGenericTableAvl

RtlInitializeGenericTableAvl