Metodo IWMDMStorage::SendOpaqueCommand (mswmdm.h)
Il metodo SendOpaqueCommand invia un comando all'archiviazione tramite Windows Media Gestione dispositivi, senza elaborarlo.
Sintassi
HRESULT SendOpaqueCommand(
[in, out] OPAQUECOMMAND *pCommand
);
Parametri
[in, out] pCommand
Puntatore a una struttura OPAQUECOMMAND contenente il comando da eseguire. I dati possono essere passati in due modi, dall'applicazione al dispositivo e dal dispositivo di nuovo all'applicazione al termine della chiamata.
Valore restituito
Il metodo restituisce un valore HRESULT. Tutti i metodi di interfaccia in Windows Media Gestione dispositivi possono restituire una delle classi di codici di errore seguenti:
- Codici di errore COM standard
- Codici di errore di Windows convertiti in valori HRESULT
- Codici di errore di Windows Media Gestione dispositivi
Commenti
Questo metodo è destinato ai comandi dei supporti di archiviazione che non influiscono sul funzionamento di Windows Media Gestione dispositivi e devono essere passati senza modifiche.
Esempio
Il codice C++ seguente chiama SendOpaqueCommand per eseguire un semplice passaggio di autenticazione personalizzato con un dispositivo. Il chiamante invia il proprio certificato e MAC al dispositivo, che restituisce il proprio certificato e MAC. L'applicazione confronta il certificato recuperato con quello archiviato e, se corrisponde (e il MAC è corretto), imposta bExtraCertified su 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);
}
}
Requisiti
Requisito | Valore |
---|---|
Piattaforma di destinazione | Windows |
Intestazione | mswmdm.h |
Libreria | Mssachlp.lib |