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
Eine umfassende Liste möglicher Fehlercodes finden Sie unter 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

Weitere Informationen

IWMDMStorage-Schnittstelle