共用方式為


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] 在寫入裝置期間,輸入是記憶體緩衝區 pdwSize 位元組長,由 Windows Media 裝置管理員 所配置。 應用程式應該使用 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
發生未指定的錯誤,而且應該取消讀取作業而不完成。

備註

應用程式可以監視是否在呼叫此方法之前呼叫 BeginReadBeginWrite ,來判斷正在讀取或寫入裝置的數據。

範例

下列 C++ 程式代碼示範應用程式如何實作 TransferObjectData 來處理檔案傳輸本身。 顯示的程式代碼會處理讀取數據,以及將數據寫入裝置。 數據流的方向是由成員變數 m_OperationStatus所指示,在呼叫 BeginReadBeginWrite 之前設定。


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
程式庫 Mssachlp.lib

另請參閱

加密和解密

手動處理檔案傳輸

IWMDMOperation 介面

使用安全驗證的通道