ファイル転送を手動で処理する

アプリケーションは IWMDMOperation インターフェイスを実装して、読み取りまたは書き込みプロセスの一部を管理できます。 デバイスからの読み取り時、実装により、アプリケーションはデバイス ファイルから生データのブロックを受信できます。 デバイスへの書き込み時、アプリケーションは生データのブロックをデバイス上のファイルに送信できます。

読み取りと書き込みの両方の操作で、IWMDMOperation::TransferObjectData メソッドはコンピューターとデバイスの間でデータを渡します。 データ転送の方向を知るには、Windows Media デバイス マネージャーによって BeginRead または BeginWrite が呼び出されたときに、アプリケーションでフラグを設定する必要があります。 End メソッドが呼び出されたら、アプリケーションでこのフラグをリセットする必要があります。

Note

サービス プロバイダーとデバイスで IMDSPObject2 が適切に実装されている場合、最初にアプリケーションの IWMDMOperation3::TransferObjectDataOnClearChannel メソッドが呼び出されます (実装されている場合)。 この方法は、データを転送するよりも効率的な方法です。 TransferObjectDataOnClearChannelTransferObjectData と同じ方法で処理されます。ただし、データが暗号化されることはなく、検証する MAC 値はありません。

 

以下のセクションでは、アプリケーションで IWMDMOperation を実装するときの読み取りと書き込みの両方のプロセスについて説明します。

デバイスからの読み取り

デバイスからファイルを読み取るとき、Windows Media デバイス マネージャーは以下の IWMDMOperation メソッドを順番に呼び出します。

  • BeginRead デバイスからの読み取りが始まることをアプリケーションに通知するために呼び出されます。
  • TransferObjectData 1 回以上呼び出されます。 データの処理について以下の手順で説明します。
    1. TransferObjectData は、データが格納されたサイズ pdwSize バイトのバッファー pData と、受信データを検証するための MAC を受け取ります。
    2. アプリケーションで、受信データの MAC を使用して受信パラメーターを検証します。
    3. アプリケーションで pData 内のできるだけ多くのデータを暗号化解除して読み取り、pdwSize の戻り値を変更して、実際に読み取られたバイト数を示します。
    4. アプリケーションで CSecureChannelClient::D ecryptParam を使用してデータの暗号化を解除し、必要に応じて格納または使用します。
    5. TransferObjectData から S_OK が返されます。
    6. Windows Media デバイス マネージャーは、アプリケーションがファイルからすべてのデータを読み取るまで、TransferObjectData を呼び出し続けます。または、アプリケーションが WMDM_E_USER_CANCELLED を返して操作を取り消します (その場合は読み取りが取り消され、Windows Media デバイス マネージャーは End を呼び出します)。
  • End デバイスからの読み取りが終わることをアプリケーションに通知するために呼び出されます。

デバイスへの書き込み

デバイスにファイルを書き込むとき、Windows Media デバイス マネージャーは以下の IWMDMOperation メソッドを順番に呼び出します。

  • GetObjectName アプリケーションで新しいストレージの名前を指定できるようにするために呼び出されます。 このメソッドは、アプリケーションが Insert メソッドで名前を指定しなかった場合にのみ呼び出されます。
  • GetObjectAttributes アプリケーションでデバイス上の新しいストレージの属性を指定できるようにするために呼び出されます。
  • BeginWrite デバイスへの書き込みが始まることを通知するために呼び出されます。
  • GetObjectTotalSize デバイスに書き込まれるオブジェクトの合計サイズを取得し、転送の最適化を有効にし、ファイルがデバイスに対して大きすぎる場合に Windows Media Device Manager に転送をキャンセルする機会を与えるために呼び出されます。
  • TransferObjectData 1 回以上呼び出されます。 データの処理について以下の手順で説明します。
    1. TransferObjectData は、サイズ pdwSize バイトのバッファーへのポインターを受け取ります。
    2. アプリケーションは、通常、ファイルからデータを読み取ってデバイスに送信するデータ ブロックを取得し、受信したバッファーに最大 pdwSize バイトを格納します。 pdwSize を変更して (必要な場合)、バッファーに追加されたバイト数を反映する必要があります。
    3. アプリケーションで、すべてのメソッド パラメーターの MAC を作成します。
    4. アプリケーションで、CSecureChannelClient::EncryptParam を使用してバッファー内のデータを暗号化します。
    5. TransferObjectData は、さらにデータがあることを示す S_OK を返すか、これ以上データがないことを示す S_FALSE を返します。 アプリケーションが WMDM_E_USER_CANCELLED を返した場合、書き込み操作は取り消され、Windows Media デバイス マネージャーは End を呼び出します。
    6. アプリケーションが S_OK を返す限り、Windows Media デバイス マネージャーは TransferObjectData を呼び出し続けます。
  • End デバイスへの書き込みが終わることを通知するために呼び出されます。

コード例については、「暗号化と暗号化解除」を参照してください。

Windows Media デバイス マネージャー アプリケーションの作成