mirror of https://github.com/tongzx/nt5src
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
149 lines
3.5 KiB
149 lines
3.5 KiB
// ChooseCspPage.cpp : implementation file
|
|
//
|
|
|
|
#include "stdafx.h"
|
|
#include "CertWiz.h"
|
|
#include "ChooseCspPage.h"
|
|
#include "Certificat.h"
|
|
|
|
#ifdef _DEBUG
|
|
#define new DEBUG_NEW
|
|
#undef THIS_FILE
|
|
static char THIS_FILE[] = __FILE__;
|
|
#endif
|
|
|
|
/////////////////////////////////////////////////////////////////////////////
|
|
// CChooseCertPage property page
|
|
|
|
IMPLEMENT_DYNCREATE(CChooseCspPage, CIISWizardPage)
|
|
|
|
CChooseCspPage::CChooseCspPage(CCertificate * pCert)
|
|
: CIISWizardPage(CChooseCspPage::IDD, IDS_CERTWIZ, TRUE),
|
|
m_pCert(pCert)
|
|
{
|
|
//{{AFX_DATA_INIT(CChooseCspPage)
|
|
// NOTE: the ClassWizard will add member initialization here
|
|
//}}AFX_DATA_INIT
|
|
}
|
|
|
|
CChooseCspPage::~CChooseCspPage()
|
|
{
|
|
}
|
|
|
|
void CChooseCspPage::DoDataExchange(CDataExchange* pDX)
|
|
{
|
|
CIISWizardPage::DoDataExchange(pDX);
|
|
//{{AFX_DATA_MAP(CChooseCspPage)
|
|
DDX_Control(pDX, IDC_CSP_LIST, m_List);
|
|
//}}AFX_DATA_MAP
|
|
}
|
|
|
|
|
|
BEGIN_MESSAGE_MAP(CChooseCspPage, CIISWizardPage)
|
|
//{{AFX_MSG_MAP(CChooseCspPage)
|
|
ON_LBN_SELCHANGE(IDC_CSP_LIST, OnListSelChange)
|
|
//}}AFX_MSG_MAP
|
|
END_MESSAGE_MAP()
|
|
|
|
/////////////////////////////////////////////////////////////////////////////
|
|
// CChooseCspPage message handlers
|
|
|
|
LRESULT CChooseCspPage::OnWizardBack()
|
|
{
|
|
return IDD_PREV_PAGE;
|
|
}
|
|
|
|
LRESULT CChooseCspPage::OnWizardNext()
|
|
{
|
|
int index = m_List.GetCurSel();
|
|
ASSERT(index != LB_ERR);
|
|
m_List.GetText(index, m_pCert->m_CspName);
|
|
m_pCert->m_CustomProviderType = (DWORD) m_List.GetItemData(index);
|
|
return IDD_NEXT_PAGE;
|
|
}
|
|
|
|
BOOL CChooseCspPage::OnSetActive()
|
|
{
|
|
// If nothing is selected -- stay here
|
|
if (!m_pCert->m_CspName.IsEmpty())
|
|
{
|
|
m_List.SelectString(-1, m_pCert->m_CspName);
|
|
}
|
|
SetWizardButtons(LB_ERR == m_List.GetCurSel() ?
|
|
PSWIZB_BACK : PSWIZB_BACK | PSWIZB_NEXT);
|
|
return CIISWizardPage::OnSetActive();
|
|
}
|
|
|
|
BOOL CChooseCspPage::OnInitDialog()
|
|
{
|
|
ASSERT(m_pCert != NULL);
|
|
|
|
CIISWizardPage::OnInitDialog();
|
|
|
|
CString str;
|
|
BSTR bstrProvName = NULL;
|
|
DWORD dwType, nProv;
|
|
int j;
|
|
HRESULT hr;
|
|
|
|
// array of compatible CSP provider types (see wincrypt.h)
|
|
DWORD IISProvType[] =
|
|
{
|
|
PROV_RSA_SCHANNEL,
|
|
PROV_DH_SCHANNEL
|
|
};
|
|
|
|
IEnroll * pEnroll = m_pCert->GetEnrollObject();
|
|
ASSERT(pEnroll != NULL);
|
|
|
|
// Loop, for each Prov Type
|
|
for (j = 0; j < (sizeof(IISProvType)/sizeof(DWORD)); j++)
|
|
{
|
|
nProv = 0;
|
|
|
|
// check specific prov type
|
|
dwType = IISProvType[j];
|
|
// pEnroll is previously instantiated ICEnroll interface pointer
|
|
hr = pEnroll->put_ProviderType(dwType);
|
|
if (FAILED(hr))
|
|
{
|
|
TRACE(_T("Failed put_ProviderType - %x\n"), hr);
|
|
goto error;
|
|
}
|
|
// enumerate the CSPs of this type
|
|
int idx;
|
|
while (S_OK == (hr = pEnroll->enumProvidersWStr(nProv, 0, &bstrProvName)))
|
|
{
|
|
TRACE(_T("Provider %ws (type %d )\n"), bstrProvName, dwType );
|
|
// increment the index
|
|
nProv++;
|
|
// Free this string, so it can be re-used.
|
|
idx = m_List.AddString(bstrProvName);
|
|
m_List.SetItemData(idx, dwType);
|
|
if (NULL != bstrProvName)
|
|
{
|
|
SysFreeString(bstrProvName);
|
|
bstrProvName = NULL;
|
|
}
|
|
}
|
|
// Print message if provider type doesn't have any CSPs.
|
|
if (0 == nProv)
|
|
{
|
|
TRACE(_T("There were no CSPs of type %d\n"), dwType );
|
|
}
|
|
}
|
|
|
|
error:
|
|
// Clean up resources, etc.
|
|
if (NULL != bstrProvName)
|
|
SysFreeString(bstrProvName);
|
|
|
|
return TRUE;
|
|
}
|
|
|
|
void CChooseCspPage::OnListSelChange()
|
|
{
|
|
SetWizardButtons(-1 == m_List.GetCurSel() ?
|
|
PSWIZB_BACK : PSWIZB_BACK | PSWIZB_NEXT);
|
|
}
|
|
|