Проверка подлинности приложения
Первым шагом должно быть проверка подлинности приложения. Аутентификация проверяет подлинность приложения в менеджере мультимедийных устройств Windows. После проверки подлинности приложения можно вызвать QueryInterface, чтобы получить корневой интерфейс IWMDeviceManager, который можно запросить для других обязательных интерфейсов, которые можно запросить для всех остальных интерфейсов. Проверка подлинности требуется только один раз при запуске.
Чтобы выполнить проверку подлинности приложения, выполните следующие действия.
- Создайте объект MediaDevMgr (идентификатор класса MediaDevMgr) с помощью CoCreate и запросите интерфейс IComponentAuthenticate.
- Создайте объект CSecureChannelClient для обработки проверки подлинности.
- Передайте ключ приложения и передайте сертификат в объект безопасного канала. Вы можете использовать фиктивный ключ или сертификат, показанный в следующем примере кода, чтобы получить основные функции из функций SDK. Однако для получения полной функциональности (важной для передачи файлов на устройство и с устройства) необходимо запросить ключ и сертификат от Корпорации Майкрософт, как описано в разделе Tools for Development.
- Передайте интерфейс IComponentAuthenticate, который вы создали на шаге 1, объекту безопасного канала.
- Вызовите CSecureChannelClient::Authenticate для проверки подлинности приложения.
- Запрос IComponentAuthenticate для интерфейса IWMDeviceManager.
Эти действия показаны в следующем коде C++.
HRESULT CWMDMController::Authenticate()
{
// Use a dummy key/certificate pair to allow basic functionality.
// An authentic keypair is required for full SDK functionality.
BYTE abPVK[] = {0x00};
BYTE abCert[] = {0x00};
HRESULT hr;
CComPtr<IComponentAuthenticate> pAuth;
// Create the WMDM object and acquire
// its authentication interface.
hr = CoCreateInstance(
__uuidof(MediaDevMgr),
NULL,
CLSCTX_INPROC_SERVER,
__uuidof(IComponentAuthenticate),
(void**)&pAuth);
if (FAILED(hr)) return hr;
// Create the secure channel client class needed to authenticate the application.
// We'll use a global member variable to hold the secure channel client
// in case we need to handle encryption, decryption, or MAC verification
// during this session.
m_pSAC = new CSecureChannelClient;
if (m_pSAC == NULL) return E_FAIL;
// Send the application's transfer certificate and the associated
// private key to the secure channel client.
hr = m_pSAC->SetCertificate(
SAC_CERT_V1,
(BYTE *)abCert, sizeof(abCert),
(BYTE *)abPVK, sizeof(abPVK));
if (FAILED(hr)) return hr;
// Send the authentication interface we created to the secure channel
// client and authenticate the application with the V1 protocol.
// (This is the only protocol currently supported.)
m_pSAC->SetInterface(pAuth);
hr = m_pSAC->Authenticate(SAC_PROTOCOL_V1);
if (FAILED(hr)) return hr;
// Authentication succeeded, so we can use WMDM.
// Query for the root WMDM interface.
hr = pAuth->QueryInterface( __uuidof(IWMDeviceManager), (void**)&m_IWMDMDeviceMgr);
return hr;
}
Связанные разделы