IWMDMDevice::SendOpaqueCommand 方法 (mswmdm.h)
SendOpaqueCommand 方法會透過 Windows Media 裝置管理員,將裝置特定的命令傳送至裝置。 Windows Media 裝置管理員 不會嘗試讀取命令。
語法
HRESULT SendOpaqueCommand(
[in, out] OPAQUECOMMAND *pCommand
);
參數
[in, out] pCommand
OPAQUECOMMAND 結構的指標,指定執行命令所需的資訊。 如果裝置傳回數據,則會透過 pCommand 的 pData 成員傳回。
傳回值
方法會傳回 HRESULT。 Windows Media 中的所有介面方法 裝置管理員 可以傳回下列任何錯誤碼類別:
- 標準 COM 錯誤碼
- 轉換成 HRESULT 值的 Windows 錯誤碼
- Windows Media 裝置管理員 錯誤碼
備註
這個方法適用於不會影響 Windows Media 裝置管理員 作業的裝置命令,而且會保持不變傳遞。
範例
下列程式代碼會使用裝置執行簡化的擴充驗證程式。 此程式專屬於裝置。
// 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);
}
}
規格需求
需求 | 值 |
---|---|
目標平台 | Windows |
標頭 | mswmdm.h |
程式庫 | Mssachlp.lib |