IWMDMOperation::TransferObjectData-Methode (mswmdm.h)

Die TransferObjectData-Methode wird aufgerufen, damit die Anwendung einen Datenblock an den oder vom Computer übertragen kann.

Syntax

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

Parameter

pData

Zeiger auf einen Puffer, der die Daten enthält. Dieser Puffer wird immer von Windows Media Geräte-Manager zugeordnet und freigegeben. Ihre Anwendung sollte diesen Puffer niemals zuordnen oder freigeben.

BeginRead[in] Während eines Lesevorgangs vom Gerät eingehende Daten, die mit der CSecureChannelClient::D ecryptParam-Methode entschlüsselt werden müssen. Die Anwendung muss die Zuordnung des Puffers nicht aufheben.

BeginWrite[in, out] Während eines Schreibvorgangs auf ein Gerät wird bei der Eingabe ein Speicherpuffer pdwSize bytes long, der von Windows Media Geräte-Manager zugeordnet wird. Die Anwendung sollte diesen Puffer mit Daten füllen, die mit der CSecureChannelClient::EncryptParam-Methode verschlüsselt wurden.

pdwSize

Zeiger auf ein DWORD , das die Größe des Übertragungspuffers angibt.

BeginRead[in, out] Bei der Eingabe die Größe der eingehenden Daten in pData. Bei der Ausgabe die Menge der Daten, die die Anwendung tatsächlich gelesen hat.

BeginWriteOn-Eingabe , die Größe des pData-Puffers . Bei der Ausgabe die tatsächliche Größe der gesendeten Daten.

abMac

Bytearray, das den Nachrichtenauthentifizierungscode für die Parameterdaten dieser Methode angibt.

BeginRead[in] Ein MAC, der aus pData und pdwSize generiert wird, dass die Anwendung überprüfen sollte, nachdem pData entschlüsselt wurde, um zu überprüfen, ob die Daten nicht geändert wurden.

BeginWrite[out] Ein MAC, der aus pData und pdwSize generiert wird, bevor pData verschlüsselt wird.

Rückgabewert

Die Anwendung sollte einen der folgenden HRESULT-Werte zurückgeben.

Rückgabecode BESCHREIBUNG
S_OK
Der Lesevorgang sollte fortgesetzt werden.
WMDM_E_USER_CANCELLED
Der Lesevorgang sollte ohne Abschluss abgebrochen werden.
E_FAIL
Ein nicht angegebener Fehler ist aufgetreten, und der Lesevorgang sollte abgebrochen werden, ohne abgeschlossen zu sein.

Hinweise

Die Anwendung kann ermitteln, ob Daten vom Gerät gelesen oder auf das Gerät geschrieben werden, indem überwacht wird , ob BeginRead oder BeginWrite kurz vor dem Aufruf dieser Methode aufgerufen wurde.

Beispiele

Der folgende C++-Code veranschaulicht, wie eine Anwendung TransferObjectData implementieren kann, um die Dateiübertragung selbst zu verarbeiten. Der gezeigte Code behandelt sowohl das Lesen von Daten als auch das Schreiben von Daten auf das Gerät. Die Richtung des Datenflusses wird durch eine Membervariable m_OperationStatus angegeben, die in einem vorherigen Aufruf von BeginRead oder BeginWrite festgelegt wird.


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

Anforderungen

Anforderung Wert
Zielplattform Windows
Kopfzeile mswmdm.h
Bibliothek Mssachlp.lib

Weitere Informationen

Verschlüsselung und Entschlüsselung

Manuelles Behandeln von Dateiübertragungen

IWMDMOperation-Schnittstelle

Verwenden von sicher authentifizierten Kanälen