Leaked source code of windows server 2003
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

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