次の方法で共有


IWMDMOperation::TransferObjectData メソッド (mswmdm.h)

TransferObjectData メソッドは、アプリケーションがコンピューター間でデータ ブロックを転送できるようにするために呼び出されます。

構文

HRESULT TransferObjectData(
  BYTE     *pData,
  DWORD    *pdwSize,
  BYTE [8] abMac
);

パラメーター

pData

データを含むバッファーへのポインター。 このバッファーは、Windows Media デバイス マネージャーによって常に割り当てられ、解放されます。 アプリケーションでは、このバッファーを割り当てたり解放したりしないでください。

BeginRead[in] デバイスからの読み取り中に、 CSecureChannelClient::D ecryptParam メソッドを使用して暗号化を解除する必要がある受信データ。 アプリケーションでバッファーの割り当てを解除する必要はありません。

BeginWrite[in, out] デバイスへの書き込み中に、入力時には、Windows Media デバイス マネージャーによって割り当てられたメモリ バッファー pdwSize バイト長です。 アプリケーションは、 CSecureChannelClient::EncryptParam メソッドを使用して暗号化されたデータをこのバッファーに格納する必要があります。

pdwSize

転送バッファー サイズを指定する DWORD へのポインター。

BeginRead[in, out] 入力時に、 pData 内の受信データのサイズ。 出力時に、アプリケーションが実際に読み取ったデータの量。

BeginWriteOn 入力。 pData バッファーのサイズ。 出力時に送信されるデータの実際のサイズ。

abMac

このメソッドのパラメーター データのメッセージ認証コードを指定するバイト配列。

BeginRead[in] pDatapdwSize から生成された MAC。データが変更されていないことを確認するために、pData の暗号化が解除された後にアプリケーションがチェックする必要があります。

BeginWrite[out] pData が暗号化される前に pData と pdwSize から生成された MAC。

戻り値

アプリケーションは、次のいずれかの HRESULT 値を返す必要があります。

リターン コード 説明
S_OK
読み取り操作を続行する必要があります。
WMDM_E_USER_CANCELLED
読み取り操作は、完了せずに取り消す必要があります。
E_FAIL
指定されていないエラーが発生しました。読み取り操作は完了せずに取り消す必要があります。

注釈

アプリケーションは、このメソッドが呼び出される直前に BeginRead または BeginWrite が呼び出されたかどうかを監視することで、データの読み取り元またはデバイスへの書き込みの有無を判断できます。

次の C++ コードは、アプリケーションが TransferObjectData を実装してファイル転送自体を処理する方法を示しています。 示されているコードは、デバイスからのデータの読み取りとデバイスへのデータの書き込みの両方を処理します。 データ フローの方向は、BeginRead または BeginWrite の前の呼び出しで設定されたメンバー変数m_OperationStatusによって示されます。


HRESULT TransferObjectData(BYTE* pData, DWORD* pdwSize, BYTE* pMac)
{
    HRESULT hr = S_OK;

    // Verify parameters.
    if (pData == NULL || pdwSize == NULL || pMac == NULL || m_File == INVALID_HANDLE_VALUE) 
    {
        // TODO: Display the message: "Invalid argument in SetObjectTotalSize."
        return E_INVALIDARG;
    }
    if ((m_OperationStatus != OPERATION_READ) && (m_OperationStatus != OPERATION_WRITE))
    {
        // TODO: Display the message: "Unable to determine direction of data transfer."
        return E_FAIL;
    }

    //////////////////////////////////////////////////////////////////////////
// Sending data to the device.
//////////////////////////////////////////////////////////////////////////
    if (m_OperationStatus == OPERATION_WRITE)
    {
        DWORD   dwReadLen;
        // The SAC is used to encrypt the data sent to the device.
        if (m_pSAC == NULL) 
        {
               // TODO: Display the message: "SAC not initialized in TransferObjectData."
            return E_FAIL;
        }

        // Read pdwSize bytes from the file into pData.
        dwReadLen = *pdwSize;
        if (ReadFile(m_File, pData, dwReadLen, pdwSize, NULL) == FALSE) 
        {
               // TODO: Display the message: "Couldn't read the file in TransferObjectData."
            return E_FAIL;
        }

        // If there is no more data, terminate the transfer.
        if (*pdwSize == 0)
        {
            return S_FALSE;
        }

        // Create the MAC to return to Windows Media Device Manager.
        HMAC hMAC;
        hr = m_pSAC->MACInit(&hMAC);
        hr = m_pSAC->MACUpdate(hMAC, (BYTE*)(pData), *pdwSize);
        hr = m_pSAC->MACUpdate(hMAC, (BYTE*)(pdwSize), sizeof(DWORD));
        hr = m_pSAC->MACFinal(hMAC, (BYTE*)pMac);
        if (hr != S_OK) return E_FAIL;

        // Encrypt the data to send to the service provider/device.
        hr = m_pSAC->EncryptParam((BYTE*)(pData), *pdwSize);
        if (hr != S_OK) 
        {
            return E_FAIL;
        }
    }
    //////////////////////////////////////////////////////////////////////////
// Receiving data from the device.
//////////////////////////////////////////////////////////////////////////
    else 
    {
        // Copy the data to a temporary file for decryption.
        BYTE *pTmpData = new BYTE [*pdwSize];
        if (pTmpData == NULL)
        {
            return E_OUTOFMEMORY;
        }
        memcpy(pTmpData, pData, *pdwSize);

        // Decrypt the pData Parameter
        hr = m_pSAC->DecryptParam(pTmpData, *pdwSize);
        
        // Verify the MAC of the decrypted data.
        HMAC hMAC;
        BYTE pTestMac[WMDM_MAC_LENGTH];
        hr = m_pSAC->MACInit(&hMAC);
        hr = m_pSAC->MACUpdate(hMAC, (BYTE*)(pTmpData), *pdwSize);
        hr = m_pSAC->MACUpdate(hMAC, (BYTE*)(pdwSize), sizeof(*pdwSize));
        hr = m_pSAC->MACFinal(hMAC, pTestMac);
        if ((memcmp(pMac, pTestMac, WMDM_MAC_LENGTH) != 0) || (hr != S_OK))
        {
            delete [] pTmpData;
            return WMDM_E_MAC_CHECK_FAILED;
        }

        // Write the data to file, and record the amount of data written.
        DWORD dwWritten = 0;
        if (WriteFile(m_File,pTmpData,*pdwSize,&dwWritten,NULL))
        {
            hr = S_OK;
            *pdwSize = dwWritten;
        }
        else 
        {
            hr = HRESULT_FROM_WIN32(GetLastError());
        }
        if (pTmpData)
        {
            delete [] pTmpData;
        }
    }
    return hr;
}

要件

要件
対象プラットフォーム Windows
ヘッダー mswmdm.h
Library Mssachlp.lib

こちらもご覧ください

暗号化と暗号化解除

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

IWMDMOperation インターフェイス

セキュリティで保護された認証済みチャネルの使用