RtlInsertElementGenericTable 함수(ntddk.h)

RtlInsertElementGenericTable 루틴은 제네릭 테이블에 새 요소를 추가합니다.

구문

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

매개 변수

[in] Table

제네릭 테이블(RTL_GENERIC_TABLE)에 대한 포인터입니다. RtlInitializeGenericTable을 호출하여 테이블을 초기화해야 합니다.

[in] Buffer

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

[in] BufferSize

새 요소가 삽입될 때 호출자가 제공한 데이터에 할당할 바이트 수입니다.

[out, optional] NewElement

Buffer에 데이터가 있는 새 요소가 제네릭 테이블에 삽입된 경우 TRUE를 수신하는 변수에 대한 포인터입니다. 또는 새 요소가 삽입되지 않은 경우 FALSE입니다.

반환 값

RtlInsertElementGenericTable 은 새로 삽입된 요소의 연결된 데이터에 대한 포인터를 반환하거나 일치하는 요소가 제네릭 테이블에 이미 있는 경우 기존 요소의 데이터에 대한 포인터를 반환합니다. 일치하는 요소를 찾을 수 없지만 새 요소를 삽입할 수 없는 경우(예: AllocateRoutine 실패로 인해) RtlInsertElementGenericTableNULL을 반환합니다.

설명

요소를 삽입하기 위해 RtlInsertElementGenericTableRtlInitializeGenericTable에서 제네릭 테이블을 초기화할 때 등록된 CompareRoutineAllocateRoutine을 호출합니다. 새 요소를 삽입한 후 RtlInsertElementGenericTable 은 splay 링크 트리의 균형을 조정합니다.

테이블에 새 요소를 삽입하면 해당 데이터가 Buffer 에서 새 요소로 복사됩니다. 따라서 RtlInsertElementGenericTable에서 반환된 포인터는 버퍼와 같지 않습니다.

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

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

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

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

#define RTL_USE_AVL_TABLES 0

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

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

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

요구 사항

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

추가 정보

RtlDeleteElementGenericTable

RtlInitializeGenericTable