Метод 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 input , размер буфера pData . В выходных данных — фактический размер отправляемых данных.
abMac
Массив байтов, указывающий код проверки подлинности сообщения для данных параметров этого метода.
BeginRead[in] Mac,созданный из pData и pdwSize, который приложение должно проверка после расшифровки pData, чтобы убедиться, что данные не были изменены.
BeginWrite[out] Mac-адрес, созданный из pData и pdwSize перед шифрованием pData .
Возвращаемое значение
Приложение должно вернуть одно из следующих значений HRESULT .
Код возврата | Описание |
---|---|
|
Операция чтения должна продолжиться. |
|
Операция чтения должна быть отменена без завершения. |
|
Произошла неустановленная ошибка, и операция чтения должна быть отменена без завершения. |
Комментарии
Приложение может определить, считываются ли данные с устройства или записываются на устройство, отслеживая, был ли вызван метод BeginRead или BeginWrite непосредственно перед вызовом этого метода.
Примеры
В следующем коде C++ показано, как приложение может реализовать TransferObjectData для обработки самой передачи файлов. Показанный код обрабатывает как чтение данных с устройства, так и их запись на устройство. Направление потока данных определяется переменной-членом m_OperationStatus, заданной в предыдущем вызове BeginRead или 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;
}
Требования
Требование | Значение |
---|---|
Целевая платформа | Windows |
Header | mswmdm.h |
Библиотека | Mssachlp.lib |