次の方法で共有


ObDereferenceObject マクロ (wdm.h)

ObDereferenceObject ルーチンは、指定されたオブジェクトの参照カウントをデクリメントし、保持チェックを実行します。

構文

void ObDereferenceObject(
  [in]  a
);

パラメーター

[in] a

オブジェクトの本文へのポインター。

戻り値

なし

解説

ObDereferenceObject は、システムで使用するために予約されている値を返します。 ドライバーは、この値を VOID として扱う必要があります。

ObDereferenceObject は 、オブジェクトの参照カウントを 1 ずつ減らします。 オブジェクトが一時として作成され (作成時にOBJ_PERMANENT フラグが指定されなかった)、参照カウントが 0 に達した場合、そのオブジェクトはシステムによって削除できます。

ドライバーは、参照カウントを 0 に減らすと、作成した一時オブジェクトを削除できます。 ドライバーは、作成されなかったオブジェクトを削除しようとしないでください。

オブジェクトは、OBJ_PERMANENT オブジェクト属性フラグを指定して作成された場合、永続的です。 (オブジェクト属性の詳細については、「 InitializeObjectAttributes」を参照してください)。永続的なオブジェクトは 1 つの参照カウントで作成されるため、ドライバーが逆参照しても削除されません。 ドライバーは、 ZwMakeTemporaryObject ルーチンを使用して作成した永続的なオブジェクトを一時的なものにすることによってのみ削除できます。 作成した永続的なオブジェクトを削除するには、次の手順に従います。

  1. ObDereferenceObject を呼び出します。

  2. 必要に応じて、適切な ZwOpenXxx または ZwCreateXxx ルーチンを呼び出して、オブジェクトのハンドルを取得します。

  3. 手順 2 で取得したハンドルを使用して ZwMakeTemporaryObject を呼び出します。

  4. 手順 2 で取得したハンドルを使用して ZwClose を呼び出します。

オブジェクトの現在のスレッド (ObDereferenceObject を使用) によってすぐに削除されるとデッドロックが発生する可能性がある場合は、オブジェクト (特に Kernel Transaction Manager (KTM) オブジェクト) に ObDereferenceObject の代わりに ObDereferenceObjectDeferDelete を使用します。

要件

要件
対象プラットフォーム ユニバーサル
Header wdm.h (Wdm.h、Ntddk.h、Ntifs.h、Fltkernel.h を含む)
Library NtosKrnl.lib
[DLL] NtosKrnl.exe
IRQL IRQL <= DISPATCH_LEVEL
DDI コンプライアンス規則 HwStorPortProhibitedDDIs(storport)

こちらもご覧ください

InitializeObjectAttributes

IoGetDeviceObjectPointer

ObDereferenceObjectDeferDelete

ZwClose

ZwMakeTemporaryObject