IWMDMStorage::SendOpaqueCommand-Methode (mswmdm.h)
Die SendOpaqueCommand-Methode sendet einen Befehl an den Speicher über Windows Media Geräte-Manager, ohne sie zu verarbeiten.
Syntax
HRESULT SendOpaqueCommand(
[in, out] OPAQUECOMMAND *pCommand
);
Parameter
[in, out] pCommand
Zeiger auf eine OPAQUECOMMAND-Struktur , die den auszuführenden Befehl enthält. Daten können auf zwei Arten übergeben werden – von der Anwendung an das Gerät und vom Gerät zurück an die Anwendung, wenn der Anruf abgeschlossen ist.
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:
- Standard-COM-Fehlercodes
- Windows-Fehlercodes, die in HRESULT-Werte konvertiert wurden
- Windows Media Geräte-Manager Fehlercodes
Hinweise
Diese Methode ist für Speichermedienbefehle vorgesehen, die sich nicht auf den Betrieb von Windows Media Geräte-Manager auswirken und unverändert übergeben werden sollten.
Beispiele
Der folgende C++-Code ruft SendOpaqueCommand auf, um einen einfachen benutzerdefinierten Authentifizierungsschritt mit einem Gerät auszuführen. Der Anrufer sendet sein Zertifikat und mac an das Gerät, das sein eigenes Zertifikat und MAC zurückgibt. Die Anwendung vergleicht das abgerufene Zertifikat mit dem gespeicherten Zertifikat, und wenn sie übereinstimmen (und der MAC korrekt ist), wird bExtraCertified auf TRUE festgelegt.
// 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);
}
}
Anforderungen
Zielplattform | Windows |
Kopfzeile | mswmdm.h |
Bibliothek | Mssachlp.lib |