Source code of Windows XP (NT5)
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.

825 lines
20 KiB

  1. /*****************************************************************************
  2. * $ProjectName: $
  3. * $ProjectRevision: $
  4. *-----------------------------------------------------------------------------
  5. * $Source: z:/pr/cmbs0/sw/sccmn50m.ms/rcs/sccmn50m.h $
  6. * $Revision: 1.3 $
  7. *-----------------------------------------------------------------------------
  8. * $Author: TBruendl $
  9. *-----------------------------------------------------------------------------
  10. * History: see EOF
  11. *-----------------------------------------------------------------------------
  12. *
  13. * Copyright 2000 OMNIKEY AG
  14. ******************************************************************************/
  15. #ifndef _CARDMAN_
  16. #define _CARDMAN_
  17. // ****************************************************************************
  18. // DEFINES
  19. // ****************************************************************************
  20. #define DRIVER_NAME "SCCMN50M"
  21. #define SMARTCARD_POOL_TAG 'CMCS'
  22. #include <ntddk.h>
  23. #include <ntddser.h>
  24. #include "smclib.h"
  25. #include "sccmlog.h"
  26. #include "pcsc_cm.h"
  27. #define SMARTCARD_READ SCARD_CTL_CODE(1000)
  28. #define SMARTCARD_WRITE SCARD_CTL_CODE(1001)
  29. #define CARDMAN_DEVICE_NAME L"\\Device\\CM_2010_0"
  30. #define IFD_NT_VERSIONMAJOR_CARDMAN 3
  31. #define IFD_NT_VERSIONMINOR_CARDMAN 2
  32. #define IFD_NT_BUILDNUMBER_CARDMAN 1
  33. #define ATTR_VENDOR_NAME "OMNIKEY"
  34. #define ATTR_IFD_TYPE_CM "CardMan 2010"
  35. #define ATTR_MAX_IFSD_CARDMAN_II 80
  36. #define WAIT_MS -10000
  37. #define ms_ 1
  38. #define UNKNOWN 0xFFFFFFFF
  39. #define REMOVED 0x00000001
  40. #define INSERTED 0x00000002
  41. #define POWERED 0x00000004
  42. // SCR control byte
  43. #define IGNORE_PARITY 0x01
  44. #define XMIT_HANDSHAKE_OFF 0x02
  45. #define CM2_GET_ATR 0x04
  46. //#define reserved 0x08
  47. #define TO_STATE_XH 0x10
  48. #define LEDS_OFF 0x20
  49. #define LEDS_RED 0x40
  50. #define CARD_POWER 0x80
  51. // card control byte
  52. #define INVERSE_DATA 0x01
  53. #define ENABLE_5MHZ_FAST 0x02
  54. #define ENABLE_3MHZ_FAST 0x04
  55. #define ENABLE_5MHZ 0x08
  56. #define ENABLE_3MHZ 0x00
  57. #define ENABLE_SYN 0x10
  58. #define ENABLE_T0 0x20
  59. #define ENABLE_T1 0x40
  60. #define ENABLE_CRC 0x80
  61. #define ALL_FLAGS 0xFF
  62. // tx control byte
  63. #define SYNC_RESET_LINE_HIGH 0x80
  64. #define SYNC_RESET_LINE_LOW 0x00
  65. #define CLOCK_FORCED_2WBP 0x40
  66. #define TRANSMIT_A8 0x08
  67. #define SYNC_DUMMY_RECEIVE 0x10
  68. // rx control byte
  69. #define T0_DATA_TO_CARD 0x80
  70. #define T0_DATA_FROM_CARD 0x00
  71. #define COLD_RESET 0x40
  72. #define RECEIVE_A8 0x08
  73. #define DEFAULT_READ_INTERVAL_TIMEOUT 1000
  74. #define DEFAULT_READ_TOTAL_TIMEOUT_MULTIPLIER 50
  75. #define DEFAULT_READ_TOTAL_TIMEOUT_CONSTANT 1500
  76. #define DEFAULT_WRITE_TOTAL_TIMEOUT_MULTIPLIER 50
  77. #define DEFAULT_WRITE_TOTAL_TIMEOUT_CONSTANT 250
  78. // for protocol T=0
  79. #define T0_HEADER_LEN 0x05
  80. #define T0_STATE_LEN 0x02
  81. // for protocol T=1
  82. #define T1_HEADER_LEN 0x03
  83. #define MAX_EDC_LEN 0x02
  84. // for power on
  85. #define RESET_DELAY_SYNC 0x01
  86. #define ASYNC3_CARD 0x00
  87. #define ASYNC5_CARD 0x01
  88. #define ATR_LEN_SYNC 4
  89. #define ATR_LEN_ASYNC 33
  90. #define CHAR_INV 0x03
  91. #define CHAR_NORM 0x3B
  92. #define MIN_ATR_LEN 0x03
  93. #define SYNC_ATR_RX_CONTROL 0x47
  94. #define SYNC_RESET_DELAY 0x01
  95. #define TS_OFFSET 0
  96. #define T0_OFFSET 1
  97. typedef enum _READER_POWER_STATE
  98. {
  99. PowerReaderUnspecified = 0,
  100. PowerReaderWorking,
  101. PowerReaderOff
  102. } READER_POWER_STATE, *PREADER_POWER_STATE;
  103. typedef struct _SERIAL_READER_CONFIG
  104. {
  105. // flow control
  106. SERIAL_HANDFLOW HandFlow;
  107. // special characters
  108. SERIAL_CHARS SerialChars;
  109. // read/write timeouts
  110. SERIAL_TIMEOUTS Timeouts;
  111. // Baudrate for reader
  112. SERIAL_BAUD_RATE BaudRate;
  113. // Stop bits, parity configuration
  114. SERIAL_LINE_CONTROL LineControl;
  115. //
  116. // current status of the serial port for IOCTL_GET_COMMSTATUS
  117. //
  118. SERIAL_STATUS SerialStatus;
  119. // mask for purge operation
  120. ULONG PurgeMask;
  121. } SERIAL_READER_CONFIG, *PSERIAL_READER_CONFIG;
  122. typedef struct _CARDMAN_CONFIG
  123. {
  124. UCHAR SCRControl;
  125. UCHAR CardControl;
  126. UCHAR CardStopBits;
  127. UCHAR ResetDelay;
  128. } CARDMAN_CONFIG, *PCARDMAN_CONFIG;
  129. typedef struct _CARDMAN_HEADER
  130. {
  131. UCHAR TxControl;
  132. UCHAR TxLength;
  133. UCHAR RxControl;
  134. UCHAR RxLength;
  135. } CARDMAN_HEADER, *PCARDMAN_HEADER;
  136. typedef struct _DEVICE_EXTENSION
  137. {
  138. // Our smart card extension
  139. SMARTCARD_EXTENSION SmartcardExtension;
  140. // The current number of io-requests
  141. LONG IoCount;
  142. // Used to signal that the reader is able to process reqeusts
  143. KEVENT ReaderStarted;
  144. // Used to signal the the reader has been closed
  145. KEVENT ReaderClosed;
  146. // Used to signal that the connection to the serial driver has been closed
  147. KEVENT SerialCloseDone;
  148. ULONG DeviceInstance;
  149. // The pnp device name of our smart card reader
  150. UNICODE_STRING PnPDeviceName;
  151. KSPIN_LOCK SpinLock;
  152. } DEVICE_EXTENSION, *PDEVICE_EXTENSION;
  153. //
  154. // Define the reader specific portion of the smart card extension
  155. //
  156. typedef struct _READER_EXTENSION
  157. {
  158. HANDLE hThread;
  159. // DeviceObject pointer to serial port
  160. PDEVICE_OBJECT AttachedDeviceObject;
  161. // IoRequest to be send to serial driver
  162. ULONG SerialIoControlCode;
  163. // Saved card state for hibernation/sleeping modes.
  164. BOOLEAN CardPresent;
  165. // Current reader power state.
  166. READER_POWER_STATE ReaderPowerState;
  167. BOOLEAN TimeToTerminateThread;
  168. PVOID ThreadObjectPointer;
  169. KMUTEX CardManIOMutex;
  170. SERIAL_READER_CONFIG SerialConfigData;
  171. BOOLEAN NoConfig;
  172. BOOLEAN ToRHConfig;
  173. BOOLEAN BreakSet;
  174. ULONG SerialErrors;
  175. CARDMAN_CONFIG CardManConfig;
  176. CARDMAN_HEADER CardManHeader;
  177. ULONG ulOldCardState;
  178. ULONG ulNewCardState;
  179. BOOLEAN fRawModeNecessary;
  180. ULONG ulFWVersion;
  181. BOOLEAN fSPESupported;
  182. BOOLEAN fTransparentMode;
  183. BOOLEAN fInverseAtr;
  184. UCHAR abDeviceDescription[42];
  185. SYNC_PARAMETERS SyncParameters;
  186. } READER_EXTENSION, *PREADER_EXTENSION;
  187. #define READER_EXTENSION(member) (SmartcardExtension->ReaderExtension->member)
  188. #define ATTACHED_DEVICE_OBJECT deviceExtension->SmartcardExtension.ReaderExtension->AttachedDeviceObject
  189. // ****************************************************************************
  190. // PROTOTYPES
  191. // ****************************************************************************
  192. NTSTATUS
  193. SCCMN50M_AddDevice (
  194. IN PDRIVER_OBJECT DriverObject,
  195. IN PDEVICE_OBJECT PhysicalDeviceObject
  196. );
  197. NTSTATUS
  198. SCCMN50M_CallSerialDriver (
  199. IN PDEVICE_OBJECT DeviceObject,
  200. IN PIRP Irp
  201. );
  202. NTSTATUS
  203. SCCMN50M_Cancel (
  204. IN PDEVICE_OBJECT DeviceObject,
  205. IN PIRP Irp
  206. );
  207. NTSTATUS
  208. SCCMN50M_Cleanup (
  209. IN PDEVICE_OBJECT DeviceObject,
  210. IN PIRP Irp
  211. );
  212. VOID
  213. SCCMN50M_ClearCardControlFlags (
  214. IN PSMARTCARD_EXTENSION pSmartcardExtension,
  215. IN UCHAR Flags
  216. );
  217. VOID
  218. SCCMN50M_ClearCardManHeader (
  219. IN PSMARTCARD_EXTENSION pSmartcardExtension
  220. );
  221. VOID
  222. SCCMN50M_ClearSCRControlFlags (
  223. IN PSMARTCARD_EXTENSION pSmartcardExtension,
  224. IN UCHAR Flags
  225. );
  226. VOID
  227. SCCMN50M_CompleteCardTracking (
  228. IN PSMARTCARD_EXTENSION SmartcardExtension
  229. );
  230. NTSTATUS
  231. SCCMN50M_CreateClose (
  232. IN PDEVICE_OBJECT DeviceObject,
  233. IN PIRP Irp
  234. );
  235. NTSTATUS
  236. SCCMN50M_CreateDevice (
  237. IN PDRIVER_OBJECT DriverObject,
  238. IN PDEVICE_OBJECT PhysicalDeviceObject,
  239. OUT PDEVICE_OBJECT *DeviceObject
  240. );
  241. NTSTATUS
  242. SCCMN50M_DeviceControl (
  243. PDEVICE_OBJECT DeviceObject,
  244. PIRP Irp
  245. );
  246. VOID
  247. SCCMN50M_DriverUnload (
  248. IN PDRIVER_OBJECT DriverObject
  249. );
  250. VOID
  251. SCCMN50M_InitializeSmartcardExtension (
  252. IN PSMARTCARD_EXTENSION pSmartcardExtension,
  253. IN ULONG ulDeviceInstance
  254. );
  255. NTSTATUS
  256. SCCMN50M_PnP (
  257. IN PDEVICE_OBJECT DeviceObject,
  258. IN PIRP Irp
  259. );
  260. NTSTATUS
  261. SCCMN50M_Power (
  262. IN PDEVICE_OBJECT DeviceObject,
  263. IN PIRP Irp
  264. );
  265. VOID
  266. SCCMN50M_RemoveDevice (
  267. PDEVICE_OBJECT DeviceObject
  268. );
  269. NTSTATUS
  270. SCCMN50M_SerialIo (
  271. PSMARTCARD_EXTENSION SmartcardExtension
  272. );
  273. VOID
  274. SCCMN50M_SetCardManHeader (
  275. IN PSMARTCARD_EXTENSION pSmartcardExtension,
  276. IN UCHAR TxControl,
  277. IN UCHAR TxLength,
  278. IN UCHAR RxControl,
  279. IN UCHAR RxLength
  280. );
  281. VOID
  282. SCCMN50M_SetCardControlFlags (
  283. IN PSMARTCARD_EXTENSION pSmartcardExtension,
  284. IN UCHAR Flags
  285. );
  286. VOID
  287. SCCMN50M_SetSCRControlFlags (
  288. IN PSMARTCARD_EXTENSION pSmartcardExtension,
  289. IN UCHAR Flags
  290. );
  291. VOID
  292. SCCMN50M_StopCardTracking (
  293. IN PDEVICE_EXTENSION pDeviceExtension
  294. );
  295. VOID SCCMN50M_SetVendorAndIfdName(
  296. IN PDEVICE_OBJECT PhysicalDeviceObject,
  297. IN PSMARTCARD_EXTENSION SmartcardExtension
  298. );
  299. NTSTATUS
  300. SCCMN50M_SystemControl(
  301. PDEVICE_OBJECT DeviceObject,
  302. PIRP Irp
  303. );
  304. VOID
  305. SCCMN50M_UpdateCurrentStateThread (
  306. IN PVOID Context
  307. );
  308. NTSTATUS
  309. SCCMN50M_UpdateCurrentState(
  310. IN PSMARTCARD_EXTENSION smartcardExtension
  311. );
  312. NTSTATUS
  313. SCCMN50M_VendorIoctl (
  314. PSMARTCARD_EXTENSION SmartcardExtension
  315. );
  316. VOID
  317. SCCMN50M_CloseSerialDriver(
  318. IN PDEVICE_OBJECT DeviceObject
  319. );
  320. NTSTATUS
  321. DriverEntry(
  322. IN PDRIVER_OBJECT DriverObject,
  323. IN PUNICODE_STRING RegistryPath
  324. );
  325. VOID
  326. StrSet(PUCHAR pbBuffer,ULONG ulBufferSize,UCHAR bPattern);
  327. VOID
  328. StrCpy(PUCHAR pszDestination,ULONG ulDestinationLen,PUCHAR pszSrc);
  329. ULONG
  330. StrLen (PUCHAR pszString);
  331. VOID
  332. StrCat(PUCHAR pszDestination,ULONG ulDestinationLen,PUCHAR pszSrc);
  333. VOID
  334. MemSet(PUCHAR pbBuffer,
  335. ULONG ulBufferSize,
  336. UCHAR ucPattern,
  337. ULONG ulCount);
  338. VOID
  339. MemCpy(PUCHAR pbDestination,
  340. ULONG ulDestinationLen,
  341. PUCHAR pbSource,
  342. ULONG ulCount);
  343. NTSTATUS Wait (
  344. IN PSMARTCARD_EXTENSION pSmartcardExtension,
  345. IN ULONG ulMilliseconds
  346. );
  347. NTSTATUS
  348. SCCMN50M_ReadCardMan (
  349. IN PSMARTCARD_EXTENSION pSmartcardExtension,
  350. IN ULONG ulBytesToRead,
  351. OUT PULONG pulBytesRead,
  352. IN PUCHAR pbReadBuffer,
  353. IN ULONG ulReadBufferSize
  354. );
  355. NTSTATUS
  356. SCCMN50M_WriteCardMan (
  357. IN PSMARTCARD_EXTENSION SmartcardExtension,
  358. ULONG BytesToWrite,
  359. PUCHAR pWriteBuffer
  360. );
  361. NTSTATUS
  362. SCCMN50M_SerialIo(
  363. IN PSMARTCARD_EXTENSION SmartcardExtension
  364. );
  365. NTSTATUS
  366. SCCMN50M_SetWrite (
  367. IN PSMARTCARD_EXTENSION pSmartcardExtension,
  368. IN ULONG ulBytesToWrite,
  369. IN PUCHAR pbWriteBuffer
  370. );
  371. NTSTATUS
  372. SCCMN50M_SetRead(
  373. IN PSMARTCARD_EXTENSION pSmartcardExtension,
  374. IN ULONG ulBytesToRead
  375. );
  376. NTSTATUS
  377. SCCMN50M_PurgeComm (
  378. IN PSMARTCARD_EXTENSION SmartcardExtension
  379. );
  380. NTSTATUS
  381. SCCMN50M_GetCommStatus(
  382. IN PSMARTCARD_EXTENSION SmartcardExtension
  383. );
  384. NTSTATUS
  385. SCCMN50M_ResyncCardManII (
  386. IN PSMARTCARD_EXTENSION SmartcardExtension
  387. );
  388. BOOLEAN
  389. SCCMN50M_IOOperationFailed(
  390. IN PSMARTCARD_EXTENSION pSmartcardExtension
  391. );
  392. NTSTATUS
  393. SCCMN50M_StartCardTracking (
  394. PDEVICE_EXTENSION pDeviceExtension
  395. );
  396. NTSTATUS
  397. SCCMN50M_InitCommPort (
  398. PSMARTCARD_EXTENSION pSmartcardExtension
  399. );
  400. NTSTATUS
  401. SCCMN50M_GetDeviceDescription (
  402. PSMARTCARD_EXTENSION pSmartcardExtension
  403. );
  404. NTSTATUS
  405. SCCMN50M_InitializeCardMan (
  406. IN PSMARTCARD_EXTENSION SmartcardExtension
  407. );
  408. NTSTATUS
  409. SCCMN50M_SetRTS (
  410. PSMARTCARD_EXTENSION pSmartcardExtension
  411. );
  412. NTSTATUS
  413. SCCMN50M_SetDTR (
  414. PSMARTCARD_EXTENSION pSmartcardExtension
  415. );
  416. NTSTATUS
  417. SCCMN50M_TransmitT0 (
  418. PSMARTCARD_EXTENSION pSmartcardExtension
  419. );
  420. NTSTATUS
  421. SCCMN50M_TransmitT1 (
  422. PSMARTCARD_EXTENSION pSmartcardExtension
  423. );
  424. NTSTATUS
  425. SCCMN50M_Transmit (
  426. PSMARTCARD_EXTENSION pSmartcardExtension
  427. );
  428. NTSTATUS
  429. SCCMN50M_EnterTransparentMode (
  430. IN PSMARTCARD_EXTENSION pSmartcardExtension
  431. );
  432. NTSTATUS
  433. SCCMN50M_ExitTransparentMode (
  434. IN PSMARTCARD_EXTENSION pSmartcardExtension
  435. );
  436. VOID
  437. SCCMN50M_InverseBuffer (
  438. PUCHAR pbBuffer,
  439. ULONG ulBufferSize
  440. );
  441. NTSTATUS
  442. SCCMN50M_ResyncCardManI (
  443. IN PSMARTCARD_EXTENSION SmartcardExtension
  444. );
  445. NTSTATUS
  446. SCCMN50M_SetBRK (
  447. PSMARTCARD_EXTENSION pSmartcardExtension
  448. );
  449. NTSTATUS
  450. SCCMN50M_ClearBRK (
  451. PSMARTCARD_EXTENSION pSmartcardExtension
  452. );
  453. NTSTATUS
  454. SCCMN50M_ClearRTS (
  455. PSMARTCARD_EXTENSION pSmartcardExtension
  456. );
  457. NTSTATUS
  458. SCCMN50M_PowerOff (
  459. IN PSMARTCARD_EXTENSION pSmartcardExtension
  460. );
  461. NTSTATUS
  462. SCCMN50M_PowerOn (
  463. IN PSMARTCARD_EXTENSION pSmartcardExtension,
  464. OUT PULONG pulAtrLength,
  465. OUT PUCHAR pbAtrBuffer,
  466. IN ULONG ulAtrBufferSize
  467. );
  468. NTSTATUS
  469. SCCMN50M_CardPower (
  470. IN PSMARTCARD_EXTENSION pSmartcardExtension
  471. );
  472. NTSTATUS
  473. SCCMN50M_UseParsingStrategy (
  474. IN PSMARTCARD_EXTENSION pSmartcardExtension,
  475. OUT PULONG pulAtrLength,
  476. OUT PUCHAR pbAtrBuffer,
  477. IN ULONG ulAtrBufferSize
  478. );
  479. NTSTATUS
  480. SCCMN50M_UseColdWarmResetStrategy (
  481. IN PSMARTCARD_EXTENSION pSmartcardExtension,
  482. OUT PULONG pulAtrLength,
  483. OUT PUCHAR pbAtrBuffer,
  484. IN ULONG ulAtrBufferSize,
  485. IN BOOLEAN fWarmReset
  486. );
  487. BOOLEAN
  488. SCCMN50M_IsAtrValid (
  489. PUCHAR pbAtrBuffer,
  490. ULONG ulAtrLength
  491. );
  492. NTSTATUS
  493. SCCMN50M_SetProtocol (
  494. PSMARTCARD_EXTENSION pSmartcardExtension
  495. );
  496. NTSTATUS
  497. SCCMN50M_CardTracking (
  498. PSMARTCARD_EXTENSION pSmartcardExtension
  499. );
  500. NTSTATUS
  501. SCCMN50M_IoCtlVendor (
  502. PSMARTCARD_EXTENSION SmartcardExtension
  503. );
  504. NTSTATUS
  505. SCCMN50M_SetHighSpeed_CR80S_SAMOS (
  506. IN PSMARTCARD_EXTENSION pSmartcardExtension
  507. );
  508. NTSTATUS
  509. SCCMN50M_GetFWVersion (
  510. IN PSMARTCARD_EXTENSION pSmartcardExtension
  511. );
  512. NTSTATUS
  513. SCCMN50M_ReadDeviceDescription (
  514. IN PSMARTCARD_EXTENSION pSmartcardExtension
  515. );
  516. BOOLEAN
  517. SCCMN50M_IsAsynchronousSmartCard (
  518. IN PSMARTCARD_EXTENSION pSmartcardExtension
  519. );
  520. NTSTATUS
  521. SCCMN50M_SetFl_1Dl_3(IN PSMARTCARD_EXTENSION pSmartcardExtension );
  522. NTSTATUS
  523. SCCMN50M_SetFl_1Dl_1(IN PSMARTCARD_EXTENSION pSmartcardExtension );
  524. // synchronous smart cards
  525. NTSTATUS
  526. SCCMN50M_SyncCardPowerOn (
  527. IN PSMARTCARD_EXTENSION pSmartcardExtension
  528. );
  529. NTSTATUS
  530. SCCMN50M_SetSyncParameters (
  531. IN PSMARTCARD_EXTENSION pSmartcardExtension
  532. );
  533. UCHAR
  534. SCCMN50M_CalcTxControlByte (
  535. IN PSMARTCARD_EXTENSION pSmartcardExtension,
  536. IN ULONG ulBitsToWrite
  537. );
  538. UCHAR
  539. SCCMN50M_CalcTxLengthByte (
  540. IN PSMARTCARD_EXTENSION pSmartcardExtension,
  541. IN ULONG ulBitsToWrite
  542. );
  543. UCHAR
  544. SCCMN50M_CalcRxControlByte (
  545. IN PSMARTCARD_EXTENSION pSmartcardExtension,
  546. IN ULONG ulBitsToRead
  547. );
  548. UCHAR
  549. SCCMN50M_CalcRxLengthByte (
  550. IN PSMARTCARD_EXTENSION pSmartcardExtension,
  551. IN ULONG ulBitsToRead
  552. );
  553. NTSTATUS
  554. SCCMN50M_ResetCard2WBP (
  555. IN PSMARTCARD_EXTENSION pSmartcardExtension
  556. );
  557. NTSTATUS
  558. SCCMN50M_Transmit2WBP (
  559. IN PSMARTCARD_EXTENSION pSmartcardExtension
  560. );
  561. NTSTATUS
  562. SCCMN50M_Transmit3WBP (
  563. IN PSMARTCARD_EXTENSION pSmartcardExtension
  564. );
  565. NTSTATUS
  566. SCCMN50M_UseSyncStrategy (
  567. IN PSMARTCARD_EXTENSION pSmartcardExtension,
  568. OUT PULONG pulAtrLength,
  569. OUT PUCHAR pbAtrBuffer,
  570. IN ULONG ulAtrBufferSize
  571. );
  572. VOID
  573. SCCMN50M_Shift_Msg (
  574. PUCHAR pbBuffer,
  575. ULONG ulMsgLen
  576. );
  577. VOID SCCMN50M_CheckAtrModified (
  578. IN OUT PUCHAR pbBuffer,
  579. IN ULONG ulBufferSize
  580. );
  581. #endif
  582. /*****************************************************************************
  583. * History:
  584. * $Log: sccmn50m.h $
  585. * Revision 1.3 2000/07/28 09:24:13 TBruendl
  586. * Changes for OMNIKEY on Whistler CD
  587. *
  588. * Revision 1.8 2000/06/28 08:47:33 TBruendl
  589. * R03_0_1_1
  590. *
  591. * Revision 1.7 2000/06/27 11:56:29 TBruendl
  592. * workaraound for SAMOR smart cards with invalid ATR (ITSEC)
  593. *
  594. * Revision 1.6 2000/05/23 09:58:27 TBruendl
  595. * OMNIKEY 3.0.0.1
  596. *
  597. * Revision 1.5 2000/03/01 09:32:06 TBruendl
  598. * R02.20.0
  599. *
  600. * Revision 1.4 1999/12/13 07:57:30 TBruendl
  601. * build number increased
  602. *
  603. * Revision 1.3 1999/07/12 12:50:10 TBruendl
  604. * new version information
  605. *
  606. * Revision 1.2 1999/06/10 09:03:58 TBruendl
  607. * No comment given
  608. *
  609. * Revision 1.1 1999/02/02 13:34:39 TBruendl
  610. * This is the first release (R01.00) of the IFD handler for CardMan running under NT5.0.
  611. *
  612. *
  613. *****************************************************************************/