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

フレームワーク オブジェクトの「ライフ サイクル」は、オブジェクト作成から削除までの期間に及びます。 オブジェクトの参照カウントは、オブジェクトがいつ削除されるかを制御します。

フレームワーク オブジェクトを作成します

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

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

いくつかのフレームワーク オブジェクトは、フレームワークやドライバーによって作成できます。 たとえば、I/O マネージャーがドライバーに I/O リクエストを配信する場合、フレームワークはフレームワークリクエストオブジェクトを作成し、通常はドライバーのリクエストハンドラーの1つを呼び出すことによって、それをドライバーに配信します。 ドライバーは、フレームワークリクエストオブジェクトを作成し、他のドライバーに配信することもできます。

参照カウントの使用

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

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

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

ドライバーはWdfObjectReferenceを呼び出して、オブジェクトの使用が完了する前にオブジェクトが (フレームワークまたはドライバー スレッドによって) 削除されないようにします。 ドライバーがWdfObjectReferenceWdfObjectDereferenceを呼び出す必要がある状況の例については、Synchronizing Cancellation of Sent Requestsをご参照ください。

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

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

フレームワーク オブジェクトが親の子オブジェクトであり、その親が削除されている場合、フレームワークは親を削除する前に子オブジェクトを削除しようとします。 オブジェクトの削除は、親から最も遠いオブジェクトから開始され、ルートに向かってオブジェクト階層を上がっていきます。

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

  • フレームワークはEvtCleanupCallbackコールバック関数を呼び出します。これにより、以前に削除されるオブジェクトに対してWdfObjectReferenceを呼び出したことがある場合、ドライバーはWdfObjectDereferenceを呼び出すことができます。

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

これらのコールバック関数の 1 つは、オブジェクトの作成時にドライバーが割り当てたオブジェクト固有のリソースをすべてデアロケートする必要があります。

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