다음을 통해 공유


NtCreateEnlistment 함수(wdm.h)

ZwCreateEnlistment 루틴은 트랜잭션에 대한 새 인리스트먼트 개체를 만듭니다.

구문

__kernel_entry NTSYSCALLAPI NTSTATUS NtCreateEnlistment(
  [out]          PHANDLE            EnlistmentHandle,
  [in]           ACCESS_MASK        DesiredAccess,
  [in]           HANDLE             ResourceManagerHandle,
  [in]           HANDLE             TransactionHandle,
  [in, optional] POBJECT_ATTRIBUTES ObjectAttributes,
  [in, optional] ULONG              CreateOptions,
  [in]           NOTIFICATION_MASK  NotificationMask,
  [in, optional] PVOID              EnlistmentKey
);

매개 변수

[out] EnlistmentHandle

ZwCreateEnlistment에 대한 호출이 성공하면 새 인리스트먼트 개체에 대한 핸들을 수신하는 호출자가 할당한 변수에 대한 포인터입니다.

[in] DesiredAccess

인리스트먼트 개체에 대한 호출자의 요청된 액세스를 지정하는 ACCESS_MASK 값입니다. 호출자는 모든 종류의 개체에 대해 정의된 액세스 권한 외에도( ACCESS_MASK 참조) 인리스트먼트 개체에 대해 다음 액세스 권한 플래그를 지정할 수 있습니다.

ACCESS_MASK 플래그 호출자가
ENLISTMENT_QUERY_INFORMATION 인리스트먼트에 대한 정보를 쿼리합니다( ZwQueryInformationEnlistment 참조).
ENLISTMENT_SET_INFORMATION 인리스트먼트에 대한 정보를 설정합니다( ZwSetInformationEnlistment 참조).
ENLISTMENT_RECOVER 인리스트먼트를 복구합니다( ZwRecoverEnlistment 참조).
ENLISTMENT_SUBORDINATE_RIGHTS 우수하지 않은 리소스 관리자가 수행하는 작업을 수행합니다( ZwRollbackEnlistment, ZwPrepareComplete, ZwPrepareComplete, ZwCommitComplete, ZwRollbackComplete, ZwSinglePhaseReject, ZwReadOnlyEnlistment 참조).
ENLISTMENT_SUPERIOR_RIGHTS 우수한 트랜잭션 관리자가 수행해야 하는 작업을 수행합니다(ZwPrepareEnlistment, ZwPrepareEnlistment, ZwCommitEnlistment 참조).
 

또는 다음 ACCESS_MASK 비트맵 중 하나 이상을 지정할 수 있습니다. 이러한 비트맵은 이전 테이블의 플래그를 ACCESS_MASK 참조 페이지에 설명된 STANDARD_RIGHTS_XXX 플래그와 결합합니다. 이러한 비트맵을 이전 테이블의 추가 플래그와 결합할 수도 있습니다. 다음 표에서는 비트맵이 특정 액세스 권한에 해당하는 방법을 보여줍니다.

일반 액세스 권한 특정 액세스 권한 집합
ENLISTMENT_GENERIC_READ STANDARD_RIGHTS_READ 및 ENLISTMENT_QUERY_INFORMATION
ENLISTMENT_GENERIC_WRITE STANDARD_RIGHTS_WRITE, ENLISTMENT_SET_INFORMATION, ENLISTMENT_RECOVER, ENLISTMENT_REFERENCE, ENLISTMENT_SUBORDINATE_RIGHTS 및 ENLISTMENT_SUPERIOR_RIGHTS
ENLISTMENT_GENERIC_EXECUTE STANDARD_RIGHTS_EXECUTE, ENLISTMENT_RECOVER, ENLISTMENT_SUBORDINATE_RIGHTS 및 ENLISTMENT_SUPERIOR_RIGHTS
ENLISTMENT_ALL_ACCESS STANDARD_RIGHTS_REQUIRED, ENLISTMENT_GENERIC_READ, ENLISTMENT_GENERIC_WRITE 및 ENLISTMENT_GENERIC_EXECUTE

[in] ResourceManagerHandle

ZwCreateResourceManager 또는 ZwOpenResourceManager에 대한 이전 호출에서 가져온 호출자의 리소스 관리자 개체에 대한 핸들입니다.

[in] TransactionHandle

ZwCreateTransaction 또는 ZwOpenTransaction에 대한 이전 호출에서 가져온 트랜잭션 개체에 대한 핸들입니다. KTM은 호출 리소스 관리자가 처리하는 트랜잭션 목록에 이 트랜잭션을 추가합니다.

[in, optional] ObjectAttributes

개체 이름 및 기타 특성을 지정하는 OBJECT_ATTRIBUTES 구조체에 대한 포인터입니다. InitializeObjectAttributes 루틴을 사용하여 이 구조를 초기화합니다. 호출자가 시스템 스레드 컨텍스트에서 실행되고 있지 않으면 InitializeObjectAttributes를 호출할 때 OBJ_KERNEL_HANDLE 특성을 설정해야 합니다. 이 매개 변수는 선택 사항이며 NULL일 수 있습니다.

[in, optional] CreateOptions

인리스트먼트 옵션 플래그입니다. 다음 표에는 사용 가능한 유일한 플래그가 포함되어 있습니다.

CreateOptions 플래그 의미
ENLISTMENT_SUPERIOR 호출자가 지정된 트랜잭션에 대해 우수한 트랜잭션 관리자 로 등록됩니다.
 

이 매개 변수는 선택 사항이며 0일 수 있습니다.

[in] NotificationMask

