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、 ZwPrePrepareComplete、 ZwPrepareComplete、 ZwCommitComplete、 ZwRollbackComplete、 ZwSinglePhaseReject、 ZwReadOnlyEnlistment を参照)。 |
ENLISTMENT_SUPERIOR_RIGHTS | 上位のトランザクション マネージャーが実行する必要がある操作を実行します (ZwPrepareEnlistment、ZwPrePrepareEnlistment、ZwCommitEnlistment を参照)。 |
または、次の ACCESS_MASK ビットマップの 1 つ以上を指定することもできます。 これらのビットマップは、前の表のフラグと、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 バージョン間の関係の詳細については、「Using Nt and Zw Versions of the Native System Services Routines」を参照してください。
要件
要件 | 値 |
---|---|
サポートされている最小のクライアント | Windows Vista 以降のオペレーティング システム バージョンで使用できます。 |
対象プラットフォーム | ユニバーサル |
Header | wdm.h (Wdm.h、Ntddk.h、Ntifs.h を含む) |
Library | NtosKrnl.lib |
[DLL] | NtosKrnl.exe |
IRQL | PASSIVE_LEVEL |
DDI コンプライアンス規則 | HwStorPortProhibitedDIs、PowerIrpDDis |
こちらもご覧ください
Nt および Zw バージョンのネイティブ システム サービス ルーチンの使用