Catatan
Akses ke halaman ini memerlukan otorisasi. Anda dapat mencoba masuk atau mengubah direktori.
Akses ke halaman ini memerlukan otorisasi. Anda dapat mencoba mengubah direktori.
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 |
|---|---|
|
Operasi baca harus dilanjutkan. |
|
Operasi baca harus dibatalkan tanpa selesai. |
|
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 |