ObDereferenceObjectDeferDeleteWithTag 関数 (wdm.h)
ObDereferenceObjectDeferDeleteWithTag ルーチンは、指定されたオブジェクトの参照カウントをデクリメントし、デッドロックを回避するためにオブジェクトの削除を延期し、オブジェクト参照トレースをサポートするために 4 バイトのタグ値を オブジェクトに書き込みます。
構文
void ObDereferenceObjectDeferDeleteWithTag(
[in] PVOID Object,
[in] ULONG Tag
);
パラメーター
[in] Object
オブジェクトへのポインター。 呼び出し元は、オブジェクトを作成するとき、またはオブジェクトを開いた後の ObReferenceObjectByHandleWithTag ルーチンの前回の呼び出しから、このポインターを取得します。
[in] Tag
4 バイトのカスタム タグ値を指定します。 詳細については、「解説」を参照してください。
戻り値
なし
解説
ObDereferenceObjectDeferDeleteWithTag は ObDereferenceObjectWithTag に似ていますが、オブジェクトの参照カウントが 0 に達すると、 ObDereferenceObjectDeferDeleteWithTag はオブジェクト削除要求をワーカー スレッドに渡します。 IRQL = PASSIVE_LEVELで実行されるワーカー スレッドは、後で オブジェクトを削除します。
現在のスレッドによるオブジェクトの即時削除によってデッドロックが発生する可能性がある場合は、オブジェクトを逆参照するために ObDereferenceObjectWithTag を呼び出さないでください。 代わりに、 ObDereferenceObjectDeferDeleteWithTag を呼び出してオブジェクトを逆参照します。
たとえば、ドライバー スタック上の上位レベルのドライバーがロックを保持しているときに 、ObDereferenceObjectWithTag を使用して カーネル トランザクション マネージャー (KTM) オブジェクトを逆参照すると、このようなデッドロックが発生する可能性があります。
オブジェクトの永続性とオブジェクト属性の詳細については、「 ObDereferenceObjectWithTag」を参照してください。 オブジェクト参照の詳細については、「 オブジェクトのライフ サイクル」を参照してください。
ObDereferenceObjectDeferDelete ルーチンは ObDereferenceObjectDeferDeleteWithTag に似ていますが、呼び出し元がオブジェクトにカスタム タグを書き込むのを許可しない点が例外です。 Windows 7 以降のバージョンの Windows では、 ObDereferenceObjectDeferDelete は常に既定のタグ値 ('tlfD') を オブジェクトに書き込みます。 ObDereferenceObjectDeferDelete の呼び出しは、Tag = 'tlfD' を指定する ObDereferenceObjectDeferDeleteWithTag の呼び出しと同じ効果があります。
Windows デバッグ ツールでオブジェクト参照トレースを表示するには、!obtrace カーネル モード デバッガー拡張機能を使用します。 Windows 7 では、オブジェクト参照トレースが有効になっている場合、 !obtrace 拡張機能が拡張され、オブジェクト参照タグが表示されます。 既定では、オブジェクト参照トレースはオフになっています。 オブジェクト参照トレースを有効にするには、 グローバル フラグ エディター (Gflags) を使用します。 詳細については、「 タグを使用したオブジェクト参照トレース」を参照してください。
要件
要件 | 値 |
---|---|
サポートされている最小のクライアント | Windows 7 以降のバージョンの Windows オペレーティング システムで使用できます。 |
対象プラットフォーム | ユニバーサル |
Header | wdm.h (Wdm.h、Ntddk.h、Ntifs.h、Fltkernel.h を含む) |
Library | NtosKrnl.lib |
[DLL] | NtosKrnl.exe |
IRQL | <= DISPATCH_LEVEL |