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 반환합니다. 그렇지 않으면 이 루틴이 다음 값 중 하나를 반환할 수 있습니다.
반환 코드 | 설명 |
---|---|
|
개체 핸들이 잘못되었습니다. |
|
CreateOptions 또는 NotificationMask 매개 변수의 값이 잘못되었거나, TransactionHandle 매개 변수가 지정하는 트랜잭션을 KTM에서 찾을 수 없습니다. |
|
메모리 할당에 실패했습니다. |
|
KTM 또는 리소스 관리자가 작동 상태가 아니므로 인리스트먼트에 실패했습니다. |
|
TransactionHandle 매개 변수가 지정하는 트랜잭션이 활성 상태가 아니므로 인리스트먼트에 실패했습니다. |
|
호출자는 우수한 트랜잭션 관리자로 등록하려고 했지만 우수한 트랜잭션 관리자 가 이미 있습니다. |
|
호출자가 우수한 트랜잭션 관리자로 등록하려고 하지만 호출자의 리소스 관리자 개체는 휘발성 이지만 연결된 트랜잭션 관리자 개체는 휘발성이 아닙니다. |
|
DesiredAccess 매개 변수의 값이 잘못되었습니다. |
루틴은 다른 NTSTATUS 값을 반환할 수 있습니다.
설명
리소스 관리자는 ZwCreateEnlistment 를 호출하여 트랜잭션에 참여합니다.
우수하지 않은 리소스 관리자는 액세스 마스크에 ENLISTMENT_SUBORDINATE_RIGHTS 플래그를 포함해야 합니다.
우수한 트랜잭션 관리자는 액세스 마스크에 ENLISTMENT_SUPERIOR_RIGHTS 플래그를 포함해야 합니다. 일반적으로 우수한 트랜잭션 관리자는 ZwRollbackEnlistment를 호출하는 코드를 포함하므로 ENLISTMENT_SUBORDINATE_RIGHTS 플래그도 포함해야 합니다.
ZwCreateEnlistment를 호출하는 리소스 관리자는 결국 ZwClose를 호출하여 개체 핸들을 닫아야 합니다.
리소스 관리자는 EnlistmentKey 매개 변수를 사용하여 인리스트먼트에 대한 정보가 포함된 데이터 구조에 대한 포인터와 같이 각 인리스트먼트에 고유한 값을 할당할 수 있습니다. 예를 들어 리소스 관리자가 인리스트먼트 개체의 핸들을 구조체에 저장하는 경우 리소스 관리자는 다음을 수행할 수 있습니다.
- ZwGetNotificationResourceManager를 호출하여 알림을 받습니다.
- TRANSACTION_NOTIFICATION 구조체에서 인리스트먼트 키 값을 가져옵니다.
- 인리스트먼트 키를 사용하여 저장된 인리스트먼트 개체 핸들을 찾습니다.
- ZwCommitComplete 또는 ZwRollbackComplete와 같은 입력으로 인리스트먼트 핸들이 필요한 루틴을 호출합니다.
커널 모드 드라이버에서 호출하는 경우 Windows 네이티브 시스템 서비스 루틴의 NtXxx 및 ZwXxx 버전은 입력 매개 변수를 처리하고 해석하는 방식으로 다르게 동작할 수 있습니다. 루틴의 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 |
추가 정보
네이티브 시스템 서비스 루틴의 Nt 및 Zw 버전 사용