Méthode IWMDMStorage ::SendOpaqueCommand (mswmdm.h)
La méthode SendOpaqueCommand envoie une commande au stockage via Windows Media Gestionnaire de périphériques, sans la traiter.
Syntaxe
HRESULT SendOpaqueCommand(
[in, out] OPAQUECOMMAND *pCommand
);
Paramètres
[in, out] pCommand
Pointeur vers une structure OPAQUECOMMAND contenant la commande à exécuter. Les données peuvent être transmises de deux façons : de l’application à l’appareil et de l’appareil à l’application une fois l’appel terminé.
Valeur retournée
Cette méthode retourne un code HRESULT. Toutes les méthodes d’interface dans Windows Media Gestionnaire de périphériques peuvent retourner l’une des classes suivantes de codes d’erreur :
- Codes d’erreur COM standard
- Codes d’erreur Windows convertis en valeurs HRESULT
- Codes d’erreur Gestionnaire de périphériques Windows Media
Remarques
Cette méthode est destinée aux commandes de support de stockage qui n’affectent pas le fonctionnement de Windows Media Gestionnaire de périphériques et qui doivent être transmises sans modification.
Exemples
Le code C++ suivant appelle SendOpaqueCommand pour effectuer une étape d’authentification personnalisée simple avec un appareil. L’appelant envoie son certificat et son MAC à l’appareil, qui renvoie son propre certificat et mac. L’application compare le certificat récupéré avec celui qu’elle a stocké, et si elles correspondent (et que le MAC est correct), elle définit bExtraCertified sur TRUE.
// Call SendOpaqueCommand to exchange extended authentication information.
{
HMAC hMAC;
OPAQUECOMMAND Command;
CERTINFOEX *pCertInfoEx;
DWORD cbData_App = sizeof(bCertInfoEx_App)/sizeof(bCertInfoEx_App[0]);
DWORD cbData_SP = sizeof(bCertInfoEx_SP)/sizeof(bCertInfoEx_SP[0]);
DWORD cbData_Send = sizeof(CERTINFOEX) + cbData_App;
// Fill opaque command structure with the application's certificate.
memcpy(&(Command.guidCommand), &guidCertInfoEx, sizeof(GUID));
Command.pData = (BYTE *)CoTaskMemAlloc(cbData_Send);
if (!Command.pData)
{
ExitOnFail(hr = E_OUTOFMEMORY);
}
Command.dwDataLen = cbData_Send;
// Map the data in the opaque command to a CERTINFOEX structure, and
// fill in the cert info to send.
pCertInfoEx = (CERTINFOEX *)Command.pData;
pCertInfoEx->hr = S_OK;
pCertInfoEx->cbCert = cbData_App;
memcpy(pCertInfoEx->pbCert, bCertInfoEx_App, cbData_App);
// Compute MAC on the data, and add to the OPAQUECOMMAND struct.
g_cWmdm.m_pSAC->MACInit(&hMAC);
g_cWmdm.m_pSAC->MACUpdate(hMAC, (BYTE*)(&(Command.guidCommand)), sizeof(GUID));
g_cWmdm.m_pSAC->MACUpdate(hMAC, (BYTE*)(&(Command.dwDataLen)), sizeof(Command.dwDataLen));
if (Command.pData)
{
g_cWmdm.m_pSAC->MACUpdate(hMAC, Command.pData, Command.dwDataLen);
}
g_cWmdm.m_pSAC->MACFinal(hMAC, Command.abMAC);
// Send the opaque command.
hr = pDevice->SendOpaqueCommand(&Command);
if (SUCCEEDED(hr))
{
// Now verify the retrieved MAC.
BYTE abMACVerify2[ WMDM_MAC_LENGTH ];
g_cWmdm.m_pSAC->MACInit(&hMAC);
g_cWmdm.m_pSAC->MACUpdate(hMAC, (BYTE*)(&(Command.guidCommand)), sizeof(GUID));
g_cWmdm.m_pSAC->MACUpdate(hMAC, (BYTE*)(&(Command.dwDataLen)), sizeof(Command.dwDataLen));
if (Command.pData)
{
g_cWmdm.m_pSAC->MACUpdate(hMAC, Command.pData, Command.dwDataLen);
}
g_cWmdm.m_pSAC->MACFinal(hMAC, abMACVerify2);
// Verify MAC matches.
if (memcmp(abMACVerify2, Command.abMAC, WMDM_MAC_LENGTH) == 0)
{
// They match; verify the retrieved certificate.
// Map the data in the opaque command to a CERTINFOEX structure
//
pCertInfoEx = (CERTINFOEX *)Command.pData;
// In this simple extended authentication scheme, the callee must
// provide the exact certificate information.
//
if ((pCertInfoEx->cbCert != cbData_SP) &&
(memcmp(pCertInfoEx->pbCert, bCertInfoEx_SP, cbData_SP) == 0))
{
bExtraCertified = TRUE;
}
}
}
if (Command.pData)
{
CoTaskMemFree(Command.pData);
}
}
Configuration requise
Condition requise | Valeur |
---|---|
Plateforme cible | Windows |
En-tête | mswmdm.h |
Bibliothèque | Mssachlp.lib |