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