IWMDMStorage::SendOpaqueCommand 메서드(mswmdm.h)
SendOpaqueCommand 메서드는 Windows Media 장치 관리자 통해 명령을 처리하지 않고 스토리지에 보냅니다.
구문
HRESULT SendOpaqueCommand(
[in, out] OPAQUECOMMAND *pCommand
);
매개 변수
[in, out] pCommand
실행할 명령을 포함하는 OPAQUECOMMAND 구조체에 대한 포인터입니다. 애플리케이션에서 디바이스로, 호출이 완료되면 디바이스에서 애플리케이션으로 두 가지 방법으로 데이터를 전달할 수 있습니다.
반환 값
이 메서드는 HRESULT를 반환합니다. Windows Media 장치 관리자 모든 인터페이스 메서드는 다음 오류 코드 클래스 중 어느 것을 반환할 수 있습니다.
- 표준 COM 오류 코드
- HRESULT 값으로 변환된 Windows 오류 코드
- Windows Media 장치 관리자 오류 코드
설명
이 메서드는 Windows Media 장치 관리자 작업에 영향을 미치지 않고 변경되지 않은 상태로 전달되어야 하는 스토리지 미디어 명령을 위한 것입니다.
예제
다음 C++ 코드는 SendOpaqueCommand 를 호출하여 디바이스로 간단한 사용자 지정 인증 단계를 수행합니다. 호출자는 인증서와 MAC을 디바이스로 보내 자체 인증서와 MAC을 다시 보냅니다. 애플리케이션은 검색된 인증서를 저장한 인증서와 비교하고, 일치하는 경우(MAC이 올바른 경우) bExtraCertified를 TRUE로 설정합니다.
// 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);
}
}
요구 사항
요구 사항 | 값 |
---|---|
대상 플랫폼 | Windows |
헤더 | mswmdm.h |
라이브러리 | Mssachlp.lib |