Método IWMDMDevice::SendOpaqueCommand (mswmdm.h)
El método SendOpaqueCommand envía un comando específico del dispositivo al dispositivo a través de Windows Media Administrador de dispositivos. Windows Media Administrador de dispositivos no intenta leer el comando.
Sintaxis
HRESULT SendOpaqueCommand(
[in, out] OPAQUECOMMAND *pCommand
);
Parámetros
[in, out] pCommand
Puntero a una estructura OPAQUECOMMAND que especifica la información necesaria para ejecutar el comando. Si el dispositivo devuelve datos, se devuelve a través del miembro pData de pCommand.
Valor devuelto
El método devuelve un valor HRESULT. Todos los métodos de interfaz de Windows Media Administrador de dispositivos pueden devolver cualquiera de las siguientes clases de códigos de error:
- Códigos de error COM estándar
- Códigos de error de Windows convertidos en valores HRESULT
- Códigos de error de windows Media Administrador de dispositivos
Comentarios
Este método está pensado para comandos de dispositivo que no afectan al funcionamiento de Windows Media Administrador de dispositivos y se pasan sin cambios.
Ejemplos
El código siguiente realiza un procedimiento de autenticación extendido simplificado con un dispositivo. Este procedimiento es específico de un dispositivo.
// 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);
}
}
Requisitos
Requisito | Value |
---|---|
Plataforma de destino | Windows |
Encabezado | mswmdm.h |
Library | Mssachlp.lib |