次の方法で共有


サービス プロバイダーの認証

Windows Media デバイス マネージャーからアクセスできるようにするには、サービス プロバイダーが IComponentAuthenticate インターフェイスを継承して実装する必要があります。

それ自体を認証するために、サービス プロバイダーは次の手順を実行します。

  1. インスタンス化時に、新しいグローバル CSecureChannelServer オブジェクトを作成し、そのキー ファイルから証明書とキーの値を設定します。
  2. パラメーターをグローバル CSecureChannelServer メンバーに渡すだけで、 IComponentAuthenticate::SACAuth メソッドと IComponentAuthenticate::SACGetProtocols メソッドを実装します。
  3. 実装された Windows Media デバイス マネージャー メソッドを処理する前に、サービス プロバイダーは CSecureChannelServer::fIsAuthenticated を呼び出して呼び出し元の認証を確認し、呼び出し元が認証されていない場合は失敗する必要があります。

これらの手順は、次の C++ の例に示されています。

CSecureChannelServer オブジェクトの作成

CMyServiceProvider::CMyServiceProvider()
{
    HRESULT hr = S_OK;

    // Create the persistent SAC object.
    g_pSAC = new CSecureChannelServer();

    // Set the SAC certificate.
    if (g_pSAC)
    {
        hr = g_pSAC->SetCertificate(
             SAC_CERT_V1,
            (BYTE*)abCert, sizeof(abCert), // SP's certificate.
            (BYTE*)abPVK, sizeof(abPVK)    // SP's key.
        );
    }   
    if (FAILED(hr)) return hr;

    //... Perform other class initialization here ...

    return hr;
}

IComponentAuthenticate メソッドの実装

STDMETHODIMP CMDServiceProvider::SACAuth(
    DWORD   dwProtocolID,
    DWORD   dwPass,
    BYTE   *pbDataIn,
    DWORD   dwDataInLen,
    BYTE  **ppbDataOut,
    DWORD  *pdwDataOutLen)
{
    HRESULT hr = S_OK;

    // Verify that the global CSecureChannelServer member still exists.
    if (!g_pSAC)
        return E_FAIL;

    // Just pass the call to the global SAC member.
    hr = g_pSAC->SACAuth(
        dwProtocolID,
        dwPass,
        pbDataIn, dwDataInLen,
        ppbDataOut, pdwDataOutLen
    );
    return hr;
}

STDMETHODIMP CMDServiceProvider::SACGetProtocols(
    DWORD **ppdwProtocols,
    DWORD  *pdwProtocolCount)
{
    HRESULT hr = E_FAIL;

    if (!g_pSAC)
        return hr;

    hr = g_pSAC->SACGetProtocols(
        ppdwProtocols,
        pdwProtocolCount
    );
    return hr;
}

呼び出し元の認証の確認

次のコード例は、 IMDServiceProvider インターフェイスの実装の一環として、呼び出し元の認証をチェックするサービス プロバイダーを示しています。

STDMETHODIMP CMyServiceProvider::GetDeviceCount(DWORD * pdwCount)
{
    HRESULT hr = S_OK;
    if (!g_pSAC)
        return E_FAIL;

    if (!(g_pSAC->fIsAuthenticated()))
        return WMDM_E_NOTCERTIFIED;

    *pdwCount = m_DeviceCount;

    return hr;
}

サービス プロバイダーの作成