RtlEnumerateGenericTableLikeADirectory 함수(ntddk.h)

RtlEnumerateGenericTableLikeADirectory 루틴은 제네릭 테이블의 요소를 데이터 정렬 순서로 하나씩 반환합니다.

구문

NTSYSAPI PVOID RtlEnumerateGenericTableLikeADirectory(
  [in]           PRTL_AVL_TABLE          Table,
  [in, optional] PRTL_AVL_MATCH_FUNCTION MatchFunction,
  [in, optional] PVOID                   MatchData,
  [in]           ULONG                   NextFlag,
  [in, out]      PVOID                   *RestartKey,
  [in, out]      PULONG                  DeleteCount,
  [in]           PVOID                   Buffer
);

매개 변수

[in] Table

열거될 Adelson-Velsky/Landis(AVL) 테이블(RTL_AVL_TABLE)에 대한 포인터입니다.

[in, optional] MatchFunction

반환할 항목을 결정하는 일치 함수입니다. 지정하지 않으면 모든 노드가 반환됩니다.

[in, optional] MatchData

match 함수에 전달할 데이터입니다.

[in] NextFlag

RestartKeyNULL이 아닌 경우 TRUE 값은 열거형이 요소를 건너뛰는 것을 나타냅니다. FALSE이면 RtlEnumerateGenericTableLikeADirectory에 대한 이전 호출에서 중단된 열거형이 다시 시작됩니다. RestartKeyNULL인 경우 TRUE 값은 RtlEnumerateGenericTableLikeADirectory버퍼의 데이터와 일치하는 항목 다음에 트리의 다음 항목을 반환하도록 지시합니다. FALSE 값은 RtlEnumerateGenericTableLikeADirectory버퍼의 데이터와 일치하는 트리의 항목을 반환하도록 지시합니다.

[in, out] RestartKey

제네릭 테이블 요소의 열거를 시작하거나 다시 시작할 위치를 결정하는 값입니다. RestartKeyNULL이면 버퍼에 설명된 위치에서 열거형이 시작되거나 다시 시작됩니다. NULL이 아닌 경우 RestartKey가 나타내는 지점에서 열거형이 다시 시작됩니다. 반환할 때 RestartKey 는 열거형이 중단된 트리의 위치를 나타내는 값을 보유합니다. RtlEnumerateGenericTableLikeADirectory 호출자에 대한 다음 호출에서 동일한 값을 다시 전달하여 RtlEnumerateGenericTableLikeADirectory에 열거를 다시 시작할 위치를 알려야 합니다. 다음 코드 예제에서는 이 작업을 수행하는 방법을 보여 줍니다.

NextFlag = FALSE;
RestartKey = NULL;
DeleteCount = 0;
// Initialize Buffer for start/resume point
Buffer = ...
for (ptr = NULL; ptr != NULL;  ) {
  // Value returned in RestartKey will be passed back in
  // on following call (iteration):
  ptr = RtlEnumerateGenericTableLikeADirectory(
      &MyTable, NULL, NULL, TRUE, &RestartKey,
      &DeleteCount, &Buffer, sizeof(LONG) );
      ...
  // The value output in RestartKey will still be in
  // RestartKey when the
  // RtlEnumerationGenericTableLikeADirectory routine
  // is called in the next iteration of this loop.
  // This ensures that the enumeration will pick up
  // where it left off.
}

RtlEnumerateGenericTableLikeADirectory 호출 사이에 트리에서 노드가 삭제되면 RestartKey 값에 관계없이 버퍼에 설명된 트리의 위치에서 열거형이 다시 시작됩니다.

[in, out] DeleteCount

출력에서 테이블에서 삭제된 항목의 현재 수를 나타내는 값입니다. 호출자는 RtlEnumerateGenericTableLikeADirectory에 대한 다음 호출에서 이 값을 다시 전달해야 합니다. 이 값을 사용하면 RtlEnumerateGenericTableLikeADirectory 루틴에서 RtlEnumerateGenericTableLikeADirectory 호출 간에 테이블에서 삭제가 발생했는지 여부를 확인할 수 있습니다. 삭제가 발생한 경우 열거형은 RestartKey로 표시된 테이블 항목이 아니라 Buffer의 데이터와 일치하는 테이블 항목으로 다시 시작됩니다. RestartKeyNULL인 경우 이 매개 변수는 열거형에 영향을 주지 않습니다.

[in] Buffer

RestartKeyNULL인 경우 열거형을 시작할 위치를 결정하는 키 식입니다. RestartKeyNULL이고 NextFlagFALSE인 경우 호출자는 테이블의 특정 항목과 일치하는 저장된 키를 전달할 수 있으며, 저장된 키로 지정된 항목에서 열거형이 시작됩니다. 저장된 키 바로 뒤에 오는 키를 반환하려면 여기에 키를 전달하고 RestartKeyNULL 로, NextFlagTRUE로 설정합니다. 저장된 키가 삭제된 경우 열거형은 일치하는 다음 키로 시작됩니다.

반환 값

RtlEnumerateGenericTableLikeADirectory 루틴은 열거형의 다음 테이블 요소와 연결된 사용자 정의 구조체에 대한 포인터를 반환합니다. 반환할 새 요소가 더 이상 없으면 반환 값은 NULL입니다.

설명

RtlEnumerateGenericTableLikeADirectory 루틴은 혼합된 삽입 및 삭제 작업에서 제네릭 테이블을 열거하는 안전한 수단을 제공합니다. 일치하는 첫 번째 키 이름으로 시작하는 RtlEnumerateGenericTableLikeADirectory 는 열거 중에 이름을 삽입하거나 삭제하지 않는 한 테이블의 각 이름을 정확히 한 번 반환합니다. 열거형 중에 키 이름을 삽입하거나 삭제하는 경우(예: RtlEnumerateGenericTableLikeADirectory 호출 사이에) 열거형에 포함되거나 포함되지 않을 수 있습니다. 이러한 이름이 포함되는지 여부는 RtlEnumerateGenericTableLikeADirectory 가 이름이 있는 디렉터리 범위를 처리할 때 이름 상태에 따라 달라집니다.

제네릭 테이블을 열거하는 데 사용할 수 있는 네 가지 루틴이 있습니다.

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

 #define RTL_USE_AVL_TABLES 0

RTL_USE_AVL_TABLES 정의되지 않은 경우 제네릭 테이블 루틴의 AVL 형식을 사용해야 합니다.

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

  • 테이블 또는 버퍼에서 호출자가 할당한 메모리는 페이징할 수 있습니다.

  • 호출자가 제공한 MatchFunction 에는 페이징 가능한 코드가 포함되어 있습니다.

요구 사항

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

추가 정보

RtlEnumerateGenericTable

RtlEnumerateGenericTableWithoutSplaying

RtlGetElementGenericTable