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 |
---|---|
|
Der Lesevorgang sollte fortgesetzt werden. |
|
Der Lesevorgang sollte ohne Abschluss abgebrochen werden. |
|
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