//
// Get card's CSP name.
//
//
// Note: SCardGetCardTypeProviderName is not available
// in Smart Card Base Component v1.0. Please see
// ReadMe.txt for more information.
//
dwAutoAllocate = SCARD_AUTOALLOCATE;
lResult = SCardGetCardTypeProviderName(hContext,
szCardName,
SCARD_PROVIDER_CSP,
(LPTSTR) &szCSPName,
&dwAutoAllocate);
if (lResult != SCARD_S_SUCCESS)
{
__leave;
}
//
// Prepare fully qualified container name.
//
szContainerName = (LPTSTR) MALLOC((sizeof(_T(".//")) +
lstrlen(lpReaderStates[i].szReader) +
sizeof(_T("///0"))) * sizeof(TCHAR));
if (szContainerName == NULL)
{
lResult = SCARD_E_NO_MEMORY;
__leave;
}
wsprintf(szContainerName, _T(".//%s//"),
lpReaderStates[i].szReader);
//
// Obtain the crypto context.
//
// CRYPT_SILENT forces the CSP to raise no UI. The fully qualified
// container name indicates which reader to connect to, so the
// user should not be prompted to insert or select a card.
//
if (!CryptAcquireContext(&hCryptProv,
szContainerName,
szCSPName,
PROV_RSA_FULL,
CRYPT_SILENT))
{
lResult = GetLastError();
__leave;
}