IWMDMDevice::SendOpaqueCommand-Methode (mswmdm.h)
Die SendOpaqueCommand-Methode sendet einen gerätespezifischen Befehl über Windows Media Geräte-Manager an das Gerät. Windows Media Geräte-Manager versucht nicht, den Befehl zu lesen.
Syntax
HRESULT SendOpaqueCommand(
[in, out] OPAQUECOMMAND *pCommand
);
Parameter
[in, out] pCommand
Zeiger auf eine OPAQUECOMMAND-Struktur , die die zum Ausführen des Befehls erforderlichen Informationen angibt. Wenn das Gerät Daten zurückgibt, wird es über das pData-Member von pCommand zurückgegeben.
Rückgabewert
Die Methode gibt ein HRESULT zurück. Alle Schnittstellenmethoden in Windows Media Geräte-Manager können eine der folgenden Klassen von Fehlercodes zurückgeben:
- Com-Standardfehlercodes
- In HRESULT-Werte konvertierte Windows-Fehlercodes
- Windows Media Geräte-Manager Fehlercodes
Hinweise
Diese Methode ist für Gerätebefehle vorgesehen, die sich nicht auf den Betrieb von Windows Media Geräte-Manager auswirken und unverändert übergeben werden.
Beispiele
Der folgende Code führt ein vereinfachtes verfahren für die erweiterte Authentifizierung mit einem Gerät aus. Dieses Verfahren ist gerätespezifisch.
// Call opaque command 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 out opaque command structure.
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 certificate info to send.
pCertInfoEx = (CERTINFOEX *)Command.pData;
pCertInfoEx->hr = S_OK;
pCertInfoEx->cbCert = cbData_App;
memcpy(pCertInfoEx->pbCert, bCertInfoEx_App, cbData_App);
// Compute the MAC to send.
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 command.
hr = pDevice->SendOpaqueCommand(&Command);
if (SUCCEEDED(hr))
{
BYTE abMACVerify2[ WMDM_MAC_LENGTH ];
// Compute retrieved MAC for verification.
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 the MAC matches.
//
if (memcmp(abMACVerify2, Command.abMAC, WMDM_MAC_LENGTH) == 0)
{
// Cast 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 info.
//
if ((pCertInfoEx->cbCert != cbData_SP) ||
(memcmp(pCertInfoEx->pbCert, bCertInfoEx_SP, cbData_SP) == 0))
{
m_fExtraCertified = TRUE;
}
}
}
if (Command.pData)
{
CoTaskMemFree(Command.pData);
}
}
Anforderungen
Anforderung | Wert |
---|---|
Zielplattform | Windows |
Kopfzeile | mswmdm.h |
Bibliothek | Mssachlp.lib |