Compartir a través de


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
S_OK
La operación de lectura debe continuar.
WMDM_E_USER_CANCELLED
La operación de lectura debe cancelarse sin finalizar.
E_FAIL
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

Consulte también

Cifrado y descifrado

Control manual de transferencias de archivos

IWMDMOperation (Interfaz)

Uso de canales autenticados seguros