フレームワーク オブジェクトのライフ サイクル

フレームワーク オブジェクトの "ライフ サイクル" は、オブジェクトが作成された時点から削除された時点までです。オブジェクトを削除するタイミングは、オブジェクトの参照カウントが制御します。

フレームワーク オブジェクトの作成

ほとんどのフレームワーク オブジェクトは、ドライバーがオブジェクトの作成メソッドを呼び出すことで作成されます。たとえば、各フレームワーク ドライバーは、フレームワーク ドライバー オブジェクトを作成するのに WdfDriverCreate を呼び出す必要があります。

その他のフレームワーク オブジェクトは、フレームワークにより作成されます。たとえば、ユーザー アプリケーションが読み取り操作または書き込み操作のためにデバイスを開くとき、フレームワークはフレームワーク ファイル オブジェクトを作成し、ドライバーの EvtDeviceFileCreate コールバック関数に渡します。

一部のフレームワーク オブジェクトは、フレームワークまたはドライバーにより作成されます。たとえば、I/O マネージャーが I/O 要求をドライバーに送信すると、フレームワークは、通常、ドライバーの要求ハンドラーのいずれかを呼び出すことでフレームワーク要求オブジェクトを作成し、それをドライバーに送信します。また、ドライバーはフレームワーク要求オブジェクトを作成し、それを他のドライバーに送信することもできます。

参照カウントの使用

フレームワークは、各オブジェクトの参照カウントを保持します。オブジェクトが作成されると、フレームワークはその参照カウントを 1 に設定します。参照カウントがゼロになると、フレームワークはオブジェクトを削除します。

ドライバーは、WdfObjectReference を呼び出して参照カウントをインクリメントするか、または WdfObjectDereference を呼び出して参照カウントをデクリメントすることにより、オブジェクトの参照カウントを変更できます。ドライバーは、事前に WdfObjectReference を呼び出した場合に限り、WdfObjectDereference を呼び出すことができます。

ほとんどの場合、ドライバーはオブジェクトの参照カウントをインクリメントまたはデクリメントする必要はありません。フレームワークは、オブジェクトのハンドルをドライバーに渡す前にカウントをインクリメントし、ドライバーがオブジェクトを必要としなくなったときにカウントをデクリメントします。

オブジェクトの使用を終了する前にそのオブジェクトが (フレームワークまたはドライバー スレッドにより) 削除されないことを確実にするために、ドライバーは、WdfObjectReference を呼び出すことができます。ドライバーが WdfObjectReference および WdfObjectDereference を呼び出す必要がある状況の例については、「送信済み要求の取り消しの同期化」を参照してください。

フレームワーク オブジェクトの削除

ドライバーは WdfObjectDelete を呼び出すため、またはフレームワークは内部削除ルーチンを呼び出すため、オブジェクトは削除されますが、オブジェクトが削除されるのは、オブジェクトの参照カウントがゼロの場合のみです。ドライバーまたはフレームワークがオブジェクトの削除を試行した後も、参照カウントがゼロになるまで、オブジェクトのハンドルは有効なままです。ドライバーは、WdfObjectDereference を呼び出してオブジェクトの参照カウントをゼロにデクリメントするだけではオブジェクトを削除できず、WdfObjectDelete も呼び出す必要があります。

フレームワーク オブジェクトが親の子オブジェクトであり、その親の削除が試行された場合、フレームワークは親を削除する前に子オブジェクトの削除を試行します。

一部のフレームワーク オブジェクトの削除は、フレームワークが常に処理します。ドライバーがこれらのオブジェクトの削除を試行することはできません。ドライバーが削除できないフレームワーク オブジェクトのリストについては、「WdfObjectDelete」を参照してください。

ドライバーは、次の 2 つのコールバック関数を登録できます。フレームワークは、ドライバーまたはフレームワークがオブジェクトを削除するときに、これらのコールバック関数を呼び出します。

  • EvtCleanupCallback コールバック関数: ドライバーが削除対象のオブジェクトに対して事前に WdfObjectReference を呼び出した場合に、ドライバーが WdfObjectDereference を呼び出せるようにするために、フレームワークにより呼び出されます。

  • EvtDestroyCallback コールバック関数: オブジェクトの参照カウントがゼロにデクリメントされた後、フレームワークにより呼び出されます。

オブジェクト作成時にドライバーが割り当てたオブジェクト固有のリソースは、これらのコールバック関数のいずれかが割り当てを解除する必要があります。