다음을 통해 공유


RtlInsertElementGenericTableFullAvl 함수(ntddk.h)

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

통사론

NTSYSAPI PVOID RtlInsertElementGenericTableFullAvl(
  [in]            PRTL_AVL_TABLE      Table,
  [in]            PVOID               Buffer,
  [in]            CLONG               BufferSize,
  [out, optional] PBOOLEAN            NewElement,
  [in]            PVOID               NodeOrParent,
  [in]            TABLE_SEARCH_RESULT SearchResult
);

매개 변수

[in] Table

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

[in] Buffer

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

[in] BufferSize

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

[out, optional] NewElement

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

[in] NodeOrParent

RtlLookupElementGenericTableFullAvl 이전 호출의 검색 결과입니다. 이 값은 RtlInsertElementGenericTableFullAvl 트리가 현재 비어 있는지 또는 비어 있지 않은 경우 부모 항목의 왼쪽 또는 오른쪽에 새 항목을 삽입할지 여부를 나타냅니다. SearchResult 매개 변수에는 다음 값이 있을 수 있습니다.

TableEmptyTree

트리가 비어 있었습니다. NodeOrParent 내용이 변경되지 .

TableFoundNode

RtlInsertElementGenericTableFullAvl 루틴은 키가 Buffer데이터와 일치하는 테이블 항목을 찾았습니다. NodeOrParent 일치하는 항목에 대한 포인터를 포함합니다.

TableInsertAsLeft

RtlInsertElementGenericTableFullAvl 루틴은 키가 Buffer데이터와 일치하는 테이블 항목을 찾을 없습니다. RtlInsertElementGenericTableFullAvl 검색한 항목이 테이블에 있는 경우 NodeOrParent가 가리키는 항목의 왼쪽 자식이 .

TableInsertAsRight

RtlInsertElementGenericTableFullAvl 루틴은 키가 Buffer데이터와 일치하는 테이블 항목을 찾을 없습니다. RtlInsertElementGenericTableFullAvl 검색한 항목이 테이블에 있는 경우 NodeOrParent가 가리키는 항목의 오른쪽 자식이 .

[in] SearchResult

테이블 항목에 대한 포인터입니다. RtlInsertElementGenericTableFullAvl 루틴이 항목과 일치하는 경우 nodeOrParent 일치하는 항목을 가리킵니다. RtlInsertElementGenericTableFullAvl 루틴이 일치 항목을 찾지 못하는 경우 NodeOrParent RtlInsertElementGenericTableFullAvl 루틴에서 검색한 항목의 부모 항목이 될 항목을 가리킵니다.

반환 값

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

발언

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

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

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

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

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

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

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

#define RTL_USE_AVL_TABLES 0

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

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

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

요구 사항

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

참고 항목

RtlDeleteElementGenericTable

RtlInitializeGenericTable