Ktmtypes.h에 정의된 TRANSACTION_NOTIFY_XXX 값의 비트 OR입니다. 이 마스크는 KTM이 호출자에게 보내는 트랜잭션 알림 유형을 지정합니다.

[in, optional] EnlistmentKey

인리스트먼트를 고유하게 식별하는 호출자 정의 정보에 대한 포인터입니다. 리소스 관리자는 ZwGetNotificationResourceManager 를 호출하거나 KTM이 ResourceManagerNotification 콜백 루틴을 호출할 때 이 포인터를 받습니다. 리소스 관리자는 TmReferenceEnlistmentKey 및 TmDereferenceEnlistmentKey 를 호출하여 이 키에 대한 참조 수를 유지할 수 있습니다. 이 매개 변수는 선택 사항이며 NULL일 수 있습니다.

반환 값

ZwCreateEnlistment 는 작업이 성공하면 STATUS_SUCCESS 반환합니다. 그렇지 않으면 이 루틴이 다음 값 중 하나를 반환할 수 있습니다.

반환 코드 설명
STATUS_INVALID_HANDLE
개체 핸들이 잘못되었습니다.
STATUS_INVALID_PARAMETER
CreateOptions 또는 NotificationMask 매개 변수의 값이 잘못되었거나, TransactionHandle 매개 변수가 지정하는 트랜잭션을 KTM에서 찾을 수 없습니다.
STATUS_INSUFFICIENT_RESOURCES
메모리 할당에 실패했습니다.
STATUS_TRANSACTIONMANAGER_NOT_ONLINE
KTM 또는 리소스 관리자가 작동 상태가 아니므로 인리스트먼트에 실패했습니다.
STATUS_TRANSACTION_NOT_ACTIVE
TransactionHandle 매개 변수가 지정하는 트랜잭션이 활성 상태가 아니므로 인리스트먼트에 실패했습니다.
STATUS_TRANSACTION_SUPERIOR_EXISTS
호출자는 우수한 트랜잭션 관리자로 등록하려고 했지만 우수한 트랜잭션 관리자 가 이미 있습니다.
STATUS_TM_VOLATILE
호출자가 우수한 트랜잭션 관리자로 등록하려고 하지만 호출자의 리소스 관리자 개체는 휘발성 이지만 연결된 트랜잭션 관리자 개체는 휘발성이 아닙니다.
STATUS_ACCESS_DENIED
DesiredAccess 매개 변수의 값이 잘못되었습니다.
 

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

설명

리소스 관리자는 ZwCreateEnlistment 를 호출하여 트랜잭션에 참여합니다.

우수하지 않은 리소스 관리자는 액세스 마스크에 ENLISTMENT_SUBORDINATE_RIGHTS 플래그를 포함해야 합니다.

우수한 트랜잭션 관리자는 액세스 마스크에 ENLISTMENT_SUPERIOR_RIGHTS 플래그를 포함해야 합니다. 일반적으로 우수한 트랜잭션 관리자는 ZwRollbackEnlistment를 호출하는 코드를 포함하므로 ENLISTMENT_SUBORDINATE_RIGHTS 플래그도 포함해야 합니다.

ZwCreateEnlistment를 호출하는 리소스 관리자는 결국 ZwClose를 호출하여 개체 핸들을 닫아야 합니다.

리소스 관리자는 EnlistmentKey 매개 변수를 사용하여 인리스트먼트에 대한 정보가 포함된 데이터 구조에 대한 포인터와 같이 각 인리스트먼트에 고유한 값을 할당할 수 있습니다. 예를 들어 리소스 관리자가 인리스트먼트 개체의 핸들을 구조체에 저장하는 경우 리소스 관리자는 다음을 수행할 수 있습니다.

  1. ZwGetNotificationResourceManager를 호출하여 알림을 받습니다.
  2. TRANSACTION_NOTIFICATION 구조체에서 인리스트먼트 키 값을 가져옵니다.
  3. 인리스트먼트 키를 사용하여 저장된 인리스트먼트 개체 핸들을 찾습니다.
  4. ZwCommitComplete 또는 ZwRollbackComplete와 같은 입력으로 인리스트먼트 핸들이 필요한 루틴을 호출합니다.
ZwCreateEnlistment에 대한 자세한 내용은 Resource Manager 만들기우수한 트랜잭션 관리자 만들기를 참조하세요.

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

요구 사항

요구 사항
지원되는 최소 클라이언트 Windows Vista 이상 운영 체제 버전에서 사용할 수 있습니다.
대상 플랫폼 유니버설
헤더 wdm.h(Wdm.h, Ntddk.h, Ntifs.h 포함)
라이브러리 NtosKrnl.lib
DLL NtosKrnl.exe
IRQL PASSIVE_LEVEL
DDI 규정 준수 규칙 HwStorPortProhibitedDDIs, PowerIrpDDis

추가 정보

ACCESS_MASK

InitializeObjectAttributes

OBJECT_ATTRIBUTES

TRANSACTION_NOTIFICATION

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

ZwClose

ZwCommitComplete

ZwCommitEnlistment

ZwCreateResourceManager

ZwCreateTransaction

ZwGetNotificationResourceManager

ZwOpenEnlistment

ZwOpenResourceManager

ZwOpenTransaction

ZwPrePareComplete

ZwPrepareEnlistment

ZwPrepareComplete

ZwPrepareEnlistment

ZwQueryInformationEnlistment

ZwReadOnlyEnlistment

ZwRecoverEnlistment

ZwRollbackComplete

ZwRollbackEnlistment

ZwSetInformationEnlistment

ZwSinglePhaseReject