|
|
/*++
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; }
|