home *** CD-ROM | disk | FTP | other *** search
/ Tricks of the Windows Gam…ming Gurus (2nd Edition) / Disc2.iso / vc98 / include / winsmcrd.h < prev    next >
C/C++ Source or Header  |  1998-04-25  |  12KB  |  317 lines

  1. /*++
  2.  
  3. Copyright (c) 1996  Microsoft Corporation
  4.  
  5. Module Name:
  6.  
  7.     ntddscrd.h
  8.  
  9. Abstract:
  10.     Smart Card class/port IOCTL codes. This file is required for all code
  11.     user mode and kernel mode, using Smart Card IOCTL's, defines,
  12.     data structures
  13.  
  14.    Author:
  15.  
  16.     George Chrysanthakopoulos/Doug Barlow  - 12/4/96
  17.  
  18. Revision History:
  19.  
  20. --*/
  21.  
  22.  
  23. #ifndef _NTDDSCRD_H2_
  24. #define _NTDDSCRD_H2_
  25.  
  26. #ifdef __cplusplus
  27. extern "C" {
  28. #endif
  29.  
  30. #ifdef _WINSCARD_H_
  31. typedef DWORD ULONG;
  32. typedef WORD UWORD;
  33. typedef BYTE UCHAR;
  34. #else
  35. typedef ULONG DWORD;
  36. // typedef UWORD WORD;
  37. typedef UCHAR BYTE;
  38. #endif
  39.  
  40. #ifndef DEVICE_TYPE_SMARTCARD
  41. #define FILE_DEVICE_SMARTCARD           0x00000031
  42. #else
  43. #if 0x00000031 != FILE_DEVICE_SMARTCARD
  44. #error "Incorrect Smart Card Device Definition"
  45. #endif
  46. #endif
  47.  
  48.  
  49. //
  50. // Various constants
  51. //
  52.  
  53. #define SCARD_ATR_LENGTH 33  // ISO 7816-3 spec.
  54.  
  55. //
  56. ///////////////////////////////////////////////////////////////////////////////
  57. //
  58. //  Protocol Flag definitions
  59. //
  60.  
  61. #define SCARD_PROTOCOL_UNDEFINED    0x00000000  // There is no active protocol.
  62. #define SCARD_PROTOCOL_T0           0x00000001  // T=0 is the active protocol.
  63. #define SCARD_PROTOCOL_T1           0x00000002  // T=1 is the active protocol.
  64. #define SCARD_PROTOCOL_RAW          0x00010000  // Raw is the active protocol.
  65. #define SCARD_PROTOCOL_DEFAULT      0x80000000  // Use implicit PTS.
  66. //
  67. // Since using the optimal parameters is the default case
  68. // no bit is defined to be 1
  69. //
  70. #define SCARD_PROTOCOL_OPTIMAL      0x00000000  // Use PTS to optimize protocol.
  71.  
  72.  
  73. //
  74. // Ioctl parameters 1 for IOCTL_SMARTCARD_POWER
  75. //
  76. #define SCARD_POWER_DOWN 0          // Power down the card.
  77. #define SCARD_COLD_RESET 1          // Cycle power and reset the card.
  78. #define SCARD_WARM_RESET 2          // Force a reset on the card.
  79.  
  80. //
  81. ///////////////////////////////////////////////////////////////////////////////
  82. //
  83. //  Reader Action IOCTLs
  84. //
  85.  
  86. #define SCARD_CTL_CODE(code)        CTL_CODE(FILE_DEVICE_SMARTCARD, \
  87.                                             (code), \
  88.                                             METHOD_BUFFERED, \
  89.                                             FILE_ANY_ACCESS)
  90.  
  91. #define IOCTL_SMARTCARD_POWER           SCARD_CTL_CODE( 1)
  92. #define IOCTL_SMARTCARD_GET_ATTRIBUTE   SCARD_CTL_CODE( 2)
  93. #define IOCTL_SMARTCARD_SET_ATTRIBUTE   SCARD_CTL_CODE( 3)
  94. #define IOCTL_SMARTCARD_CONFISCATE      SCARD_CTL_CODE( 4)
  95. #define IOCTL_SMARTCARD_TRANSMIT        SCARD_CTL_CODE( 5)
  96. #define IOCTL_SMARTCARD_EJECT           SCARD_CTL_CODE( 6)
  97. #define IOCTL_SMARTCARD_SWALLOW         SCARD_CTL_CODE( 7)
  98. // #define IOCTL_SMARTCARD_READ            SCARD_CTL_CODE( 8) obsolete
  99. // #define IOCTL_SMARTCARD_WRITE           SCARD_CTL_CODE( 9) obsolete
  100. #define IOCTL_SMARTCARD_IS_PRESENT      SCARD_CTL_CODE(10)
  101. #define IOCTL_SMARTCARD_IS_ABSENT       SCARD_CTL_CODE(11)
  102. #define IOCTL_SMARTCARD_SET_PROTOCOL    SCARD_CTL_CODE(12)
  103. #define IOCTL_SMARTCARD_GET_STATE       SCARD_CTL_CODE(14)
  104. #define IOCTL_SMARTCARD_GET_LAST_ERROR  SCARD_CTL_CODE(15)
  105.  
  106.  
  107. //
  108. ///////////////////////////////////////////////////////////////////////////////
  109. //
  110. // Tags for requesting card and reader attributes
  111. //
  112.  
  113. #define MAXIMUM_ATTR_STRING_LENGTH 32   // Nothing bigger than this from getAttr
  114. #define MAXIMUM_SMARTCARD_READERS  10   // Limit the readers on the system
  115.  
  116. #define SCARD_ATTR_VALUE(Class, Tag) ((((ULONG)(Class)) << 16) | ((ULONG)(Tag)))
  117.  
  118. #define SCARD_CLASS_VENDOR_INFO     1   // Vendor information definitions
  119. #define SCARD_CLASS_COMMUNICATIONS  2   // Communication definitions
  120. #define SCARD_CLASS_PROTOCOL        3   // Protocol definitions
  121. #define SCARD_CLASS_POWER_MGMT      4   // Power Management definitions
  122. #define SCARD_CLASS_SECURITY        5   // Security Assurance definitions
  123. #define SCARD_CLASS_MECHANICAL      6   // Mechanical characteristic definitions
  124. #define SCARD_CLASS_VENDOR_DEFINED  7   // Vendor specific definitions
  125. #define SCARD_CLASS_IFD_PROTOCOL    8   // Interface Device Protocol options
  126. #define SCARD_CLASS_ICC_STATE       9   // ICC State specific definitions
  127. #define SCARD_CLASS_SYSTEM     0x7fff   // System-specific definitions
  128.  
  129. #define SCARD_ATTR_VENDOR_NAME SCARD_ATTR_VALUE(SCARD_CLASS_VENDOR_INFO, 0x0100)
  130. #define SCARD_ATTR_VENDOR_IFD_TYPE SCARD_ATTR_VALUE(SCARD_CLASS_VENDOR_INFO, 0x0101)
  131. #define SCARD_ATTR_VENDOR_IFD_VERSION SCARD_ATTR_VALUE(SCARD_CLASS_VENDOR_INFO, 0x0102)
  132. #define SCARD_ATTR_VENDOR_IFD_SERIAL_NO SCARD_ATTR_VALUE(SCARD_CLASS_VENDOR_INFO, 0x0103)
  133. #define SCARD_ATTR_CHANNEL_ID SCARD_ATTR_VALUE(SCARD_CLASS_COMMUNICATIONS, 0x0110)
  134. #define SCARD_ATTR_ASYNC_PROTOCOL_TYPES SCARD_ATTR_VALUE(SCARD_CLASS_PROTOCOL, 0x0120)
  135. #define SCARD_ATTR_DEFAULT_CLK SCARD_ATTR_VALUE(SCARD_CLASS_PROTOCOL, 0x0121)
  136. #define SCARD_ATTR_MAX_CLK SCARD_ATTR_VALUE(SCARD_CLASS_PROTOCOL, 0x0122)
  137. #define SCARD_ATTR_DEFAULT_DATA_RATE SCARD_ATTR_VALUE(SCARD_CLASS_PROTOCOL, 0x0123)
  138. #define SCARD_ATTR_MAX_DATA_RATE SCARD_ATTR_VALUE(SCARD_CLASS_PROTOCOL, 0x0124)
  139. #define SCARD_ATTR_MAX_IFSD SCARD_ATTR_VALUE(SCARD_CLASS_PROTOCOL, 0x0125)
  140. #define SCARD_ATTR_SYNC_PROTOCOL_TYPES SCARD_ATTR_VALUE(SCARD_CLASS_PROTOCOL, 0x0126)
  141. #define SCARD_ATTR_POWER_MGMT_SUPPORT SCARD_ATTR_VALUE(SCARD_CLASS_POWER_MGMT, 0x0131)
  142. #define SCARD_ATTR_USER_TO_CARD_AUTH_DEVICE SCARD_ATTR_VALUE(SCARD_CLASS_SECURITY, 0x0140)
  143. #define SCARD_ATTR_USER_AUTH_INPUT_DEVICE SCARD_ATTR_VALUE(SCARD_CLASS_SECURITY, 0x0142)
  144. #define SCARD_ATTR_CHARACTERISTICS SCARD_ATTR_VALUE(SCARD_CLASS_MECHANICAL, 0x0150)
  145.  
  146. #define SCARD_ATTR_CURRENT_PROTOCOL_TYPE SCARD_ATTR_VALUE(SCARD_CLASS_IFD_PROTOCOL, 0x0201)
  147. #define SCARD_ATTR_CURRENT_CLK SCARD_ATTR_VALUE(SCARD_CLASS_IFD_PROTOCOL, 0x0202)
  148. #define SCARD_ATTR_CURRENT_F SCARD_ATTR_VALUE(SCARD_CLASS_IFD_PROTOCOL, 0x0203)
  149. #define SCARD_ATTR_CURRENT_D SCARD_ATTR_VALUE(SCARD_CLASS_IFD_PROTOCOL, 0x0204)
  150. #define SCARD_ATTR_CURRENT_N SCARD_ATTR_VALUE(SCARD_CLASS_IFD_PROTOCOL, 0x0205)
  151. #define SCARD_ATTR_CURRENT_W SCARD_ATTR_VALUE(SCARD_CLASS_IFD_PROTOCOL, 0x0206)
  152. #define SCARD_ATTR_CURRENT_IFSC SCARD_ATTR_VALUE(SCARD_CLASS_IFD_PROTOCOL, 0x0207)
  153. #define SCARD_ATTR_CURRENT_IFSD SCARD_ATTR_VALUE(SCARD_CLASS_IFD_PROTOCOL, 0x0208)
  154. #define SCARD_ATTR_CURRENT_BWT SCARD_ATTR_VALUE(SCARD_CLASS_IFD_PROTOCOL, 0x0209)
  155. #define SCARD_ATTR_CURRENT_CWT SCARD_ATTR_VALUE(SCARD_CLASS_IFD_PROTOCOL, 0x020a)
  156. #define SCARD_ATTR_CURRENT_EBC_ENCODING SCARD_ATTR_VALUE(SCARD_CLASS_IFD_PROTOCOL, 0x020b)
  157. #define SCARD_ATTR_EXTENDED_BWT SCARD_ATTR_VALUE(SCARD_CLASS_IFD_PROTOCOL, 0x020c)
  158.  
  159. #define SCARD_ATTR_ICC_PRESENCE SCARD_ATTR_VALUE(SCARD_CLASS_ICC_STATE, 0x0300)
  160. #define SCARD_ATTR_ICC_INTERFACE_STATUS SCARD_ATTR_VALUE(SCARD_CLASS_ICC_STATE, 0x0301)
  161. #define SCARD_ATTR_CURRENT_IO_STATE SCARD_ATTR_VALUE(SCARD_CLASS_ICC_STATE, 0x0302)
  162. #define SCARD_ATTR_ATR_STRING SCARD_ATTR_VALUE(SCARD_CLASS_ICC_STATE, 0x0303)
  163. #define SCARD_ATTR_ICC_TYPE_PER_ATR SCARD_ATTR_VALUE(SCARD_CLASS_ICC_STATE, 0x0304)
  164.  
  165. #define SCARD_ATTR_ESC_RESET SCARD_ATTR_VALUE(SCARD_CLASS_VENDOR_DEFINED, 0xA000)
  166. #define SCARD_ATTR_ESC_CANCEL SCARD_ATTR_VALUE(SCARD_CLASS_VENDOR_DEFINED, 0xA003)
  167. #define SCARD_ATTR_ESC_AUTHREQUEST SCARD_ATTR_VALUE(SCARD_CLASS_VENDOR_DEFINED, 0xA005)
  168. #define SCARD_ATTR_MAXINPUT SCARD_ATTR_VALUE(SCARD_CLASS_VENDOR_DEFINED, 0xA007)
  169.  
  170. #define SCARD_ATTR_DEVICE_UNIT SCARD_ATTR_VALUE(SCARD_CLASS_SYSTEM, 0x0001)
  171. #define SCARD_ATTR_DEVICE_IN_USE SCARD_ATTR_VALUE(SCARD_CLASS_SYSTEM, 0x0002)
  172. #define SCARD_ATTR_DEVICE_FRIENDLY_NAME_A SCARD_ATTR_VALUE(SCARD_CLASS_SYSTEM, 0x0003)
  173. #define SCARD_ATTR_DEVICE_SYSTEM_NAME_A SCARD_ATTR_VALUE(SCARD_CLASS_SYSTEM, 0x0004)
  174. #define SCARD_ATTR_DEVICE_FRIENDLY_NAME_W SCARD_ATTR_VALUE(SCARD_CLASS_SYSTEM, 0x0005)
  175. #define SCARD_ATTR_DEVICE_SYSTEM_NAME_W SCARD_ATTR_VALUE(SCARD_CLASS_SYSTEM, 0x0006)
  176. #define SCARD_ATTR_SUPRESS_T1_IFS_REQUEST SCARD_ATTR_VALUE(SCARD_CLASS_SYSTEM, 0x0007)
  177.  
  178. #ifdef UNICODE
  179. #define SCARD_ATTR_DEVICE_FRIENDLY_NAME SCARD_ATTR_DEVICE_FRIENDLY_NAME_W
  180. #define SCARD_ATTR_DEVICE_SYSTEM_NAME SCARD_ATTR_DEVICE_SYSTEM_NAME_W
  181. #else
  182. #define SCARD_ATTR_DEVICE_FRIENDLY_NAME SCARD_ATTR_DEVICE_FRIENDLY_NAME_A
  183. #define SCARD_ATTR_DEVICE_SYSTEM_NAME SCARD_ATTR_DEVICE_SYSTEM_NAME_A
  184. #endif
  185.  
  186.  
  187. //
  188. // T=0 Protocol Defines
  189. //
  190.  
  191. #define SCARD_T0_HEADER_LENGTH 7
  192. #define SCARD_T0_CMD_LENGTH 5
  193.  
  194.  
  195. //
  196. // T=1 Protocol Defines
  197. //
  198.  
  199. #define SCARD_T1_PROLOGUE_LENGTH 3
  200. #define SCARD_T1_EPILOGUE_LENGTH 2
  201. #define SCARD_T1_MAX_IFS 254
  202.  
  203.  
  204. //
  205. ///////////////////////////////////////////////////////////////////////////////
  206. //
  207. //  Reader states
  208. //
  209.  
  210. #define SCARD_UNKNOWN     0   // This value implies the driver is unaware
  211.                               // of the current state of the reader.
  212. #define SCARD_ABSENT      1   // This value implies there is no card in
  213.                               // the reader.
  214. #define SCARD_PRESENT     2   // This value implies there is a card is
  215.                               // present in the reader, but that it has
  216.                               // not been moved into position for use.
  217. #define SCARD_SWALLOWED   3   // This value implies there is a card in the
  218.                               // reader in position for use.  The card is
  219.                               // not powered.
  220. #define SCARD_POWERED     4   // This value implies there is power is
  221.                               // being provided to the card, but the
  222.                               // Reader Driver is unaware of the mode of
  223.                               // the card.
  224. #define SCARD_NEGOTIABLE  5   // This value implies the card has been
  225.                               // reset and is awaiting PTS negotiation.
  226. #define SCARD_SPECIFIC    6   // This value implies the card has been
  227.                               // reset and specific communication
  228.                               // protocols have been established.
  229.  
  230. ////////////////////////////////////////////////////////////////////////////////
  231. //
  232. //  I/O Services
  233. //
  234. //      The following services provide access to the I/O capabilities of the
  235. //      reader drivers.  Services of the Smart Card are requested by placing the
  236. //      following structure into the protocol buffer:
  237. //
  238.  
  239.  
  240. typedef struct _SCARD_IO_REQUEST{
  241.     DWORD dwProtocol;   // Protocol identifier
  242.     DWORD cbPciLength;  // Protocol Control Information Length
  243. } SCARD_IO_REQUEST, *PSCARD_IO_REQUEST, *LPSCARD_IO_REQUEST;
  244. typedef const SCARD_IO_REQUEST *LPCSCARD_IO_REQUEST;
  245.  
  246.  
  247. //
  248. // T=0 protocol services.
  249. //
  250.  
  251. typedef struct {
  252.     BYTE
  253.         bCla,   // The instruction class
  254.         bIns,   // The instruction code within the instruction class
  255.         bP1,
  256.         bP2,    // Parameters to the instruction
  257.         bP3;    // Size of I/O Transfer
  258. } SCARD_T0_COMMAND, *LPSCARD_T0_COMMAND;
  259.  
  260. typedef struct {
  261.     SCARD_IO_REQUEST ioRequest;
  262.     BYTE
  263.         bSw1,
  264.         bSw2;           // Return codes from the instruction
  265.     union
  266.     {
  267.         SCARD_T0_COMMAND CmdBytes;
  268.         BYTE rgbHeader[5];
  269.     };
  270. } SCARD_T0_REQUEST;
  271.  
  272. typedef SCARD_T0_REQUEST *PSCARD_T0_REQUEST, *LPSCARD_T0_REQUEST;
  273.  
  274.  
  275. //
  276. //  T=1 Protocol Services
  277. //
  278.  
  279. typedef struct {
  280.     SCARD_IO_REQUEST ioRequest;
  281. } SCARD_T1_REQUEST;
  282. typedef SCARD_T1_REQUEST *PSCARD_T1_REQUEST, *LPSCARD_T1_REQUEST;
  283.  
  284.  
  285. //
  286. ////////////////////////////////////////////////////////////////////////////////
  287. //
  288. //  Driver attribute flags
  289. //
  290.  
  291. #define SCARD_READER_SWALLOWS       0x00000001  // Reader has a card swallowing
  292.                                                 // mechanism.
  293. #define SCARD_READER_EJECTS         0x00000002  // Reader has a card ejection
  294.                                                 // mechanism.
  295. #define SCARD_READER_CONFISCATES    0x00000004  // Reader has a card capture
  296.                                                 // mechanism.
  297.  
  298. //
  299. ///////////////////////////////////////////////////////////////////////////////
  300. //
  301. // Type of reader
  302. //
  303. #define SCARD_READER_TYPE_SERIAL    0x01
  304. #define SCARD_READER_TYPE_PARALELL  0x02
  305. #define SCARD_READER_TYPE_KEYBOARD  0x04
  306. #define SCARD_READER_TYPE_SCSI      0x08
  307. #define SCARD_READER_TYPE_IDE       0x10
  308. #define SCARD_READER_TYPE_USB       0x20
  309. #define SCARD_READER_TYPE_PCMCIA    0x40
  310. #define SCARD_READER_TYPE_VENDOR    0xF0
  311.  
  312. #ifdef __cplusplus
  313. }
  314. #endif
  315. #endif
  316.  
  317.