TmXxx ルーチンの使用
ほとんどの KTM ルーチンは、 ZwXxx の名前前付け形式を使用します。 これらのルーチンはハンドルベースです。 つまり、入力パラメーターまたは出力パラメーターの少なくとも 1 つは、KTM オブジェクトへのハンドルです。
KTM では、 TmXxxの名前付け形式を使用するルーチンの数も少なくなります。 これらのルーチンはポインターベースです。 入力パラメーターまたは出力パラメーターの少なくとも 1 つは、KTM オブジェクトへのポインターです。
一部の TmXxx ルーチンは、 ZwXxx ルーチンを複製します。 その他の TmXxx ルーチンには ZwXxx に相当するものはありません。
ほとんどの場合、 ZwXxx ルーチンを使用する必要があります。 ただし、次の状況では TmXxx ルーチンを使用する必要があります。
リソース マネージャーは ResourceManagerNotification コールバック ルーチン を使用します。このコールバック ルーチンは、ハンドルの代わりに参加オブジェクトへのポインターを提供します。
参加オブジェクト ポインターは、参加オブジェクト TmXxx ルーチンに渡すことができます。
トランザクション処理システム (TPS) コンポーネントは、KTM への多数の高速呼び出しを実行します。これにより、システムのパフォーマンスが低下する可能性があります。
この場合、コンポーネントは ObReferenceObjectByHandle を呼び出して、各 KTM オブジェクト ハンドルをポインターに変換し、ポインターを保存してから、ポインターを TmXxx ルーチンに渡すことができます。 この変換により、 ZwXxx ルーチンが呼び出されるたびに、KTM が各ハンドルを内部的にポインターに変換する必要がなくなります。
ObReferenceObectByHandle の呼び出しには、適切な KTM 定義フラグを含むアクセス マスクを含める必要があります。 これらのフラグは、「KTM の作成およびオープン ルーチン」のリファレンス ページで説明しています。
コンポーネントが KTM オブジェクトの使用を完了したときに、 ObDereferenceObjectDeferDelete または ObDereferenceObjectを呼び出してオブジェクトを逆参照する必要があります。
コンポーネントやドライバ スタック内の他のコンポーネントが、スピン ロック、ミューテックス オブジェクト、高速ミューテックスなど、システムが提供するロックを保持している場合は、 ObDereferenceObjectDeferDelete を使用する必要があります。
システム指定のロックをドライバー スタック上のコンポーネントが保持していないことが確実な場合は、 ObDereferenceObject を使用できます。
KTM がオブジェクト名前空間のロックを保持している可能性があるため、ロックを保持しているときにコンポーネントが ObDereferenceObject を呼び出すと、デッドロックが発生する可能性があります。 また、コンポーネントは TmGetTransactionId を呼び出して QueryInformationTransactionよりも効率的にトランザクションの識別子をすばやく取得できます。
ZwXxx ルーチンで提供されない機能が必要です。
具体的には、リソース マネージャーは次のルーチンを呼び出すことができます。
- コールバック ルーチンによる通知の非同期配信を有効にするTmEnableCallbacks 。
- TmReferenceEnlistmentKey と TmDereferenceEnlistmentKey を使用して、参加オブジェクトのキー参照カウントをインクリメントまたはデクリメントします。
- TmRequestOutcomeEnlistment を使用して、参加リストの即時コミットまたはロールバック通知を要求します。
- トランザクションがアクティブな状態であるかどうかを判断するTmIsTransactionActive 。