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

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

[out, optional] NewElement

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

[in] NodeOrParent

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

TableEmptyTree

트리가 비어 있었습니다. NodeOrParent의 내용은 변경되지 않았습니다.

TableFoundNode

RtlInsertElementGenericTableFullAvl 루틴은 버퍼의 데이터와 일치하는 키가 있는 테이블 항목을 발견했습니다. NodeOrParent 는 일치하는 항목에 대한 포인터를 포함합니다.

TableInsertAsLeft

RtlInsertElementGenericTableFullAvl 루틴에서 버퍼의 데이터와 일치하는 키가 있는 테이블 항목을 찾지 못했습니다. RtlInsertElementGenericTableFullAvl이 검색한 항목이 테이블에 있는 경우 NodeOrParent가 가리키는 항목의 왼쪽 자식이 됩니다.

TableInsertAsRight

RtlInsertElementGenericTableFullAvl 루틴에서 버퍼의 데이터와 일치하는 키가 있는 테이블 항목을 찾지 못했습니다. RtlInsertElementGenericTableFullAvl이 검색한 항목이 테이블에 있는 경우 NodeOrParent가 가리키는 항목의 오른쪽 자식이 됩니다.

[in] SearchResult

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

반환 값

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

설명

항목을 삽입하기 위해 RtlInsertElementGenericTableFullAvlRtlInitializeGenericTableAvl에서 제네릭 테이블을 초기화할 때 등록된 CompareRoutineAllocateRoutine을 호출합니다. 새 항목을 삽입한 후 RtlInsertElementGenericTableFullAvl 은 AVL 링크 트리의 균형을 다시 조정합니다.

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

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

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

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

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

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

#define RTL_USE_AVL_TABLES 0

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

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

  • 테이블 또는 버퍼에서 호출자가 할당한 메모리는 페이징할 수 있습니다.
  • 호출자가 제공한 CompareRoutine 또는 AllocateRoutine 에는 페이징 가능한 코드가 포함되어 있습니다.

요구 사항

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

추가 정보

RtlDeleteElementGenericTable

RtlInitializeGenericTable