다음을 통해 공유


NtEnumerateTransactionObject 함수(wdm.h)

ZwEnumerateTransactionObject 루틴은 컴퓨터의 KTM 개체를 열거합니다.

구문

__kernel_entry NTSYSCALLAPI NTSTATUS NtEnumerateTransactionObject(
  [in, optional] HANDLE            RootObjectHandle,
  [in]           KTMOBJECT_TYPE    QueryType,
  [in, out]      PKTMOBJECT_CURSOR ObjectCursor,
  [in]           ULONG             ObjectCursorLength,
  [out]          PULONG            ReturnLength
);

매개 변수

[in, optional] RootObjectHandle

KTM 개체에 대한 핸들입니다. 루틴은 지정된 개체의 자식 개체를 열거합니다. 이 매개 변수는 선택 사항이며 NULL일 수 있습니다. 이 매개 변수의 유효한 값에 대한 자세한 내용은 다음 설명 섹션의 표를 참조하세요.

[in] QueryType

열거할 개체 형식을 식별하는 KTMOBJECT_TYPE 형식의 값입니다. 이 매개 변수의 유효한 값에 대한 자세한 내용은 다음 설명 섹션의 표를 참조하세요.

[in, out] ObjectCursor

KTMOBJECT_CURSOR 구조로 시작하는 호출자가 할당한 버퍼에 대한 포인터입니다. ZwEnumerateTransactionObject 는 버퍼를 사용하여 찾은 개체의 GUID를 저장합니다.

[in] ObjectCursorLength

ObjectCursor가 가리키는 버퍼의 길이(바이트)입니다.

[out] ReturnLength

KTMOBJECT_CURSOR 구조체의 길이와 반환된 모든 GUID의 길이를 포함하여 ZwEnumerateTransactionObjectObjectCursor 버퍼에서 반환하는 바이트 수를 수신하는 호출자가 할당한 위치에 대한 포인터입니다.

반환 값

ZwEnumerateTransactionObject 는 작업이 성공하지만 루틴이 모든 개체를 열거하지 않은 경우 STATUS_SUCCESS 반환합니다. 열거할 개체가 더 이상 없으면 루틴은 STATUS_NO_MORE_ENTRIES 반환합니다. 그렇지 않으면 이 루틴이 다음 값 중 하나를 반환할 수 있습니다.

반환 코드 설명
STATUS_INVALID_PARAMETER QueryType 또는 ObjectCursorLength 매개 변수의 값이 잘못되었습니다.
STATUS_OBJECT_TYPE_MISMATCH RootObjectHandle 매개 변수가 지정하는 핸들은 유효한 KTM 개체에 대한 핸들이 아닙니다.
STATUS_INVALID_HANDLE 개체 핸들이 잘못되었습니다.
STATUS_ACCESS_DENIED 호출자는 열거되는 개체에 대한 적절한 액세스 권한이 없습니다.

루틴은 다른 NTSTATUS 값을 반환할 수 있습니다.

설명

다음 표에는 RootObjectHandleQueryType 매개 변수에 대한 유효한 값이 포함되어 있습니다.

QueryType 매개 변수 RootObjectHandle 매개 변수 열거된 개체
KTMOBJECT_TRANSACTION_MANAGER NULL 모든 트랜잭션 관리자 개체
KTMOBJECT_RESOURCE_MANAGER 트랜잭션 관리자 개체에 대한 핸들입니다. 핸들에는 개체에 대한 TRANSACTIONMANAGER_QUERY_INFORMATION 액세스 권한이 있어야 합니다. 지정된 트랜잭션 관리자 개체에 속하는 모든 리소스 관리자 개체
KTMOBJECT_ENLISTMENT 리소스 관리자 개체에 대한 핸들입니다. 핸들에는 개체에 대한 RESOURCEMANAGER_QUERY_INFORMATION 액세스 권한이 있어야 합니다. 지정된 리소스 관리자 개체에 속하는 모든 인리스트먼트 개체
KTMOBJECT_TRANSACTION 트랜잭션 관리자 개체에 대한 핸들입니다. 핸들에는 개체에 대한 TRANSACTIONMANAGER_QUERY_INFORMATION 액세스 권한이 있어야 합니다. 지정된 트랜잭션 관리자 개체에 속하는 모든 트랜잭션 개체
KTMOBJECT_TRANSACTION NULL 모든 트랜잭션 관리자 개체에 속하는 모든 트랜잭션 개체

