Método IWMDMOperation::TransferObjectData (mswmdm.h)
Se llama al método TransferObjectData para permitir que la aplicación transfiera un bloque de datos hacia o desde el equipo.
Sintaxis
HRESULT TransferObjectData(
BYTE *pData,
DWORD *pdwSize,
BYTE [8] abMac
);
Parámetros
pData
Puntero a un búfer que contiene los datos. Windows Media Administrador de dispositivos asigna y libera siempre este búfer. La aplicación nunca debe asignar o liberar este búfer.
BeginRead[in] Durante una lectura del dispositivo, los datos entrantes que se deben descifrar mediante el método CSecureChannelClient::D ecryptParam . La aplicación no necesita desasignar el búfer.
BeginWrite[in, out] Durante una escritura en el dispositivo, en la entrada es un búfer de memoria pdwSize bytes long, asignado por Windows Media Administrador de dispositivos. La aplicación debe rellenar este búfer con datos cifrados mediante el método CSecureChannelClient::EncryptParam .
pdwSize
Puntero a un DWORD que especifica el tamaño del búfer de transferencia.
BeginRead[in, out] En la entrada, el tamaño de los datos entrantes en pData. En la salida, la cantidad de datos que la aplicación ha leído realmente.
Entrada BeginWriteOn , el tamaño del búfer pData . En la salida, el tamaño real de los datos enviados.
abMac
Matriz de bytes que especifican el código de autenticación de mensajes para los datos de parámetros de este método.
BeginRead[in] Un MAC generado a partir de pData y pdwSize que la aplicación debe comprobar después de descifrar pData , para comprobar que los datos no se han modificado.
BeginWrite[out] Un MAC generado a partir de pData y pdwSize antes de cifrar pData .
Valor devuelto
La aplicación debe devolver uno de los siguientes valores HRESULT .
Código devuelto | Descripción |
---|---|
|
La operación de lectura debe continuar. |
|
La operación de lectura debe cancelarse sin finalizar. |
|
Error no especificado y la operación de lectura debe cancelarse sin finalizar. |
Comentarios
La aplicación puede determinar si los datos se leen o escriben en el dispositivo mediante la supervisión de si se llamó a BeginRead o BeginWrite justo antes de llamar a este método.
Ejemplos
El siguiente código de C++ muestra cómo una aplicación podría implementar TransferObjectData para controlar la transferencia de archivos. El código que se muestra controla tanto la lectura de datos de como la escritura de datos en el dispositivo. La dirección del flujo de datos se indica mediante una variable miembro m_OperationStatus, establecida en una llamada anterior a BeginRead o 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;
}
Requisitos
Requisito | Value |
---|---|
Plataforma de destino | Windows |
Encabezado | mswmdm.h |
Library | Mssachlp.lib |