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.

344 lines
8.7 KiB

  1. #if !defined( __USBSC_H__ )
  2. #define __USBSC_H__
  3. #define DRIVER_NAME "USBSC"
  4. #define _ISO_TABLES_
  5. #include <NTDDK.H>
  6. #include "smclib.h"
  7. #include <windef.h>
  8. #include <usb.h>
  9. #include "usbutil.h"
  10. #include "scutil.h"
  11. #define ESCAPE_COMMAND_ENABLE L"EscapeCommandEnable"
  12. #define SMARTCARD_POOL_TAG 'DICC'
  13. #define CCID_CLASS_DESCRIPTOR_TYPE 0x21
  14. #define PC_to_RDR_IccPowerOn 0x62
  15. #define PC_to_RDR_IccPowerOff 0x63
  16. #define PC_to_RDR_GetSlotStatus 0x65
  17. #define PC_to_RDR_XfrBlock 0x6F
  18. #define PC_to_RDR_GetParameters 0x6C
  19. #define PC_to_RDR_ResetParameters 0x6D
  20. #define PC_to_RDR_SetParameters 0x61
  21. #define PC_to_RDR_Escape 0x6B
  22. #define PC_to_RDR_IccClock 0x6E
  23. #define PC_to_RDR_T0APDU 0x6A
  24. #define PC_to_RDR_Secure 0x69
  25. #define PC_to_RDR_Mechanical 0x71
  26. #define PC_to_RDR_Abort 0x72
  27. #define PC_to_RDR_SetDataRateAndClockFrequency 0x73
  28. #define RDR_to_PC_DataBlock 0x80
  29. #define RDR_to_PC_SlotStatus 0x81
  30. #define RDR_to_PC_Parameters 0x82
  31. #define RDR_to_PC_Escape 0x83
  32. #define RDR_to_PC_DataRateAndClockFrequency 0x84
  33. #define RDR_to_PC_NotifySlotChange 0x50
  34. #define RDR_to_PC_HardwareError 0x51
  35. #define ABORT 0x01
  36. #define GET_CLOCK_FREQUENCIES 0x02
  37. #define GET_DATA_RATES 0x03
  38. #define CMD_ABORTED 0xFF
  39. #define ICC_MUTE 0xFE
  40. #define XFR_PARITY_ERROR 0xFD
  41. #define XFR_OVERRUN 0xFC
  42. #define HW_ERROR 0xFB
  43. #define BAD_ATR_TS 0xF8
  44. #define BAD_ATR_TCK 0xF7
  45. #define ICC_PROTOCOL_NOT_SUPPORTED 0xF6
  46. #define ICC_CLASS_NOT_SUPPORTED 0xF5
  47. #define PROCEDURE_BYTE_CONFLICT 0xF4
  48. #define DEACTIVATED_PROTOCOL 0xF3
  49. #define BUSY_WITH_AUTO_SEQUENCE 0xF2
  50. #define PIN_TIMEOUT 0xF0
  51. #define PIN_CANCELLED 0xEF
  52. #define CMD_SLOT_BUSY 0xE0
  53. #define COMMAND_STATUS_MASK 0xC0
  54. #define COMMAND_STATUS_FAILED 0x40
  55. #define COMMAND_STATUS_TIME_EXT 0x80
  56. #define COMMAND_STATUS_SUCCESS 0x00
  57. #define ICC_STATUS_MASK 0x03
  58. #define CHARACTER_LEVEL 0x00
  59. #define TPDU_LEVEL 0x01
  60. #define SHORT_APDU_LEVEL 0x02
  61. #define EXTENDED_APDU_LEVEL 0x04
  62. #define ATR_SIZE 64
  63. #define AUTO_PARAMETER_CONFIG 0x02
  64. #define AUTO_ICC_ACTIVATION 0x04
  65. #define AUTO_VOLTAGE_SELECTION 0x08
  66. #define AUTO_CLOCK_FREQ 0x10
  67. #define AUTO_BAUD_RATE 0x20
  68. #define AUTO_PARAMETER_NEGOTIATION 0x40
  69. #define AUTO_PPS 0x80
  70. #define AUTO_CLOCK_STOP 0x100
  71. #define NOZERO_NAD_ACCEPT 0x200
  72. #define AUTO_IFSD_EXCHANGE 0x400
  73. #define TPDU_EXCHANGE_LEVEL 0x10000
  74. #define SHORT_APDU_EXCHANGE 0x20000
  75. #define EXT_APDU_EXCHANGE 0x40000
  76. #define SLOT0_MASK 0x3
  77. #define SLOT1_MASK 0xc
  78. #define SLOT2_MASK 0x30
  79. #define SLOT3_MASK 0xc0
  80. #define IOCTL_CCID_ESCAPE SCARD_CTL_CODE(3500)
  81. #include <pshpack1.h>
  82. typedef struct _CCID_CLASS_DESCRIPTOR
  83. {
  84. BYTE bLength;
  85. BYTE bDescriptorType;
  86. WORD bcdCCID;
  87. BYTE bMaxSlotIndex;
  88. BYTE bVoltageSupport;
  89. DWORD dwProtocols;
  90. DWORD dwDefaultClock;
  91. DWORD dwMaximumClock;
  92. BYTE bNumClockSupported;
  93. DWORD dwDataRate;
  94. DWORD dwMaxDataRate;
  95. BYTE bNumDataRatesSupported;
  96. DWORD dwMaxIFSD;
  97. DWORD dwSynchProtocols;
  98. DWORD dwMechanical;
  99. DWORD dwFeatures;
  100. DWORD dwMaxCCIDMessageLength;
  101. BYTE bClassGetResponse;
  102. BYTE bClassEnvelope;
  103. WORD wLcdLayout;
  104. BYTE bPINSupport;
  105. BYTE bMaxCCIDBusySlots;
  106. } CCID_CLASS_DESCRIPTOR, *PCCID_CLASS_DESCRIPTOR;
  107. #include <poppack.h>
  108. typedef struct _DEVICE_EXTENSION
  109. {
  110. SCUTIL_HANDLE ScUtilHandle; // Utility library handle
  111. USB_WRAPPER_HANDLE WrapperHandle; // Points to the storage used by the Usb Wrapper
  112. SMARTCARD_EXTENSION SmartcardExtension;
  113. PDEVICE_OBJECT LowerDeviceObject;
  114. PDEVICE_OBJECT PhysicalDeviceObject;
  115. IO_REMOVE_LOCK RemoveLock;
  116. ULONG DeviceInstance;
  117. DEVICE_POWER_STATE PowerState; // Used to keep track of the current power state the reader is in
  118. USBD_INTERFACE_INFORMATION* Interface;
  119. PUSB_DEVICE_DESCRIPTOR DeviceDescriptor;
  120. DEVICE_CAPABILITIES DeviceCapabilities;
  121. } DEVICE_EXTENSION, *PDEVICE_EXTENSION;
  122. typedef struct _READER_EXTENSION {
  123. BOOLEAN CardPresent;
  124. USBD_PIPE_HANDLE BulkOutHandle;
  125. UINT BulkOutIndex;
  126. USBD_PIPE_HANDLE BulkInHandle;
  127. UINT BulkInIndex;
  128. USBD_PIPE_HANDLE InterruptHandle;
  129. UINT InterruptIndex;
  130. // Current reader power state.
  131. // READER_POWER_STATE ReaderPowerState;
  132. // read timeout in ms
  133. ULONG ReadTimeout;
  134. PDEVICE_OBJECT DeviceObject;
  135. DWORD SequenceNumber;
  136. PDEVICE_EXTENSION DeviceExtension;
  137. DWORD MaxMessageLength;
  138. WORD ExchangeLevel;
  139. CCID_CLASS_DESCRIPTOR
  140. ClassDescriptor;
  141. BYTE CurrentVoltage;
  142. BOOLEAN EscapeCommandEnabled;
  143. } READER_EXTENSION, *PREADER_EXTENSION;
  144. #include <pshpack1.h>
  145. typedef struct _USBSC_OUT_MESSAGE_HEADER
  146. {
  147. BYTE bMessageType;
  148. DWORD dwLength;
  149. BYTE bSlot;
  150. BYTE bSeq;
  151. union {
  152. BYTE bPowerSelect;
  153. struct {
  154. BYTE bBWI;
  155. WORD wLevelParameter;
  156. };
  157. BYTE bProtocolNum;
  158. BYTE bClockCommand;
  159. struct {
  160. BYTE bmChanges;
  161. BYTE bClassGetResponse;
  162. BYTE bClassEnvelope;
  163. };
  164. BYTE bFunction;
  165. };
  166. } USBSC_OUT_MESSAGE_HEADER, *PUSBSC_OUT_MESSAGE_HEADER;
  167. typedef struct _USBSC_IN_MESSAGE_HEADER
  168. {
  169. BYTE bMessageType;
  170. DWORD dwLength;
  171. BYTE bSlot;
  172. BYTE bSeq;
  173. BYTE bStatus;
  174. BYTE bError;
  175. union {
  176. BYTE bChainParameter;
  177. BYTE bClockStatus;
  178. BYTE bProtocolNum;
  179. };
  180. } USBSC_IN_MESSAGE_HEADER, *PUSBSC_IN_MESSAGE_HEADER;
  181. typedef struct _USBSC_SLOT_CHANGE_HEADER
  182. {
  183. BYTE bMessageType;
  184. BYTE bmSlotICCState;
  185. } USBSC_SLOT_CHANGE_HEADER, *PUSBSC_SLOT_CHANGE_HEADER;
  186. typedef struct _USBSC_HWERROR_HEADER
  187. {
  188. BYTE bMessageType;
  189. BYTE bSlot;
  190. BYTE bSeq;
  191. BYTE bHardwareErrorCode;
  192. } USBSC_HWERROR_HEADER, *PUSBSC_HWERROR_HEADER;
  193. typedef struct _PROTOCOL_DATA_T0
  194. {
  195. BYTE bmFindexDindex;
  196. BYTE bmTCCKST0;
  197. BYTE bGuardTimeT0;
  198. BYTE bWaitingIntegerT0;
  199. BYTE bClockStop;
  200. } PROTOCOL_DATA_T0, *PPROTOCOL_DATA_T0;
  201. typedef struct _PROTOCOL_DATA_T1
  202. {
  203. BYTE bmFindexDindex;
  204. BYTE bmTCCKST1;
  205. BYTE bGuardTimeT1;
  206. BYTE bmWaitingIntegersT1;
  207. BYTE bClockStop;
  208. BYTE bIFSC;
  209. BYTE bNadValue;
  210. } PROTOCOL_DATA_T1, *PPROTOCOL_DATA_T1;
  211. typedef struct _CLOCK_AND_DATA_RATE
  212. {
  213. DWORD dwClockFrequency;
  214. DWORD dwDataRate;
  215. } CLOCK_AND_DATA_RATE, *PCLOCK_AND_DATA_RATE;
  216. typedef struct _PIN_VERIFICATION_DATA
  217. {
  218. BYTE bTimeOut;
  219. BYTE bmFormatString;
  220. BYTE bmPINBlockString;
  221. BYTE bmPINLengthFormat;
  222. WORD wPINMaxExtraDigit;
  223. BYTE bEntryValidationCondition;
  224. BYTE bNumberMessage;
  225. WORD wLangId;
  226. BYTE bMsgIndex;
  227. BYTE bTeoPrologue;
  228. WORD wRFU;
  229. } PIN_VERIFICATION_DATA, *PPIN_VERIFICATION_DATA;
  230. typedef struct _PIN_MODIFICATION_DATA
  231. {
  232. BYTE bTimeOut;
  233. BYTE bmFormatString;
  234. BYTE bmPINBlockString;
  235. BYTE bmPinLengthFormat;
  236. BYTE bInsertionOffsetOld;
  237. BYTE bInsertionOffsetNew;
  238. WORD wPINMaxExtraDigit;
  239. BYTE bConfirmPIN;
  240. BYTE bEntryValidationCondition;
  241. BYTE bNumberMessage;
  242. WORD wLangId;
  243. BYTE bMsgIndex1;
  244. BYTE bMsgIndex2;
  245. BYTE bMsgIndex3;
  246. BYTE bTeoPrologue;
  247. WORD wRFU;
  248. } PIN_MODIFICATION_DATA, *PPIN_MODIFICATION_DATA;
  249. typedef struct _PPS_REQUEST
  250. {
  251. BYTE bPPSS;
  252. BYTE bPPS0;
  253. BYTE bPPS1;
  254. BYTE bPCK;
  255. } PPS_REQUEST, *PPPS_REQUEST;
  256. #include <poppack.h>
  257. NTSTATUS
  258. DriverEntry(
  259. PDRIVER_OBJECT DriverObject,
  260. PUNICODE_STRING RegistryPath
  261. );
  262. #endif // !__USBSC_H__