次の方法で共有


一般的な I/O ターゲットの初期化

フレームワークは、ドライバーが WdfDeviceCreate呼び出すときに、デバイスのドライバーのローカル I/O ターゲットを初期化します。 デバイスのローカル I/O ターゲットへのハンドルを取得するには、ドライバーは WdfDeviceGetIoTargetを呼び出します。

ほとんどのドライバーは、ローカル I/O ターゲットにのみ要求を送信します。

デバイスのリモート I/O ターゲットを初期化するには、ドライバーは次の操作を行う必要があります。

  1. WdfIoTargetCreate呼び出して、I/O ターゲット オブジェクトを作成します。

  2. ドライバーが要求を送信できるようにするため、WdfIoTargetOpen を呼び出して I/O ターゲットを開きます。

ドライバーが WdfIoTargetOpen呼び出すと、通常、オブジェクト名を表す Unicode 文字列を指定することによってリモート I/O ターゲット識別されます。 この名前は、デバイス、ファイル、またはデバイス インターフェイスを識別できます。 フレームワークは、オブジェクト名をサポートするドライバー スタックの先頭に I/O 要求を送信します。

まれに、ドライバーが Windows ドライバー モデル (WDM) DEVICE_OBJECT 構造体へのポインターを指定することによって、リモート I/O ターゲットを識別することがあります。 このポインターは、呼び出し元のドライバーのスタック内の別のドライバーを識別します。 フレームワーク ベースのドライバーは、他のドライバーの DEVICE_OBJECT 構造にアクセスすることはほとんどないため、この手法を使用することはほとんどありません。

次の例は、Ndisedge サンプル ドライバーが上記の手法を使用してリモート I/O ターゲットを作成して開く方法を示しています。

status = WdfIoTargetCreate(Adapter->WdfDevice,
                        WDF_NO_OBJECT_ATTRIBUTES,
                        &Adapter->IoTarget);
    if (!NT_SUCCESS(status)) {
        DEBUGP(MP_ERROR, ("WdfIoTargetCreate failed 0x%x\n",
               status));
        return status;
    }

    WDF_IO_TARGET_OPEN_PARAMS_INIT_CREATE_BY_NAME(&openParams,
                                &fileName,
                                STANDARD_RIGHTS_ALL
                                );

    status = WdfIoTargetOpen(Adapter->IoTarget,
                        &openParams);
    if (!NT_SUCCESS(status)) {
        DEBUGP(MP_ERROR, ("WdfIoTargetOpen failed 0x%x\n", status));
        return status;
    }