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.
324 lines
9.7 KiB
324 lines
9.7 KiB
/*++
|
|
|
|
Copyright (C) Microsoft Corporation, 1999 - 1999
|
|
|
|
Module Name:
|
|
|
|
Locate
|
|
|
|
Abstract:
|
|
|
|
The ISCardeLocate interface provides services for locating a smart card by
|
|
its name.
|
|
|
|
This interface can display the smart card user interface if it is required.
|
|
|
|
The following example shows a typical use of the ISCardLocate interface.
|
|
The ISCardLocate interface is used to build the an ADPU.
|
|
|
|
To locate a specific card using its name
|
|
|
|
1) Create an ISCardLocate interface.
|
|
2) Call ConfigureCardNameSearch to search for a smart card name.
|
|
3) Call FindCard to search for the smart card.
|
|
4) Interpret the results.
|
|
5) Release the ISCardLocate interface.
|
|
|
|
Author:
|
|
|
|
Doug Barlow (dbarlow) 6/24/1999
|
|
|
|
Notes:
|
|
|
|
?Notes?
|
|
|
|
--*/
|
|
|
|
#ifndef WIN32_LEAN_AND_MEAN
|
|
#define WIN32_LEAN_AND_MEAN
|
|
#endif
|
|
|
|
#include "stdafx.h"
|
|
#include "Conversion.h"
|
|
#include "Locate.h"
|
|
|
|
/////////////////////////////////////////////////////////////////////////////
|
|
// CSCardLocate
|
|
|
|
#undef __SUBROUTINE__
|
|
#define __SUBROUTINE__ TEXT("CSCardLocate::ConfigureCardGuidSearch")
|
|
|
|
STDMETHODIMP
|
|
CSCardLocate::ConfigureCardGuidSearch(
|
|
/* [in] */ LPSAFEARRAY pCardGuids,
|
|
/* [defaultvalue][in] */ LPSAFEARRAY pGroupNames,
|
|
/* [defaultvalue][in] */ BSTR bstrTitle,
|
|
/* [defaultvalue][in] */ LONG lFlags)
|
|
{
|
|
HRESULT hReturn = S_OK;
|
|
|
|
try
|
|
{
|
|
// TODO: Add your implementation code here
|
|
breakpoint;
|
|
hReturn = E_NOTIMPL;
|
|
}
|
|
|
|
catch (DWORD dwError)
|
|
{
|
|
hReturn = HRESULT_FROM_WIN32(dwError);
|
|
}
|
|
catch (HRESULT hError)
|
|
{
|
|
hReturn = hError;
|
|
}
|
|
catch (...)
|
|
{
|
|
hReturn = E_INVALIDARG;
|
|
}
|
|
|
|
return hReturn;
|
|
}
|
|
|
|
|
|
/*++
|
|
|
|
CSCardLocate::ConfigureCardNameSearch:
|
|
|
|
The ConfigureCardNameSearch method specifies the card names to be used in
|
|
the search for the smart card.
|
|
|
|
Arguments:
|
|
|
|
pCardNames [in] Pointer to an OLE Automation safe array of card names in
|
|
BSTR form.
|
|
|
|
pGroupNames [in, defaultvalue(NULL )] Pointer to an OLE Automation safe
|
|
array of names of card/reader groups in BSTR form to add to the search.
|
|
|
|
bstrTitle [in, defaultvalue("")] Search common control dialog title.
|
|
|
|
lFlags [in, defaultvalue(1)] Specifies when user interface is displayed:
|
|
|
|
Flag Meaning
|
|
SC_DLG_MINIMAL_UI Displays the dialog only if the card being searched for
|
|
by the calling application is not located and available
|
|
for use in a reader. This allows the card to be found,
|
|
connected (either through internal dialog mechanism or
|
|
the user callback functions), and returned to the
|
|
calling application.
|
|
SC_DLG_NO_UI Causes no UI display, regardless of the search outcome.
|
|
SC_DLG_FORCE_UI Causes UI display regardless of the search outcome.
|
|
|
|
Return Value:
|
|
|
|
The return value is an HRESULT. A value of S_OK indicates the call was
|
|
successful.
|
|
|
|
Remarks:
|
|
|
|
Author:
|
|
|
|
Doug Barlow (dbarlow) 6/24/1999
|
|
|
|
--*/
|
|
#undef __SUBROUTINE__
|
|
#define __SUBROUTINE__ TEXT("CSCardLocate::ConfigureCardNameSearch")
|
|
|
|
STDMETHODIMP
|
|
CSCardLocate::ConfigureCardNameSearch(
|
|
/* [in] */ LPSAFEARRAY pCardNames,
|
|
/* [defaultvalue][in] */ LPSAFEARRAY pGroupNames,
|
|
/* [defaultvalue][in] */ BSTR bstrTitle,
|
|
/* [defaultvalue][in] */ LONG lFlags)
|
|
{
|
|
HRESULT hReturn = S_OK;
|
|
|
|
try
|
|
{
|
|
if (NULL != pCardNames)
|
|
SafeArrayToMultiString(pCardNames, m_mtzCardNames);
|
|
if (NULL != pGroupNames)
|
|
SafeArrayToMultiString(pGroupNames, m_mtzGroupNames);
|
|
if (NULL != bstrTitle)
|
|
m_tzTitle = bstrTitle;
|
|
m_lFlags = lFlags;
|
|
}
|
|
|
|
catch (DWORD dwError)
|
|
{
|
|
hReturn = HRESULT_FROM_WIN32(dwError);
|
|
}
|
|
catch (HRESULT hError)
|
|
{
|
|
hReturn = hError;
|
|
}
|
|
catch (...)
|
|
{
|
|
hReturn = E_INVALIDARG;
|
|
}
|
|
|
|
return hReturn;
|
|
}
|
|
|
|
|
|
/*++
|
|
|
|
CSCardLocate::FindCard:
|
|
|
|
The FindCard method searches for the smart card and opens a valid
|
|
connection to it.
|
|
|
|
Arguments:
|
|
|
|
ShareMode [in, defaultvalue(EXCLUSIVE)] Mode in which to share or not share
|
|
the smart card when a connection is opened to it.
|
|
|
|
Values Description
|
|
EXCLUSIVE No one else use this connection to the smart card.
|
|
SHARED Other applications can use this connection.
|
|
|
|
Protocols [in, defaultvalue(T0)] Protocol to use when connecting to the
|
|
card.
|
|
|
|
T0
|
|
T1
|
|
Raw
|
|
T0|T1
|
|
|
|
lFlags [in, defaultvalue(SC_DLG_NO_UI)] Specifies when user interface is
|
|
displayed:
|
|
|
|
Flag Meaning
|
|
SC_DLG_MINIMAL_UI Displays the dialog only if the card being searched
|
|
for by the calling application is not located and
|
|
available for use in a reader. This allows the
|
|
card to be found, connected (either through
|
|
internal dialog mechanism or the user callback
|
|
functions), and returned to the calling
|
|
application.
|
|
SC_DLG_NO_UI Causes no UI display, regardless of the search
|
|
outcome.
|
|
SC_DLG_FORCE_UI Causes UI display regardless of the search outcome.
|
|
|
|
ppCardInfo [out, retval] Pointer to a data structure that contains/returns
|
|
information about the opened smart card, if successful. Will be NULL
|
|
if operation has failed.
|
|
|
|
Return Value:
|
|
|
|
The return value is an HRESULT. A value of S_OK indicates the call was
|
|
successful.
|
|
|
|
Remarks:
|
|
|
|
To set the search criteria of the search, call ConfigureCardNameSearch to
|
|
specify a smart card's card names or call ConfigureCardGuidSearch to
|
|
specify a smart card's interfaces.
|
|
|
|
Author:
|
|
|
|
Doug Barlow (dbarlow) 6/24/1999
|
|
|
|
--*/
|
|
#undef __SUBROUTINE__
|
|
#define __SUBROUTINE__ TEXT("CSCardLocate::FindCard")
|
|
|
|
STDMETHODIMP
|
|
CSCardLocate::FindCard(
|
|
/* [defaultvalue][in] */ SCARD_SHARE_MODES ShareMode,
|
|
/* [defaultvalue][in] */ SCARD_PROTOCOLS Protocols,
|
|
/* [defaultvalue][in] */ LONG lFlags,
|
|
/* [retval][out] */ LPSCARDINFO __RPC_FAR *ppCardInfo)
|
|
{
|
|
HRESULT hReturn = S_OK;
|
|
|
|
try
|
|
{
|
|
LONG lSts;
|
|
OPENCARDNAME cardInfo;
|
|
|
|
ZeroMemory(&cardInfo, sizeof(cardInfo));
|
|
cardInfo.dwShareMode = ShareMode;
|
|
cardInfo.dwPreferredProtocols = Protocols;
|
|
cardInfo.dwFlags = lFlags | m_lFlags;
|
|
|
|
if ((NULL != ppCardInfo) && (NULL != *ppCardInfo))
|
|
{
|
|
if (NULL != (*ppCardInfo)->hContext)
|
|
cardInfo.hSCardContext = (*ppCardInfo)->hContext;
|
|
cardInfo.dwPreferredProtocols = (*ppCardInfo)->ActiveProtocol;
|
|
cardInfo.dwShareMode = (*ppCardInfo)->ShareMode;
|
|
cardInfo.hwndOwner = (HWND)(*ppCardInfo)->hwndOwner;
|
|
cardInfo.lpfnConnect = (LPOCNCONNPROC)(*ppCardInfo)->lpfnConnectProc;
|
|
cardInfo.lpfnCheck = (LPOCNCHKPROC)(*ppCardInfo)->lpfnCheckProc;
|
|
cardInfo.lpfnDisconnect = (LPOCNDSCPROC)(*ppCardInfo)->lpfnDisconnectProc;
|
|
}
|
|
|
|
if (0 == cardInfo.dwPreferredProtocols)
|
|
cardInfo.dwPreferredProtocols = SCARD_PROTOCOL_Tx;
|
|
if (0 == cardInfo.dwShareMode)
|
|
cardInfo.dwShareMode = SCARD_SHARE_EXCLUSIVE;
|
|
|
|
cardInfo.dwStructSize = sizeof(OPENCARDNAME);
|
|
cardInfo.lpstrGroupNames = (LPTSTR)((LPCTSTR)m_mtzGroupNames);
|
|
cardInfo.nMaxGroupNames = m_mtzGroupNames.Length();
|
|
cardInfo.lpstrCardNames = (LPTSTR)((LPCTSTR)m_mtzCardNames);
|
|
cardInfo.nMaxCardNames = m_mtzCardNames.Length();
|
|
cardInfo.rgguidInterfaces = (LPCGUID)m_bfInterfaces.Access();
|
|
cardInfo.cguidInterfaces = m_bfInterfaces.Length();
|
|
cardInfo.lpstrRdr = (LPTSTR)m_bfRdr.Access();
|
|
cardInfo.nMaxRdr = m_bfRdr.Space() / sizeof(TCHAR);
|
|
cardInfo.lpstrCard = (LPTSTR)m_bfCard.Access();
|
|
cardInfo.nMaxCard = m_bfCard.Space() / sizeof(TCHAR);
|
|
cardInfo.lpstrTitle = (LPCTSTR)m_tzTitle;
|
|
|
|
lSts = GetOpenCardName(&cardInfo);
|
|
if (SCARD_S_SUCCESS != lSts)
|
|
throw (HRESULT)HRESULT_FROM_WIN32(lSts);
|
|
|
|
m_bfRdr.Resize(cardInfo.nMaxRdr * sizeof(TCHAR), TRUE);
|
|
m_bfCard.Resize(cardInfo.nMaxCard * sizeof(TCHAR), TRUE);
|
|
|
|
if (NULL != ppCardInfo)
|
|
{
|
|
if (NULL == *ppCardInfo)
|
|
{
|
|
*ppCardInfo = &m_subCardInfo;
|
|
(*ppCardInfo)->ShareMode = (SCARD_SHARE_MODES)cardInfo.dwShareMode;
|
|
}
|
|
|
|
if (NULL == cardInfo.hCardHandle)
|
|
{
|
|
lSts = SCardConnect(
|
|
cardInfo.hSCardContext,
|
|
cardInfo.lpstrRdr,
|
|
cardInfo.dwShareMode,
|
|
cardInfo.dwPreferredProtocols,
|
|
&cardInfo.hCardHandle,
|
|
&cardInfo.dwActiveProtocol);
|
|
if (SCARD_S_SUCCESS != lSts)
|
|
throw (HRESULT)HRESULT_FROM_WIN32(lSts);
|
|
}
|
|
(*ppCardInfo)->hCard = cardInfo.hCardHandle;
|
|
(*ppCardInfo)->hContext = cardInfo.hSCardContext;
|
|
(*ppCardInfo)->ActiveProtocol = (SCARD_PROTOCOLS)cardInfo.dwActiveProtocol;
|
|
}
|
|
}
|
|
|
|
catch (DWORD dwError)
|
|
{
|
|
hReturn = HRESULT_FROM_WIN32(dwError);
|
|
}
|
|
catch (HRESULT hError)
|
|
{
|
|
hReturn = hError;
|
|
}
|
|
catch (...)
|
|
{
|
|
hReturn = E_INVALIDARG;
|
|
}
|
|
|
|
return hReturn;
|
|
}
|
|
|