Méthode IWMDMOperation ::TransferObjectData (mswmdm.h)
La méthode TransferObjectData est appelée pour permettre à l’application de transférer un bloc de données vers ou depuis l’ordinateur.
Syntaxe
HRESULT TransferObjectData(
BYTE *pData,
DWORD *pdwSize,
BYTE [8] abMac
);
Paramètres
pData
Pointeur vers une mémoire tampon contenant les données. Cette mémoire tampon est toujours allouée et libérée par Windows Media Gestionnaire de périphériques. Votre application ne doit jamais allouer ou libérer cette mémoire tampon.
BeginRead[in] Lors d’une lecture à partir d’un appareil, données entrantes qui doivent être déchiffrées à l’aide de la méthode CSecureChannelClient ::D ecryptParam . L’application n’a pas besoin de libérer la mémoire tampon.
BeginWrite[in, out] Pendant une écriture sur l’appareil, l’entrée est une mémoire tampon pdwSize octets de longue durée, allouée par Windows Media Gestionnaire de périphériques. L’application doit remplir cette mémoire tampon avec des données chiffrées à l’aide de la méthode CSecureChannelClient ::EncryptParam .
pdwSize
Pointeur vers un DWORD qui spécifie la taille de la mémoire tampon de transfert.
BeginRead[in, out] Lors de l’entrée, la taille des données entrantes dans pData. En sortie, la quantité de données que l’application a effectivement lues.
Entrée BeginWriteOn , taille de la mémoire tampon pData . À la sortie, la taille réelle des données envoyées.
abMac
Tableau d’octets spécifiant le code d’authentification de message pour les données de paramètre de cette méthode.
BeginRead[in] Mac généré à partir de pData et pdwSize que l’application doit case activée après le déchiffrement de pData, pour vérifier que les données n’ont pas été modifiées.
BeginWrite[out] Mac généré à partir de pData et pdwSize avant le chiffrement de pData .
Valeur retournée
L’application doit retourner l’une des valeurs HRESULT suivantes.
Code de retour | Description |
---|---|
|
L’opération de lecture doit continuer. |
|
L’opération de lecture doit être annulée sans se terminer. |
|
Une erreur non spécifiée s’est produite et l’opération de lecture doit être annulée sans se terminer. |
Remarques
L’application peut déterminer si les données sont lues ou écrites sur l’appareil en surveillant si BeginRead ou BeginWrite a été appelé juste avant l’appel de cette méthode.
Exemples
Le code C++ suivant montre comment une application peut implémenter TransferObjectData pour gérer elle-même le transfert de fichiers. Le code affiché gère à la fois la lecture des données à partir de l’appareil et l’écriture de données. La direction du flux de données est indiquée par une variable membre m_OperationStatus, définie dans un appel précédent sur BeginRead ou 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;
}
Configuration requise
Condition requise | Valeur |
---|---|
Plateforme cible | Windows |
En-tête | mswmdm.h |
Bibliothèque | Mssachlp.lib |