Bagikan melalui


Metode IWMDMOperation::TransferObjectData (mswmdm.h)

Metode TransferObjectData dipanggil untuk memungkinkan aplikasi mentransfer blok data ke atau dari komputer.

Sintaks

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

Parameter

pData

Penunjuk ke buffer yang berisi data. Buffer ini selalu dialokasikan dan dibebaskan oleh Windows Media Device Manager. Aplikasi Anda tidak boleh mengalokasikan atau membebaskan buffer ini.

BeginRead[in] Selama membaca dari perangkat, data masuk yang harus didekripsi menggunakan metode CSecureChannelClient::D ecryptParam . Aplikasi tidak perlu membatalkan alokasi buffer.

BeginWrite[in, out] Selama penulisan ke perangkat, pada input adalah buffer memori pdwSize byte panjang, dialokasikan oleh Windows Media Device Manager. Aplikasi harus mengisi buffer ini dengan data yang telah dienkripsi menggunakan metode CSecureChannelClient::EncryptParam .

pdwSize

Penunjuk ke DWORD yang menentukan ukuran buffer transfer.

BeginRead[in, out] Pada input, ukuran data masuk dalam pData. Pada output, jumlah data yang sebenarnya telah dibaca aplikasi.

Input BeginWriteOn , ukuran buffer pData . Pada output, ukuran aktual data yang dikirimkan.

abMac

Array byte yang menentukan kode autentikasi pesan untuk data parameter metode ini.

BeginRead[in] MAC yang dihasilkan dari pData dan pdwSize bahwa aplikasi harus memeriksa setelah pData didekripsi, untuk memverifikasi bahwa data belum dimodifikasi.

BeginWrite[out] MAC yang dihasilkan dari pData dan pdwSize sebelum pData dienkripsi.

Nilai kembali

Aplikasi harus mengembalikan salah satu nilai HRESULT berikut.

Menampilkan kode Deskripsi
S_OK
Operasi baca harus dilanjutkan.
WMDM_E_USER_CANCELLED
Operasi baca harus dibatalkan tanpa selesai.
E_FAIL
Terjadi kesalahan yang tidak ditentukan, dan operasi baca harus dibatalkan tanpa menyelesaikannya.

Keterangan

Aplikasi dapat menentukan apakah data sedang dibaca dari atau ditulis ke perangkat dengan memantau apakah BeginRead atau BeginWrite dipanggil tepat sebelum metode ini dipanggil.

Contoh

Kode C++ berikut menunjukkan bagaimana aplikasi dapat mengimplementasikan TransferObjectData untuk menangani transfer file itu sendiri. Kode yang ditampilkan menangani pembacaan data dari dan menulis data ke perangkat. Arah aliran data ditunjukkan oleh variabel anggota m_OperationStatus, diatur dalam panggilan sebelumnya ke BeginRead atau BeginWrite.


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;
}

Persyaratan

Persyaratan Nilai
Target Platform Windows
Header mswmdm.h
Pustaka Mssachlp.lib

Lihat juga

Enkripsi dan Dekripsi

Menangani Transfer File Secara Manual

Antarmuka IWMDMOperation

Menggunakan Saluran Terautentikasi Aman