대부분의 TPS 구성 요소는 ZwEnumerateTransactionObject를 호출할 필요가 없지만 디버깅 유틸리티를 작성해야 하는 경우 루틴이 유용할 수 있습니다.

구성 요소가 ZwEnumerateTransactionObject를 호출하기 전에 ObjectCursor 가 가리키는 버퍼를 할당하고 0으로 설정해야 합니다. 버퍼의 GUID 배열은 하나 이상의 요소를 받을 수 있을 만큼 충분히 클 수 있습니다.

지정된 형식의 모든 KTM 개체 를 열거하려면 구성 요소가 STATUS_NO_MORE_ENTRIES 반환할 때까지 ZwEnumerateTransactionObject 를 반복적으로 호출해야 합니다.

루틴이 호출될 때마다 버퍼의 GUID 배열을 적합한 개체 GUID로 채웁니다. 각 호출 후에 구성 요소는 KTMOBJECT_CURSOR 구조체의 ObjectIdCount 멤버를 사용하여 배열에 저장된 루틴의 개체 GUID 수를 확인할 수 있습니다.

NtEnumerateTransactionObjectZwEnumerateTransactionObject 는 동일한 Windows 네이티브 시스템 서비스 루틴의 두 버전입니다.

커널 모드 드라이버에서 호출하는 경우 Windows 네이티브 시스템 서비스 루틴의 NtXxxZwXxx 버전은 입력 매개 변수를 처리하고 해석하는 방식으로 다르게 동작할 수 있습니다. 루틴의 NtXxx 버전과 ZwXxx 버전 간의 관계에 대한 자세한 내용은 네이티브 시스템 서비스 루틴의 Nt 및 Zw 버전 사용을 참조하세요.

예제

다음 코드 예제에서는 컴퓨터의 모든 트랜잭션 개체를 열거하는 방법을 보여 있습니다. 이 예제에서는 KTMOBJECT_CURSOR 구조체의 GUID 배열에 하나의 요소만 포함되므로 ZwEnumerateTransactionObject 에 대한 각 호출은 하나의 GUID를 반환합니다. 루틴은 GUID에서 유니코드 문자열을 만들고 문자열을 표시합니다.

NTSTATUS Status;
UNICODE_STRING GuidString;
KTMOBJECT_CURSOR Cursor;
ULONG ReturnedBytes;

RtlZeroMemory(&Cursor, sizeof(Cursor));

do {
    Status = ZwEnumerateTransactionObject(
                                          NULL,
                                          KTMOBJECT_TRANSACTION,
                                          &Cursor,
                                          sizeof(Cursor),
                                          &ReturnedBytes
                                          );

    if (Status != STATUS_NO_MORE_ENTRIES) {
        RtlStringFromGUID(
                          &Cursor.ObjectIds[0],
                          &GuidString
                          );
        OutputMessage(GuidString.Buffer);
        OutputMessage(L"\r\n");
        RtlFreeUnicodeString(&GuidString);
    }
} while (Status == STATUS_SUCCESS);
if (Status == STATUS_NO_MORE_ENTRIES) {
    Status = STATUS_SUCCESS;
}

요구 사항

요구 사항
대상 플랫폼 유니버설
헤더 wdm.h(Wdm.h, Ntddk.h, Ntifs.h 포함)
라이브러리 NtosKrnl.lib
DLL NtosKrnl.exe
IRQL PASSIVE_LEVEL
DDI 규정 준수 규칙 HwStorPortProhibitedDDIs, PowerIrpDDis

추가 정보

KTMOBJECT_CURSOR

KTMOBJECT_TYPE

네이티브 시스템 서비스 루틴의 Nt 및 Zw 버전 사용