home *** CD-ROM | disk | FTP | other *** search
/ PC Plus SuperCD (UK) 2000 May / PCP163A.iso / Runimage / Cbuilder4 / Include / WINSCARD.H < prev    next >
Encoding:
C/C++ Source or Header  |  1999-01-26  |  24.9 KB  |  779 lines

  1. /*++
  2.  
  3. Copyright (c) 1996  Microsoft Corporation
  4.  
  5. Module Name:
  6.  
  7.     WinSCard
  8.  
  9. Abstract:
  10.  
  11.     This header file provides the definitions and symbols necessary for an
  12.     Application or Smart Card Service Provider to access the Smartcard
  13.     Subsystem.
  14.  
  15. Author:
  16.  
  17.     Doug Barlow (dbarlow) 10/23/1996
  18.  
  19. Environment:
  20.  
  21.     Win32
  22.  
  23. Notes:
  24.  
  25. --*/
  26.  
  27. #ifndef _WINSCARD_H_
  28. #pragma option push -b -a8 -pc -A- /*P_O_Push_S*/
  29. #define _WINSCARD_H_
  30.  
  31. #include <wtypes.h>
  32. #include <winioctl.h>
  33. #include "winsmcrd.h"
  34. #ifndef SCARD_S_SUCCESS
  35. #include "SCardErr.h"
  36. #endif
  37.  
  38. #ifdef __cplusplus
  39. extern "C" {
  40. #endif
  41.  
  42. #ifndef _LPCBYTE_DEFINED
  43. #define _LPCBYTE_DEFINED
  44. typedef const BYTE *LPCBYTE;
  45. #endif
  46. #ifndef _LPCVOID_DEFINED
  47. #define _LPCVOID_DEFINED
  48. typedef const VOID *LPCVOID;
  49. #endif
  50. #ifndef _LPCGUID_DEFINED
  51. #define _LPCGUID_DEFINED
  52. typedef const GUID *LPCGUID;
  53. #endif
  54.  
  55. #ifndef WINSCARDAPI
  56. #define WINSCARDAPI
  57. #endif
  58. #ifndef WINSCARDDATA
  59. #define WINSCARDDATA __declspec(dllimport)
  60. #endif
  61.  
  62. WINSCARDDATA extern const SCARD_IO_REQUEST
  63.     g_rgSCardT0Pci,
  64.     g_rgSCardT1Pci,
  65.     g_rgSCardRawPci;
  66. #define SCARD_PCI_T0  (&g_rgSCardT0Pci)
  67. #define SCARD_PCI_T1  (&g_rgSCardT1Pci)
  68. #define SCARD_PCI_RAW (&g_rgSCardRawPci)
  69.  
  70.  
  71. //
  72. ////////////////////////////////////////////////////////////////////////////////
  73. //
  74. //  Service Manager Access Services
  75. //
  76. //      The following services are used to manage user and terminal contexts for
  77. //      Smart Cards.
  78. //
  79.  
  80. typedef ULONG SCARDCONTEXT;
  81. typedef SCARDCONTEXT *PSCARDCONTEXT, *LPSCARDCONTEXT;
  82.  
  83. typedef ULONG SCARDHANDLE;
  84. typedef SCARDHANDLE *PSCARDHANDLE, *LPSCARDHANDLE;
  85.  
  86. #define SCARD_AUTOALLOCATE (DWORD)(-1)
  87.  
  88. #define SCARD_SCOPE_USER     0  // The context is a user context, and any
  89.                                 // database operations are performed within the
  90.                                 // domain of the user.
  91. #define SCARD_SCOPE_TERMINAL 1  // The context is that of the current terminal,
  92.                                 // and any database operations are performed
  93.                                 // within the domain of that terminal.  (The
  94.                                 // calling application must have appropriate
  95.                                 // access permissions for any database actions.)
  96. #define SCARD_SCOPE_SYSTEM    2 // The context is the system context, and any
  97.                                 // database operations are performed within the
  98.                                 // domain of the system.  (The calling
  99.                                 // application must have appropriate access
  100.                                 // permissions for any database actions.)
  101.  
  102. extern WINSCARDAPI LONG WINAPI
  103. SCardEstablishContext(
  104.     IN  DWORD dwScope,
  105.     IN  LPCVOID pvReserved1,
  106.     IN  LPCVOID pvReserved2,
  107.     OUT LPSCARDCONTEXT phContext);
  108.  
  109. extern WINSCARDAPI LONG WINAPI
  110. SCardReleaseContext(
  111.     IN      SCARDCONTEXT hContext);
  112.  
  113.  
  114. //
  115. ////////////////////////////////////////////////////////////////////////////////
  116. //
  117. //  Smart Card Database Management Services
  118. //
  119. //      The following services provide for managing the Smart Card Database.
  120. //
  121.  
  122. static const TCHAR
  123.     SCARD_ALL_READERS[]     = TEXT("SCard$AllReaders\000"),
  124.     SCARD_DEFAULT_READERS[] = TEXT("SCard$DefaultReaders\000"),
  125.     SCARD_LOCAL_READERS[]   = TEXT("SCard$LocalReaders\000"),
  126.     SCARD_SYSTEM_READERS[]  = TEXT("SCard$SystemReaders\000");
  127.  
  128.  
  129. //
  130. // Database Reader routines
  131. //
  132.  
  133. extern WINSCARDAPI LONG WINAPI
  134. SCardListReaderGroupsA(
  135.     IN      SCARDCONTEXT hContext,
  136.     OUT     LPSTR mszGroups,
  137.     IN OUT  LPDWORD pcchGroups);
  138. extern WINSCARDAPI LONG WINAPI
  139. SCardListReaderGroupsW(
  140.     IN      SCARDCONTEXT hContext,
  141.     OUT     LPWSTR mszGroups,
  142.     IN OUT  LPDWORD pcchGroups);
  143. #ifdef UNICODE
  144. #define SCardListReaderGroups  SCardListReaderGroupsW
  145. #else
  146. #define SCardListReaderGroups  SCardListReaderGroupsA
  147. #endif // !UNICODE
  148.  
  149. extern WINSCARDAPI LONG WINAPI
  150. SCardListReadersA(
  151.     IN      SCARDCONTEXT hContext,
  152.     IN      LPCSTR mszGroups,
  153.     OUT     LPSTR mszReaders,
  154.     IN OUT  LPDWORD pcchReaders);
  155. extern WINSCARDAPI LONG WINAPI
  156. SCardListReadersW(
  157.     IN      SCARDCONTEXT hContext,
  158.     IN      LPCWSTR mszGroups,
  159.     OUT     LPWSTR mszReaders,
  160.     IN OUT  LPDWORD pcchReaders);
  161. #ifdef UNICODE
  162. #define SCardListReaders  SCardListReadersW
  163. #else
  164. #define SCardListReaders  SCardListReadersA
  165. #endif // !UNICODE
  166.  
  167. extern WINSCARDAPI LONG WINAPI
  168. SCardListCardsA(
  169.     IN      SCARDCONTEXT hContext,
  170.     IN      LPCBYTE pbAtr,
  171.     IN      LPCGUID rgquidInterfaces,
  172.     IN      DWORD cguidInterfaceCount,
  173.     OUT     LPSTR mszCards,
  174.     IN OUT  LPDWORD pcchCards);
  175. extern WINSCARDAPI LONG WINAPI
  176. SCardListCardsW(
  177.     IN      SCARDCONTEXT hContext,
  178.     IN      LPCBYTE pbAtr,
  179.     IN      LPCGUID rgquidInterfaces,
  180.     IN      DWORD cguidInterfaceCount,
  181.     OUT     LPWSTR mszCards,
  182.     IN OUT  LPDWORD pcchCards);
  183. #ifdef UNICODE
  184. #define SCardListCards  SCardListCardsW
  185. #else
  186. #define SCardListCards  SCardListCardsA
  187. #endif // !UNICODE
  188.  
  189. extern WINSCARDAPI LONG WINAPI
  190. SCardListInterfacesA(
  191.     IN      SCARDCONTEXT hContext,
  192.     IN      LPCSTR szCard,
  193.     OUT     LPGUID pguidInterfaces,
  194.     IN OUT  LPDWORD pcguidInterfaces);
  195. extern WINSCARDAPI LONG WINAPI
  196. SCardListInterfacesW(
  197.     IN      SCARDCONTEXT hContext,
  198.     IN      LPCWSTR szCard,
  199.     OUT     LPGUID pguidInterfaces,
  200.     IN OUT  LPDWORD pcguidInterfaces);
  201. #ifdef UNICODE
  202. #define SCardListInterfaces  SCardListInterfacesW
  203. #else
  204. #define SCardListInterfaces  SCardListInterfacesA
  205. #endif // !UNICODE
  206.  
  207. extern WINSCARDAPI LONG WINAPI
  208. SCardGetProviderIdA(
  209.     IN      SCARDCONTEXT hContext,
  210.     IN      LPCSTR szCard,
  211.     OUT     LPGUID pguidProviderId);
  212. extern WINSCARDAPI LONG WINAPI
  213. SCardGetProviderIdW(
  214.     IN      SCARDCONTEXT hContext,
  215.     IN      LPCWSTR szCard,
  216.     OUT     LPGUID pguidProviderId);
  217. #ifdef UNICODE
  218. #define SCardGetProviderId  SCardGetProviderIdW
  219. #else
  220. #define SCardGetProviderId  SCardGetProviderIdA
  221. #endif // !UNICODE
  222.  
  223.  
  224. //
  225. // Database Writer routines
  226. //
  227.  
  228. extern WINSCARDAPI LONG WINAPI
  229. SCardIntroduceReaderGroupA(
  230.     IN SCARDCONTEXT hContext,
  231.     IN LPCSTR szGroupName);
  232. extern WINSCARDAPI LONG WINAPI
  233. SCardIntroduceReaderGroupW(
  234.     IN SCARDCONTEXT hContext,
  235.     IN LPCWSTR szGroupName);
  236. #ifdef UNICODE
  237. #define SCardIntroduceReaderGroup  SCardIntroduceReaderGroupW
  238. #else
  239. #define SCardIntroduceReaderGroup  SCardIntroduceReaderGroupA
  240. #endif // !UNICODE
  241.  
  242. extern WINSCARDAPI LONG WINAPI
  243. SCardForgetReaderGroupA(
  244.     IN SCARDCONTEXT hContext,
  245.     IN LPCSTR szGroupName);
  246. extern WINSCARDAPI LONG WINAPI
  247. SCardForgetReaderGroupW(
  248.     IN SCARDCONTEXT hContext,
  249.     IN LPCWSTR szGroupName);
  250. #ifdef UNICODE
  251. #define SCardForgetReaderGroup  SCardForgetReaderGroupW
  252. #else
  253. #define SCardForgetReaderGroup  SCardForgetReaderGroupA
  254. #endif // !UNICODE
  255.  
  256. extern WINSCARDAPI LONG WINAPI
  257. SCardIntroduceReaderA(
  258.     IN SCARDCONTEXT hContext,
  259.     IN LPCSTR szReaderName,
  260.     IN LPCSTR szDeviceName);
  261. extern WINSCARDAPI LONG WINAPI
  262. SCardIntroduceReaderW(
  263.     IN SCARDCONTEXT hContext,
  264.     IN LPCWSTR szReaderName,
  265.     IN LPCWSTR szDeviceName);
  266. #ifdef UNICODE
  267. #define SCardIntroduceReader  SCardIntroduceReaderW
  268. #else
  269. #define SCardIntroduceReader  SCardIntroduceReaderA
  270. #endif // !UNICODE
  271.  
  272. extern WINSCARDAPI LONG WINAPI
  273. SCardForgetReaderA(
  274.     IN SCARDCONTEXT hContext,
  275.     IN LPCSTR szReaderName);
  276. extern WINSCARDAPI LONG WINAPI
  277. SCardForgetReaderW(
  278.     IN SCARDCONTEXT hContext,
  279.     IN LPCWSTR szReaderName);
  280. #ifdef UNICODE
  281. #define SCardForgetReader  SCardForgetReaderW
  282. #else
  283. #define SCardForgetReader  SCardForgetReaderA
  284. #endif // !UNICODE
  285.  
  286. extern WINSCARDAPI LONG WINAPI
  287. SCardAddReaderToGroupA(
  288.     IN SCARDCONTEXT hContext,
  289.     IN LPCSTR szReaderName,
  290.     IN LPCSTR szGroupName);
  291. extern WINSCARDAPI LONG WINAPI
  292. SCardAddReaderToGroupW(
  293.     IN SCARDCONTEXT hContext,
  294.     IN LPCWSTR szReaderName,
  295.     IN LPCWSTR szGroupName);
  296. #ifdef UNICODE
  297. #define SCardAddReaderToGroup  SCardAddReaderToGroupW
  298. #else
  299. #define SCardAddReaderToGroup  SCardAddReaderToGroupA
  300. #endif // !UNICODE
  301.  
  302. extern WINSCARDAPI LONG WINAPI
  303. SCardRemoveReaderFromGroupA(
  304.     IN SCARDCONTEXT hContext,
  305.     IN LPCSTR szReaderName,
  306.     IN LPCSTR szGroupName);
  307. extern WINSCARDAPI LONG WINAPI
  308. SCardRemoveReaderFromGroupW(
  309.     IN SCARDCONTEXT hContext,
  310.     IN LPCWSTR szReaderName,
  311.     IN LPCWSTR szGroupName);
  312. #ifdef UNICODE
  313. #define SCardRemoveReaderFromGroup  SCardRemoveReaderFromGroupW
  314. #else
  315. #define SCardRemoveReaderFromGroup  SCardRemoveReaderFromGroupA
  316. #endif // !UNICODE
  317.  
  318. extern WINSCARDAPI LONG WINAPI
  319. SCardIntroduceCardTypeA(
  320.     IN SCARDCONTEXT hContext,
  321.     IN LPCSTR szCardName,
  322.     IN LPGUID pguidPrimaryProvider,
  323.     IN LPGUID rgguidInterfaces,
  324.     IN DWORD dwInterfaceCount,
  325.     IN LPCBYTE pbAtr,
  326.     IN LPCBYTE pbAtrMask,
  327.     IN DWORD cbAtrLen);
  328. extern WINSCARDAPI LONG WINAPI
  329. SCardIntroduceCardTypeW(
  330.     IN SCARDCONTEXT hContext,
  331.     IN LPCWSTR szCardName,
  332.     IN LPGUID pguidPrimaryProvider,
  333.     IN LPGUID rgguidInterfaces,
  334.     IN DWORD dwInterfaceCount,
  335.     IN LPCBYTE pbAtr,
  336.     IN LPCBYTE pbAtrMask,
  337.     IN DWORD cbAtrLen);
  338. #ifdef UNICODE
  339. #define SCardIntroduceCardType  SCardIntroduceCardTypeW
  340. #else
  341. #define SCardIntroduceCardType  SCardIntroduceCardTypeA
  342. #endif // !UNICODE
  343.  
  344. extern WINSCARDAPI LONG WINAPI
  345. SCardForgetCardTypeA(
  346.     IN SCARDCONTEXT hContext,
  347.     IN LPCSTR szCardName);
  348. extern WINSCARDAPI LONG WINAPI
  349. SCardForgetCardTypeW(
  350.     IN SCARDCONTEXT hContext,
  351.     IN LPCWSTR szCardName);
  352. #ifdef UNICODE
  353. #define SCardForgetCardType  SCardForgetCardTypeW
  354. #else
  355. #define SCardForgetCardType  SCardForgetCardTypeA
  356. #endif // !UNICODE
  357.  
  358.  
  359. //
  360. ////////////////////////////////////////////////////////////////////////////////
  361. //
  362. //  Service Manager Support Routines
  363. //
  364. //      The following services are supplied to simplify the use of the Service
  365. //      Manager API.
  366. //
  367.  
  368. extern WINSCARDAPI LONG WINAPI
  369. SCardFreeMemory(
  370.     IN SCARDCONTEXT hContext,
  371.     IN LPVOID pvMem);
  372.  
  373.  
  374. //
  375. ////////////////////////////////////////////////////////////////////////////////
  376. //
  377. //  Reader Services
  378. //
  379. //      The following services supply means for tracking cards within readers.
  380. //
  381.  
  382. typedef struct {
  383.     LPCSTR      szReader;       // reader name
  384.     LPVOID      pvUserData;     // user defined data
  385.     DWORD       dwCurrentState; // current state of reader at time of call
  386.     DWORD       dwEventState;   // state of reader after state change
  387.     DWORD       cbAtr;          // Number of bytes in the returned ATR.
  388.     BYTE        rgbAtr[36];     // Atr of inserted card, (extra alignment bytes)
  389. } SCARD_READERSTATE_A;
  390. typedef SCARD_READERSTATE_A *PSCARD_READERSTATE_A, *LPSCARD_READERSTATE_A;
  391. typedef struct {
  392.     LPCWSTR     szReader;       // reader name
  393.     LPVOID      pvUserData;     // user defined data
  394.     DWORD       dwCurrentState; // current state of reader at time of call
  395.     DWORD       dwEventState;   // state of reader after state change
  396.     DWORD       cbAtr;          // Number of bytes in the returned ATR.
  397.     BYTE        rgbAtr[36];     // Atr of inserted card, (extra alignment bytes)
  398. } SCARD_READERSTATE_W;
  399. typedef SCARD_READERSTATE_W *PSCARD_READERSTATE_W, *LPSCARD_READERSTATE_W;
  400. #ifdef UNICODE
  401. #define SCARD_READERSTATE   SCARD_READERSTATE_W
  402. #define PSCARD_READERSTATE  PSCARD_READERSTATE_W
  403. #define LPSCARD_READERSTATE LPSCARD_READERSTATE_W
  404. #else
  405. #define SCARD_READERSTATE  SCARD_READERSTATE_A
  406. #define PSCARD_READERSTATE  PSCARD_READERSTATE_A
  407. #define LPSCARD_READERSTATE LPSCARD_READERSTATE_A
  408. #endif // !UNICODE
  409.  
  410. #define SCARD_STATE_UNAWARE     0x00000000  // The application is unaware of the
  411.                                             // current state, and would like to
  412.                                             // know.  The use of this value
  413.                                             // results in an immediate return
  414.                                             // from state transition monitoring
  415.                                             // services.  This is represented by
  416.                                             // all bits set to zero.
  417. #define SCARD_STATE_IGNORE      0x00000001  // The application requested that
  418.                                             // this reader be ignored.  No other
  419.                                             // bits will be set.
  420. #define SCARD_STATE_CHANGED     0x00000002  // This implies that there is a
  421.                                             // difference between the state
  422.                                             // believed by the application, and
  423.                                             // the state known by the Service
  424.                                             // Manager.  When this bit is set,
  425.                                             // the application may assume a
  426.                                             // significant state change has
  427.                                             // occurred on this reader.
  428. #define SCARD_STATE_UNKNOWN     0x00000004  // This implies that the given
  429.                                             // reader name is not recognized by
  430.                                             // the Service Manager.  If this bit
  431.                                             // is set, then SCARD_STATE_CHANGED
  432.                                             // and SCARD_STATE_IGNORE will also
  433.                                             // be set.
  434. #define SCARD_STATE_UNAVAILABLE 0x00000008  // This implies that the actual
  435.                                             // state of this reader is not
  436.                                             // available.  If this bit is set,
  437.                                             // then all the following bits are
  438.                                             // clear.
  439. #define SCARD_STATE_EMPTY       0x00000010  // This implies that there is not
  440.                                             // card in the reader.  If this bit
  441.                                             // is set, all the following bits
  442.                                             // will be clear.
  443. #define SCARD_STATE_PRESENT     0x00000020  // This implies that there is a card
  444.                                             // in the reader.
  445. #define SCARD_STATE_ATRMATCH    0x00000040  // This implies that there is a card
  446.                                             // in the reader with an ATR
  447.                                             // matching one of the target cards.
  448.                                             // If this bit is set,
  449.                                             // SCARD_STATE_PRESENT will also be
  450.                                             // set.  This bit is only returned
  451.                                             // on the SCardLocateCard() service.
  452. #define SCARD_STATE_EXCLUSIVE   0x00000080  // This implies that the card in the
  453.                                             // reader is allocated for exclusive
  454.                                             // use by another application.  If
  455.                                             // this bit is set,
  456.                                             // SCARD_STATE_PRESENT will also be
  457.                                             // set.
  458. #define SCARD_STATE_INUSE       0x00000100  // This implies that the card in the
  459.                                             // reader is in use by one or more
  460.                                             // other applications, but may be
  461.                                             // connected to in shared mode.  If
  462.                                             // this bit is set,
  463.                                             // SCARD_STATE_PRESENT will also be
  464.                                             // set.
  465. #define SCARD_STATE_MUTE        0x00000200  // This implies that the card in the
  466.                                             // reader is unresponsive or not
  467.                                             // supported by the reader or
  468.                                             // software.
  469. #define SCARD_STATE_UNPOWERED   0x00000400  // This implies that the card in the
  470.                                             // reader has not been powered up.
  471.  
  472. extern WINSCARDAPI LONG WINAPI
  473. SCardLocateCardsA(
  474.     IN      SCARDCONTEXT hContext,
  475.     IN      LPCSTR mszCards,
  476.     IN OUT  LPSCARD_READERSTATE_A rgReaderStates,
  477.     IN      DWORD cReaders);
  478. extern WINSCARDAPI LONG WINAPI
  479. SCardLocateCardsW(
  480.     IN      SCARDCONTEXT hContext,
  481.     IN      LPCWSTR mszCards,
  482.     IN OUT  LPSCARD_READERSTATE_W rgReaderStates,
  483.     IN      DWORD cReaders);
  484. #ifdef UNICODE
  485. #define SCardLocateCards  SCardLocateCardsW
  486. #else
  487. #define SCardLocateCards  SCardLocateCardsA
  488. #endif // !UNICODE
  489.  
  490. extern WINSCARDAPI LONG WINAPI
  491. SCardGetStatusChangeA(
  492.     IN      SCARDCONTEXT hContext,
  493.     IN      DWORD dwTimeout,
  494.     IN OUT  LPSCARD_READERSTATE_A rgReaderStates,
  495.     IN      DWORD cReaders);
  496. extern WINSCARDAPI LONG WINAPI
  497. SCardGetStatusChangeW(
  498.     IN      SCARDCONTEXT hContext,
  499.     IN      DWORD dwTimeout,
  500.     IN OUT  LPSCARD_READERSTATE_W rgReaderStates,
  501.     IN      DWORD cReaders);
  502. #ifdef UNICODE
  503. #define SCardGetStatusChange  SCardGetStatusChangeW
  504. #else
  505. #define SCardGetStatusChange  SCardGetStatusChangeA
  506. #endif // !UNICODE
  507.  
  508. extern WINSCARDAPI LONG WINAPI
  509. SCardCancel(
  510.     IN      SCARDCONTEXT hContext);
  511.  
  512.  
  513. //
  514. ////////////////////////////////////////////////////////////////////////////////
  515. //
  516. //  Card/Reader Access Services
  517. //
  518. //      The following services provide means for establishing communication with
  519. //      the card.
  520. //
  521.  
  522. #define SCARD_SHARE_EXCLUSIVE 1 // This application is not willing to share this
  523.                                 // card with other applications.
  524. #define SCARD_SHARE_SHARED    2 // This application is willing to share this
  525.                                 // card with other applications.
  526. #define SCARD_SHARE_DIRECT    3 // This application demands direct control of
  527.                                 // the reader, so it is not available to other
  528.                                 // applications.
  529.  
  530. #define SCARD_LEAVE_CARD      0 // Don't do anything special on close
  531. #define SCARD_RESET_CARD      1 // Reset the card on close
  532. #define SCARD_UNPOWER_CARD    2 // Power down the card on close
  533. #define SCARD_EJECT_CARD      3 // Eject the card on close
  534.  
  535. extern WINSCARDAPI LONG WINAPI
  536. SCardConnectA(
  537.     IN      SCARDCONTEXT hContext,
  538.     IN      LPCSTR szReader,
  539.     IN      DWORD dwShareMode,
  540.     IN      DWORD dwPreferredProtocols,
  541.     OUT     LPSCARDHANDLE phCard,
  542.     OUT     LPDWORD pdwActiveProtocol);
  543. extern WINSCARDAPI LONG WINAPI
  544. SCardConnectW(
  545.     IN      SCARDCONTEXT hContext,
  546.     IN      LPCWSTR szReader,
  547.     IN      DWORD dwShareMode,
  548.     IN      DWORD dwPreferredProtocols,
  549.     OUT     LPSCARDHANDLE phCard,
  550.     OUT     LPDWORD pdwActiveProtocol);
  551. #ifdef UNICODE
  552. #define SCardConnect  SCardConnectW
  553. #else
  554. #define SCardConnect  SCardConnectA
  555. #endif // !UNICODE
  556.  
  557. extern WINSCARDAPI LONG WINAPI
  558. SCardReconnect(
  559.     IN      SCARDHANDLE hCard,
  560.     IN      DWORD dwShareMode,
  561.     IN      DWORD dwPreferredProtocols,
  562.     IN      DWORD dwInitialization,
  563.     OUT     LPDWORD pdwActiveProtocol);
  564.  
  565. extern WINSCARDAPI LONG WINAPI
  566. SCardDisconnect(
  567.     IN      SCARDHANDLE hCard,
  568.     IN      DWORD dwDisposition);
  569.  
  570. extern WINSCARDAPI LONG WINAPI
  571. SCardBeginTransaction(
  572.     IN      SCARDHANDLE hCard);
  573.  
  574. extern WINSCARDAPI LONG WINAPI
  575. SCardEndTransaction(
  576.     IN      SCARDHANDLE hCard,
  577.     IN      DWORD dwDisposition);
  578.  
  579. extern WINSCARDAPI LONG WINAPI
  580. SCardState(
  581.     IN SCARDHANDLE hCard,
  582.     OUT LPDWORD pdwState,
  583.     OUT LPDWORD pdwProtocol,
  584.     OUT LPBYTE pbAtr,
  585.     OUT LPDWORD pcbAtrLen);
  586.  
  587. extern WINSCARDAPI LONG WINAPI
  588. SCardStatusA(
  589.     IN SCARDHANDLE hCard,
  590.     OUT LPSTR szReaderName,
  591.     IN OUT LPDWORD pcchReaderLen,
  592.     OUT LPDWORD pdwState,
  593.     OUT LPDWORD pdwProtocol,
  594.     OUT LPBYTE pbAtr,
  595.     OUT LPDWORD pcbAtrLen);
  596. extern WINSCARDAPI LONG WINAPI
  597. SCardStatusW(
  598.     IN SCARDHANDLE hCard,
  599.     OUT LPWSTR szReaderName,
  600.     IN OUT LPDWORD pcchReaderLen,
  601.     OUT LPDWORD pdwState,
  602.     OUT LPDWORD pdwProtocol,
  603.     OUT LPBYTE pbAtr,
  604.     OUT LPDWORD pcbAtrLen);
  605. #ifdef UNICODE
  606. #define SCardStatus  SCardStatusW
  607. #else
  608. #define SCardStatus  SCardStatusA
  609. #endif // !UNICODE
  610.  
  611.  
  612. //
  613. ////////////////////////////////////////////////////////////////////////////////
  614. //
  615. //  I/O Services
  616. //
  617. //      The following services provide access to the I/O capabilities of the
  618. //      reader drivers.  Services of the Smart Card are requested by placing the
  619. //      following structure into the protocol buffer:
  620. //
  621.  
  622. extern WINSCARDAPI LONG WINAPI
  623. SCardTransmit(
  624.     IN SCARDHANDLE hCard,
  625.     IN LPCSCARD_IO_REQUEST pioSendPci,
  626.     IN LPCBYTE pbSendBuffer,
  627.     IN DWORD cbSendLength,
  628.     IN OUT LPSCARD_IO_REQUEST pioRecvPci,
  629.     OUT LPBYTE pbRecvBuffer,
  630.     IN OUT LPDWORD pcbRecvLength);
  631.  
  632.  
  633. //
  634. ////////////////////////////////////////////////////////////////////////////////
  635. //
  636. //  Reader Control Routines
  637. //
  638. //      The following services provide for direct, low-level manipulation of the
  639. //      reader by the calling application allowing it control over the
  640. //      attributes of the communications with the card.
  641. //
  642.  
  643. extern WINSCARDAPI LONG WINAPI
  644. SCardControl(
  645.     IN      SCARDHANDLE hCard,
  646.     IN      DWORD dwControlCode,
  647.     IN      LPCVOID lpInBuffer,
  648.     IN      DWORD nInBufferSize,
  649.     OUT     LPVOID lpOutBuffer,
  650.     IN      DWORD nOutBufferSize,
  651.     OUT     LPDWORD lpBytesReturned);
  652.  
  653. extern WINSCARDAPI LONG WINAPI
  654. SCardGetAttrib(
  655.     IN SCARDHANDLE hCard,
  656.     IN DWORD dwAttrId,
  657.     OUT LPBYTE pbAttr,
  658.     IN OUT LPDWORD pcbAttrLen);
  659.  
  660. extern WINSCARDAPI LONG WINAPI
  661. SCardSetAttrib(
  662.     IN SCARDHANDLE hCard,
  663.     IN DWORD dwAttrId,
  664.     IN LPCBYTE pbAttr,
  665.     IN DWORD cbAttrLen);
  666.  
  667.  
  668. //
  669. ////////////////////////////////////////////////////////////////////////////////
  670. //
  671. //  Smart Card Dialog definitions
  672. //
  673. //      The following section contains structures and  exported function
  674. //      declarations for the Smart Card Common Dialog dialog.
  675. //
  676.  
  677. // Defined constants
  678. // Flags
  679. #define SC_DLG_MINIMAL_UI       0x01
  680. #define SC_DLG_NO_UI            0x02
  681. #define SC_DLG_FORCE_UI         0x04
  682.  
  683. #define SCERR_NOCARDNAME        0x4000
  684. #define SCERR_NOGUIDS           0x8000
  685.  
  686. typedef SCARDHANDLE (WINAPI *LPOCNCONNPROCA) (IN SCARDCONTEXT, IN LPSTR, IN LPSTR, IN PVOID);
  687. typedef SCARDHANDLE (WINAPI *LPOCNCONNPROCW) (IN SCARDCONTEXT, IN LPWSTR, IN LPWSTR, IN PVOID);
  688.  
  689. #ifdef UNICODE
  690. #define LPOCNCONNPROC   LPOCNCONNPROCW
  691. #else
  692. #define LPOCNCONNPROC   LPOCNCONNPROCA
  693. #endif
  694.  
  695. typedef BOOL (WINAPI *LPOCNCHKPROC) (IN SCARDCONTEXT, IN SCARDHANDLE, IN PVOID);
  696. typedef void (WINAPI *LPOCNDSCPROC) (IN SCARDCONTEXT, IN SCARDHANDLE, IN PVOID);
  697.  
  698. typedef struct tagOCNA {
  699.     DWORD           dwStructSize;
  700.     HWND            hwndOwner;
  701.     SCARDCONTEXT    hSCardContext;
  702.     LPSTR           lpstrGroupNames;
  703.     DWORD           nMaxGroupNames;
  704.     LPSTR           lpstrCardNames;
  705.     DWORD           nMaxCardNames;
  706.     LPGUID          rgguidInterfaces;
  707.     DWORD           cguidInterfaces;
  708.     LPSTR           lpstrRdr;
  709.     DWORD           nMaxRdr;
  710.     LPSTR           lpstrCard;
  711.     DWORD           nMaxCard;
  712.     LPCSTR          lpstrTitle;
  713.     DWORD           dwFlags;
  714.     LPVOID          pvUserData;
  715.     DWORD           dwShareMode;
  716.     DWORD           dwPreferredProtocols;
  717.     DWORD           dwActiveProtocol;
  718.     LPOCNCONNPROCA  lpfnConnect;
  719.     LPOCNCHKPROC    lpfnCheck;
  720.     LPOCNDSCPROC    lpfnDisconnect;
  721.     SCARDHANDLE     hCardHandle;
  722. } OPENCARDNAMEA, *LPOPENCARDNAMEA;
  723. typedef struct tagOCNW {
  724.     DWORD           dwStructSize;
  725.     HWND            hwndOwner;
  726.     SCARDCONTEXT    hSCardContext;
  727.     LPWSTR          lpstrGroupNames;
  728.     DWORD           nMaxGroupNames;
  729.     LPWSTR          lpstrCardNames;
  730.     DWORD           nMaxCardNames;
  731.     LPGUID          rgguidInterfaces;
  732.     DWORD           cguidInterfaces;
  733.     LPWSTR          lpstrRdr;
  734.     DWORD           nMaxRdr;
  735.     LPWSTR          lpstrCard;
  736.     DWORD           nMaxCard;
  737.     LPCWSTR         lpstrTitle;
  738.     DWORD           dwFlags;
  739.     LPVOID          pvUserData;
  740.     DWORD           dwShareMode;
  741.     DWORD           dwPreferredProtocols;
  742.     DWORD           dwActiveProtocol;
  743.     LPOCNCONNPROCW  lpfnConnect;
  744.     LPOCNCHKPROC    lpfnCheck;
  745.     LPOCNDSCPROC    lpfnDisconnect;
  746.     SCARDHANDLE     hCardHandle;
  747. } OPENCARDNAMEW, *LPOPENCARDNAMEW;
  748.  
  749. #ifdef UNICODE
  750. #define OPENCARDNAME OPENCARDNAMEW
  751. #define LPOPENCARDNAME LPOPENCARDNAMEW
  752. #else
  753. #define OPENCARDNAME OPENCARDNAMEA
  754. #define LPOPENCARDNAME LPOPENCARDNAMEA
  755. #endif // UNICODE
  756.  
  757. extern WINSCARDAPI LONG WINAPI
  758. GetOpenCardNameA(
  759.     LPOPENCARDNAMEA);
  760. extern WINSCARDAPI LONG WINAPI
  761. GetOpenCardNameW(
  762.     LPOPENCARDNAMEW);
  763.  
  764. #ifdef UNICODE
  765. #define GetOpenCardName  GetOpenCardNameW
  766. #else
  767. #define GetOpenCardName  GetOpenCardNameA
  768. #endif // !UNICODE
  769.  
  770. extern WINSCARDAPI LONG WINAPI
  771. SCardDlgExtendedError (void);
  772.  
  773. #ifdef __cplusplus
  774. }
  775. #endif
  776. #pragma option pop /*P_O_Pop*/
  777. #endif // _WINSCARD_H_
  778.  
  779.