-
Notifications
You must be signed in to change notification settings - Fork 18
Expand file tree
/
Copy pathWinSmCrd.pas
More file actions
746 lines (639 loc) · 22.5 KB
/
WinSmCrd.pas
File metadata and controls
746 lines (639 loc) · 22.5 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
{******************************************************************}
{ }
{ Borland Delphi Runtime Library }
{ PCSC interface unit }
{ }
{ Portions created by Microsoft are }
{ Copyright (C) 1996 Microsoft Corporation. }
{ All Rights Reserved. }
{ }
{ The original file is: WinSmCrd.h }
{ The original Pascal code is: WinSmCrd.pas }
{ The initial developer of the Pascal code is Chris Dickerson }
{ (chrisd@tsc.com). }
{ }
{ Obtained through: }
{ }
{ Joint Endeavour of Delphi Innovators (Project JEDI) }
{ }
{ You may retrieve the latest version of this file at the Project }
{ JEDI home page, located at http://delphi-jedi.org }
{ }
{ The contents of this file are used with permission, subject to }
{ the Mozilla Public License Version 1.1 (the "License"); you may }
{ not use this file except in compliance with the License. You may }
{ obtain a copy of the License at }
{ http://www.mozilla.org/MPL/MPL-1.1.html }
{ }
{ Software distributed under the License is distributed on an }
{ "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or }
{ implied. See the License for the specific language governing }
{ rights and limitations under the License. }
{ }
{******************************************************************}
unit WinSmCrd;
interface
uses
Windows;
(*
Copyright (c) 1996 - 1999 Microsoft Corporation
Module Name:
winsmcrd.h
Abstract:
Smart Card class/port IOCTL codes. This file is required for all code
user mode and kernel mode, using Smart Card IOCTL's, defines,
data structures
Revision History:
*)
(*
#ifdef _WINSCARD_H_
typedef DWORD ULONG;
typedef WORD UWORD;
typedef BYTE UCHAR;
#else
typedef ULONG DWORD;
// typedef UWORD WORD;
typedef UCHAR BYTE;
#endif *)
const
FILE_DEVICE_SMARTCARD = $00000031;
{$EXTERNALSYM FILE_DEVICE_SMARTCARD}
//
// Various constants
//
SCARD_ATR_LENGTH = 33; { ISO 7816-3 spec. }
{$EXTERNALSYM SCARD_ATR_LENGTH}
//
///////////////////////////////////////////////////////////////////////////////
//
// Protocol Flag definitions
//
SCARD_PROTOCOL_UNDEFINED = $00000000; // There is no active protocol.
{$EXTERNALSYM SCARD_PROTOCOL_UNDEFINED}
SCARD_PROTOCOL_T0 = $00000001; // T=0 is the active protocol.
{$EXTERNALSYM SCARD_PROTOCOL_T0}
SCARD_PROTOCOL_T1 = $00000002; // T=1 is the active protocol.
{$EXTERNALSYM SCARD_PROTOCOL_T1}
SCARD_PROTOCOL_RAW = $00010000; // Raw is the active protocol.
{$EXTERNALSYM SCARD_PROTOCOL_RAW}
//
// This is the mask of ISO defined transmission protocols
//
SCARD_PROTOCOL_Tx: LongInt = SCARD_PROTOCOL_T0 or SCARD_PROTOCOL_T1;
{$EXTERNALSYM SCARD_PROTOCOL_Tx}
//
// Use the default transmission parameters / card clock freq.
//
SCARD_PROTOCOL_DEFAULT = $80000000;
{$EXTERNALSYM SCARD_PROTOCOL_DEFAULT}
//
// Use optimal transmission parameters / card clock freq.
// Since using the optimal parameters is the default case no bit is defined to be 1
//
SCARD_PROTOCOL_OPTIMAL = $00000000;
{$EXTERNALSYM SCARD_PROTOCOL_OPTIMAL}
//
// Ioctl parameters 1 for IOCTL_SMARTCARD_POWER
//
SCARD_POWER_DOWN = 0; // Power down the card.
{$EXTERNALSYM SCARD_POWER_DOWN}
SCARD_COLD_RESET = 1; // Cycle power and reset the card.
{$EXTERNALSYM SCARD_COLD_RESET}
SCARD_WARM_RESET = 2; // Force a reset on the card.
{$EXTERNALSYM SCARD_WARM_RESET}
//
///////////////////////////////////////////////////////////////////////////////
//
// Reader Action IOCTLs
//
function SCARD_CTL_CODE(code: Integer): DWORD;
{$EXTERNALSYM SCARD_CTL_CODE}
function IOCTL_SMARTCARD_POWER: DWORD;
{$EXTERNALSYM IOCTL_SMARTCARD_POWER}
function IOCTL_SMARTCARD_GET_ATTRIBUTE: DWORD;
{$EXTERNALSYM IOCTL_SMARTCARD_GET_ATTRIBUTE}
function IOCTL_SMARTCARD_SET_ATTRIBUTE: DWORD;
{$EXTERNALSYM IOCTL_SMARTCARD_SET_ATTRIBUTE}
function IOCTL_SMARTCARD_CONFISCATE: DWORD;
{$EXTERNALSYM IOCTL_SMARTCARD_CONFISCATE}
function IOCTL_SMARTCARD_TRANSMIT: DWORD;
{$EXTERNALSYM IOCTL_SMARTCARD_TRANSMIT}
function IOCTL_SMARTCARD_EJECT: DWORD;
{$EXTERNALSYM IOCTL_SMARTCARD_EJECT}
function IOCTL_SMARTCARD_SWALLOW: DWORD;
{$EXTERNALSYM IOCTL_SMARTCARD_SWALLOW}
function IOCTL_SMARTCARD_IS_PRESENT: DWORD;
{$EXTERNALSYM IOCTL_SMARTCARD_IS_PRESENT}
function IOCTL_SMARTCARD_IS_ABSENT: DWORD;
{$EXTERNALSYM IOCTL_SMARTCARD_IS_ABSENT}
function IOCTL_SMARTCARD_SET_PROTOCOL: DWORD;
{$EXTERNALSYM IOCTL_SMARTCARD_SET_PROTOCOL}
function IOCTL_SMARTCARD_GET_STATE: DWORD;
{$EXTERNALSYM IOCTL_SMARTCARD_GET_STATE}
function IOCTL_SMARTCARD_GET_LAST_ERROR: DWORD;
{$EXTERNALSYM IOCTL_SMARTCARD_GET_LAST_ERROR}
function IOCTL_SMARTCARD_GET_PERF_CNTR: DWORD;
{$EXTERNALSYM IOCTL_SMARTCARD_GET_PERF_CNTR}
//
///////////////////////////////////////////////////////////////////////////////
//
// Tags for requesting card and reader attributes
//
const
MAXIMUM_ATTR_STRING_LENGTH = 32; // Nothing bigger than this from getAttr
{$EXTERNALSYM MAXIMUM_ATTR_STRING_LENGTH}
MAXIMUM_SMARTCARD_READERS = 10; // Limit the readers on the system
{$EXTERNALSYM MAXIMUM_SMARTCARD_READERS}
function SCARD_ATTR_VALUE(ulClass, ulTag: ULONG): ULONG;
{$EXTERNALSYM SCARD_ATTR_VALUE}
const
SCARD_CLASS_VENDOR_INFO = 1; // Vendor information definitions
{$EXTERNALSYM SCARD_CLASS_VENDOR_INFO}
SCARD_CLASS_COMMUNICATIONS = 2; // Communication definitions
{$EXTERNALSYM SCARD_CLASS_COMMUNICATIONS}
SCARD_CLASS_PROTOCOL = 3; // Protocol definitions
{$EXTERNALSYM SCARD_CLASS_PROTOCOL}
SCARD_CLASS_POWER_MGMT = 4; // Power Management definitions
{$EXTERNALSYM SCARD_CLASS_POWER_MGMT}
SCARD_CLASS_SECURITY = 5; // Security Assurance definitions
{$EXTERNALSYM SCARD_CLASS_SECURITY}
SCARD_CLASS_MECHANICAL = 6; // Mechanical characteristic definitions
{$EXTERNALSYM SCARD_CLASS_MECHANICAL}
SCARD_CLASS_VENDOR_DEFINED = 7; // Vendor specific definitions
{$EXTERNALSYM SCARD_CLASS_VENDOR_DEFINED}
SCARD_CLASS_IFD_PROTOCOL = 8; // Interface Device Protocol options
{$EXTERNALSYM SCARD_CLASS_IFD_PROTOCOL}
SCARD_CLASS_ICC_STATE = 9; // ICC State specific definitions
{$EXTERNALSYM SCARD_CLASS_ICC_STATE}
SCARD_CLASS_PERF = $7ffe; // performace counters
{$EXTERNALSYM SCARD_CLASS_PERF}
SCARD_CLASS_SYSTEM = $7fff; // System-specific definitions
{$EXTERNALSYM SCARD_CLASS_SYSTEM}
function SCARD_ATTR_VENDOR_NAME: ULONG;
{$EXTERNALSYM SCARD_ATTR_VENDOR_NAME}
function SCARD_ATTR_VENDOR_IFD_TYPE: ULONG;
{$EXTERNALSYM SCARD_ATTR_VENDOR_IFD_TYPE}
function SCARD_ATTR_VENDOR_IFD_VERSION: ULONG;
{$EXTERNALSYM SCARD_ATTR_VENDOR_IFD_VERSION}
function SCARD_ATTR_VENDOR_IFD_SERIAL_NO: ULONG;
{$EXTERNALSYM SCARD_ATTR_VENDOR_IFD_SERIAL_NO}
function SCARD_ATTR_CHANNEL_ID: ULONG;
{$EXTERNALSYM SCARD_ATTR_CHANNEL_ID}
function SCARD_ATTR_PROTOCOL_TYPES: ULONG;
{$EXTERNALSYM SCARD_ATTR_PROTOCOL_TYPES}
function SCARD_ATTR_DEFAULT_CLK: ULONG;
{$EXTERNALSYM SCARD_ATTR_DEFAULT_CLK}
function SCARD_ATTR_MAX_CLK: ULONG;
{$EXTERNALSYM SCARD_ATTR_MAX_CLK}
function SCARD_ATTR_DEFAULT_DATA_RATE: ULONG;
{$EXTERNALSYM SCARD_ATTR_DEFAULT_DATA_RATE}
function SCARD_ATTR_MAX_DATA_RATE: ULONG;
{$EXTERNALSYM SCARD_ATTR_MAX_DATA_RATE}
function SCARD_ATTR_MAX_IFSD: ULONG;
{$EXTERNALSYM SCARD_ATTR_MAX_IFSD}
function SCARD_ATTR_POWER_MGMT_SUPPORT: ULONG;
{$EXTERNALSYM SCARD_ATTR_POWER_MGMT_SUPPORT}
function SCARD_ATTR_USER_TO_CARD_AUTH_DEVICE: ULONG;
{$EXTERNALSYM SCARD_ATTR_USER_TO_CARD_AUTH_DEVICE}
function SCARD_ATTR_USER_AUTH_INPUT_DEVICE: ULONG;
{$EXTERNALSYM SCARD_ATTR_USER_AUTH_INPUT_DEVICE}
function SCARD_ATTR_CHARACTERISTICS: ULONG;
{$EXTERNALSYM SCARD_ATTR_CHARACTERISTICS}
function SCARD_ATTR_CURRENT_PROTOCOL_TYPE: ULONG;
{$EXTERNALSYM SCARD_ATTR_CURRENT_PROTOCOL_TYPE}
function SCARD_ATTR_CURRENT_CLK: ULONG;
{$EXTERNALSYM SCARD_ATTR_CURRENT_CLK}
function SCARD_ATTR_CURRENT_F: ULONG;
{$EXTERNALSYM SCARD_ATTR_CURRENT_F}
function SCARD_ATTR_CURRENT_D: ULONG;
{$EXTERNALSYM SCARD_ATTR_CURRENT_D}
function SCARD_ATTR_CURRENT_N: ULONG;
{$EXTERNALSYM SCARD_ATTR_CURRENT_N}
function SCARD_ATTR_CURRENT_W: ULONG;
{$EXTERNALSYM SCARD_ATTR_CURRENT_W}
function SCARD_ATTR_CURRENT_IFSC: ULONG;
{$EXTERNALSYM SCARD_ATTR_CURRENT_IFSC}
function SCARD_ATTR_CURRENT_IFSD: ULONG;
{$EXTERNALSYM SCARD_ATTR_CURRENT_IFSD}
function SCARD_ATTR_CURRENT_BWT: ULONG;
{$EXTERNALSYM SCARD_ATTR_CURRENT_BWT}
function SCARD_ATTR_CURRENT_CWT: ULONG;
{$EXTERNALSYM SCARD_ATTR_CURRENT_CWT}
function SCARD_ATTR_CURRENT_EBC_ENCODING: ULONG;
{$EXTERNALSYM SCARD_ATTR_CURRENT_EBC_ENCODING}
function SCARD_ATTR_EXTENDED_BWT: ULONG;
{$EXTERNALSYM SCARD_ATTR_EXTENDED_BWT}
function SCARD_ATTR_ICC_PRESENCE: ULONG;
{$EXTERNALSYM SCARD_ATTR_ICC_PRESENCE}
function SCARD_ATTR_ICC_INTERFACE_STATUS: ULONG;
{$EXTERNALSYM SCARD_ATTR_ICC_INTERFACE_STATUS}
function SCARD_ATTR_CURRENT_IO_STATE: ULONG;
{$EXTERNALSYM SCARD_ATTR_CURRENT_IO_STATE}
function SCARD_ATTR_ATR_STRING: ULONG;
{$EXTERNALSYM SCARD_ATTR_ATR_STRING}
function SCARD_ATTR_ICC_TYPE_PER_ATR: ULONG;
{$EXTERNALSYM SCARD_ATTR_ICC_TYPE_PER_ATR}
function SCARD_ATTR_ESC_RESET: ULONG;
{$EXTERNALSYM SCARD_ATTR_ESC_RESET}
function SCARD_ATTR_ESC_CANCEL: ULONG;
{$EXTERNALSYM SCARD_ATTR_ESC_CANCEL}
function SCARD_ATTR_ESC_AUTHREQUEST: ULONG;
{$EXTERNALSYM SCARD_ATTR_ESC_AUTHREQUEST}
function SCARD_ATTR_MAXINPUT: ULONG;
{$EXTERNALSYM SCARD_ATTR_MAXINPUT}
function SCARD_ATTR_DEVICE_UNIT: ULONG;
{$EXTERNALSYM SCARD_ATTR_DEVICE_UNIT}
function SCARD_ATTR_DEVICE_IN_USE: ULONG;
{$EXTERNALSYM SCARD_ATTR_DEVICE_IN_USE}
function SCARD_ATTR_DEVICE_FRIENDLY_NAME_W: ULONG;
{$EXTERNALSYM SCARD_ATTR_DEVICE_FRIENDLY_NAME_W}
function SCARD_ATTR_DEVICE_SYSTEM_NAME_W: ULONG;
{$EXTERNALSYM SCARD_ATTR_DEVICE_SYSTEM_NAME_W}
function SCARD_ATTR_DEVICE_FRIENDLY_NAME_A: ULONG;
{$EXTERNALSYM SCARD_ATTR_DEVICE_FRIENDLY_NAME_A}
function SCARD_ATTR_DEVICE_SYSTEM_NAME_A: ULONG;
{$EXTERNALSYM SCARD_ATTR_DEVICE_SYSTEM_NAME_A}
function SCARD_ATTR_SUPRESS_T1_IFS_REQUEST: ULONG;
{$EXTERNALSYM SCARD_ATTR_SUPRESS_T1_IFS_REQUEST}
function SCARD_PERF_NUM_TRANSMISSIONS: ULONG;
{$EXTERNALSYM SCARD_PERF_NUM_TRANSMISSIONS}
function SCARD_PERF_BYTES_TRANSMITTED: ULONG;
{$EXTERNALSYM SCARD_PERF_BYTES_TRANSMITTED}
function SCARD_PERF_TRANSMISSION_TIME: ULONG;
{$EXTERNALSYM SCARD_PERF_TRANSMISSION_TIME}
//
// T=0 Protocol Defines
//
const
SCARD_T0_HEADER_LENGTH = 7;
{$EXTERNALSYM SCARD_T0_HEADER_LENGTH}
SCARD_T0_CMD_LENGTH = 5;
{$EXTERNALSYM SCARD_T0_CMD_LENGTH}
//
// T=1 Protocol Defines
//
SCARD_T1_PROLOGUE_LENGTH = 3;
{$EXTERNALSYM SCARD_T1_PROLOGUE_LENGTH}
SCARD_T1_EPILOGUE_LENGTH = 2;
{$EXTERNALSYM SCARD_T1_EPILOGUE_LENGTH}
SCARD_T1_MAX_IFS = 254;
{$EXTERNALSYM SCARD_T1_MAX_IFS}
//
///////////////////////////////////////////////////////////////////////////////
//
// Reader states
//
SCARD_UNKNOWN = 0; // This value implies the driver is unaware
{$EXTERNALSYM SCARD_UNKNOWN} // of the current state of the reader.
SCARD_ABSENT = 1; // This value implies there is no card in
{$EXTERNALSYM SCARD_ABSENT} // the reader.
SCARD_PRESENT = 2; // This value implies there is a card is
{$EXTERNALSYM SCARD_PRESENT} // present in the reader, but that it has
// not been moved into position for use.
SCARD_SWALLOWED = 3; // This value implies there is a card in the
{$EXTERNALSYM SCARD_SWALLOWED} // reader in position for use. The card is
// not powered.
SCARD_POWERED = 4; // This value implies there is power is
{$EXTERNALSYM SCARD_POWERED} // being provided to the card, but the
// Reader Driver is unaware of the mode of
// the card.
SCARD_NEGOTIABLE = 5; // This value implies the card has been
{$EXTERNALSYM SCARD_NEGOTIABLE} // reset and is awaiting PTS negotiation.
SCARD_SPECIFIC = 6; // This value implies the card has been
{$EXTERNALSYM SCARD_SPECIFIC} // reset and specific communication
// protocols have been established.
////////////////////////////////////////////////////////////////////////////////
//
// I/O Services
//
// The following services provide access to the I/O capabilities of the
// reader drivers. Services of the Smart Card are requested by placing the
// following structure into the protocol buffer:
//
type
PSCARD_IO_REQUEST = ^SCARD_IO_REQUEST;
{$EXTERNALSYM PSCARD_IO_REQUEST}
SCARD_IO_REQUEST = record
dwProtocol: DWORD; { Protocol identifier }
dbPciLength: DWORD; { Protocol Control Information Length }
end;
{$EXTERNALSYM SCARD_IO_REQUEST}
//
// T=0 protocol services.
//
type
PSCARD_T0_COMMAND = ^SCARD_T0_COMMAND;
{$EXTERNALSYM PSCARD_T0_COMMAND}
SCARD_T0_COMMAND = record
bCla: Byte; // The instruction class
bIns: Byte; // The instruction code within the instruction class
bP1: Byte;
bP2: Byte; // Parameters to the instruction
bP3: Byte; // Size of I/O Transfer
end;
{$EXTERNALSYM SCARD_T0_COMMAND}
PSCARD_T0_REQUEST = ^SCARD_T0_REQUEST;
{$EXTERNALSYM PSCARD_T0_REQUEST}
SCARD_T0_REQUEST = record
ioRequest: SCARD_IO_REQUEST;
bSw1: Byte;
bSw2: Byte; // Return codes from the instruction
case Integer of
0: (CmdBytes: SCARD_T0_COMMAND);
1: (rgbHeader: array[0..4] of Byte);
end;
{$EXTERNALSYM SCARD_T0_REQUEST}
//
// T=1 Protocol Services
//
type
PSCARD_T1_REQUEST = ^SCARD_T1_REQUEST;
{$EXTERNALSYM PSCARD_T1_REQUEST}
SCARD_T1_REQUEST = record
ioRequest: SCARD_IO_REQUEST;
end;
{$EXTERNALSYM SCARD_T1_REQUEST}
//
////////////////////////////////////////////////////////////////////////////////
//
// Driver attribute flags
//
const
SCARD_READER_SWALLOWS = $00000001; // Reader has a card swallowing
{$EXTERNALSYM SCARD_READER_SWALLOWS} // mechanism.
SCARD_READER_EJECTS = $00000002; // Reader has a card ejection
{$EXTERNALSYM SCARD_READER_EJECTS} // mechanism.
SCARD_READER_CONFISCATES = $00000004; // Reader has a card capture
{$EXTERNALSYM SCARD_READER_CONFISCATES} // mechanism.
//
///////////////////////////////////////////////////////////////////////////////
//
// Type of reader
//
const
SCARD_READER_TYPE_SERIAL = $01;
{$EXTERNALSYM SCARD_READER_TYPE_SERIAL}
SCARD_READER_TYPE_PARALELL = $02;
{$EXTERNALSYM SCARD_READER_TYPE_PARALELL}
SCARD_READER_TYPE_KEYBOARD = $04;
{$EXTERNALSYM SCARD_READER_TYPE_KEYBOARD}
SCARD_READER_TYPE_SCSI = $08;
{$EXTERNALSYM SCARD_READER_TYPE_SCSI}
SCARD_READER_TYPE_IDE = $10;
{$EXTERNALSYM SCARD_READER_TYPE_IDE}
SCARD_READER_TYPE_USB = $20;
{$EXTERNALSYM SCARD_READER_TYPE_USB}
SCARD_READER_TYPE_PCMCIA = $40;
{$EXTERNALSYM SCARD_READER_TYPE_PCMCIA}
SCARD_READER_TYPE_VENDOR = $F0;
{$EXTERNALSYM SCARD_READER_TYPE_VENDOR}
implementation
function CTL_CODE(DeviceType, Func, Method, Access: WORD): DWORD;
begin
Result := (DeviceType shl 16) or (Access shl 14) or (Func shl 2) or Method;
end;
function SCARD_CTL_CODE(code: Integer): DWORD;
begin
Result := CTL_CODE(FILE_DEVICE_SMARTCARD, code, 0{METHOD_BUFFERED}, 0{FILE_ANY_ACCESS});
end;
function IOCTL_SMARTCARD_POWER: DWORD;
begin
Result := SCARD_CTL_CODE(1);
end;
function IOCTL_SMARTCARD_GET_ATTRIBUTE: DWORD;
begin
Result := SCARD_CTL_CODE(2);
end;
function IOCTL_SMARTCARD_SET_ATTRIBUTE: DWORD;
begin
Result := SCARD_CTL_CODE(3);
end;
function IOCTL_SMARTCARD_CONFISCATE: DWORD;
begin
Result := SCARD_CTL_CODE(4);
end;
function IOCTL_SMARTCARD_TRANSMIT: DWORD;
begin
Result := SCARD_CTL_CODE(5);
end;
function IOCTL_SMARTCARD_EJECT: DWORD;
begin
Result := SCARD_CTL_CODE(6);
end;
function IOCTL_SMARTCARD_SWALLOW: DWORD;
begin
Result := SCARD_CTL_CODE(7);
end;
function IOCTL_SMARTCARD_IS_PRESENT: DWORD;
begin
Result := SCARD_CTL_CODE(10);
end;
function IOCTL_SMARTCARD_IS_ABSENT: DWORD;
begin
Result := SCARD_CTL_CODE(11);
end;
function IOCTL_SMARTCARD_SET_PROTOCOL: DWORD;
begin
Result := SCARD_CTL_CODE(12);
end;
function IOCTL_SMARTCARD_GET_STATE: DWORD;
begin
Result := SCARD_CTL_CODE(14);
end;
function IOCTL_SMARTCARD_GET_LAST_ERROR: DWORD;
begin
Result := SCARD_CTL_CODE(15);
end;
function IOCTL_SMARTCARD_GET_PERF_CNTR: DWORD;
begin
Result := SCARD_CTL_CODE(16);
end;
function SCARD_ATTR_VALUE(ulClass, ulTag: ULONG): ULONG;
begin
Result := (ulClass shl 16) or ulTag;
end;
function SCARD_ATTR_VENDOR_NAME: ULONG;
begin
Result := SCARD_ATTR_VALUE(SCARD_CLASS_VENDOR_INFO, $0100);
end;
function SCARD_ATTR_VENDOR_IFD_TYPE: ULONG;
begin
Result := SCARD_ATTR_VALUE(SCARD_CLASS_VENDOR_INFO, $0101);
end;
function SCARD_ATTR_VENDOR_IFD_VERSION: ULONG;
begin
Result := SCARD_ATTR_VALUE(SCARD_CLASS_VENDOR_INFO, $0102);
end;
function SCARD_ATTR_VENDOR_IFD_SERIAL_NO: ULONG;
begin
Result := SCARD_ATTR_VALUE(SCARD_CLASS_VENDOR_INFO, $0103);
end;
function SCARD_ATTR_CHANNEL_ID: ULONG;
begin
Result := SCARD_ATTR_VALUE(SCARD_CLASS_COMMUNICATIONS, $0110);
end;
function SCARD_ATTR_PROTOCOL_TYPES: ULONG;
begin
Result := SCARD_ATTR_VALUE(SCARD_CLASS_PROTOCOL, $0120);
end;
function SCARD_ATTR_DEFAULT_CLK: ULONG;
begin
Result := SCARD_ATTR_VALUE(SCARD_CLASS_PROTOCOL, $0121);
end;
function SCARD_ATTR_MAX_CLK: ULONG;
begin
Result := SCARD_ATTR_VALUE(SCARD_CLASS_PROTOCOL, $0122);
end;
function SCARD_ATTR_DEFAULT_DATA_RATE: ULONG;
begin
Result := SCARD_ATTR_VALUE(SCARD_CLASS_PROTOCOL, $0123);
end;
function SCARD_ATTR_MAX_DATA_RATE: ULONG;
begin
Result := SCARD_ATTR_VALUE(SCARD_CLASS_PROTOCOL, $0124);
end;
function SCARD_ATTR_MAX_IFSD: ULONG;
begin
Result := SCARD_ATTR_VALUE(SCARD_CLASS_PROTOCOL, $0125);
end;
function SCARD_ATTR_POWER_MGMT_SUPPORT: ULONG;
begin
Result := SCARD_ATTR_VALUE(SCARD_CLASS_POWER_MGMT, $0131);
end;
function SCARD_ATTR_USER_TO_CARD_AUTH_DEVICE: ULONG;
begin
Result := SCARD_ATTR_VALUE(SCARD_CLASS_SECURITY, $0140);
end;
function SCARD_ATTR_USER_AUTH_INPUT_DEVICE: ULONG;
begin
Result := SCARD_ATTR_VALUE(SCARD_CLASS_SECURITY, $0142);
end;
function SCARD_ATTR_CHARACTERISTICS: ULONG;
begin
Result := SCARD_ATTR_VALUE(SCARD_CLASS_MECHANICAL, $0150);
end;
function SCARD_ATTR_CURRENT_PROTOCOL_TYPE: ULONG;
begin
Result := SCARD_ATTR_VALUE(SCARD_CLASS_IFD_PROTOCOL, $0201);
end;
function SCARD_ATTR_CURRENT_CLK: ULONG;
begin
Result := SCARD_ATTR_VALUE(SCARD_CLASS_IFD_PROTOCOL, $0202);
end;
function SCARD_ATTR_CURRENT_F: ULONG;
begin
Result := SCARD_ATTR_VALUE(SCARD_CLASS_IFD_PROTOCOL, $0203);
end;
function SCARD_ATTR_CURRENT_D: ULONG;
begin
Result := SCARD_ATTR_VALUE(SCARD_CLASS_IFD_PROTOCOL, $0204);
end;
function SCARD_ATTR_CURRENT_N: ULONG;
begin
Result := SCARD_ATTR_VALUE(SCARD_CLASS_IFD_PROTOCOL, $0205);
end;
function SCARD_ATTR_CURRENT_W: ULONG;
begin
Result := SCARD_ATTR_VALUE(SCARD_CLASS_IFD_PROTOCOL, $0206);
end;
function SCARD_ATTR_CURRENT_IFSC: ULONG;
begin
Result := SCARD_ATTR_VALUE(SCARD_CLASS_IFD_PROTOCOL, $0207);
end;
function SCARD_ATTR_CURRENT_IFSD: ULONG;
begin
Result := SCARD_ATTR_VALUE(SCARD_CLASS_IFD_PROTOCOL, $0208);
end;
function SCARD_ATTR_CURRENT_BWT: ULONG;
begin
Result := SCARD_ATTR_VALUE(SCARD_CLASS_IFD_PROTOCOL, $0209);
end;
function SCARD_ATTR_CURRENT_CWT: ULONG;
begin
Result := SCARD_ATTR_VALUE(SCARD_CLASS_IFD_PROTOCOL, $020a);
end;
function SCARD_ATTR_CURRENT_EBC_ENCODING: ULONG;
begin
Result := SCARD_ATTR_VALUE(SCARD_CLASS_IFD_PROTOCOL, $020b);
end;
function SCARD_ATTR_EXTENDED_BWT: ULONG;
begin
Result := SCARD_ATTR_VALUE(SCARD_CLASS_IFD_PROTOCOL, $020c);
end;
function SCARD_ATTR_ICC_PRESENCE: ULONG;
begin
Result := SCARD_ATTR_VALUE(SCARD_CLASS_ICC_STATE, $0300);
end;
function SCARD_ATTR_ICC_INTERFACE_STATUS: ULONG;
begin
Result := SCARD_ATTR_VALUE(SCARD_CLASS_ICC_STATE, $0301);
end;
function SCARD_ATTR_CURRENT_IO_STATE: ULONG;
begin
Result := SCARD_ATTR_VALUE(SCARD_CLASS_ICC_STATE, $0302) ;
end;
function SCARD_ATTR_ATR_STRING: ULONG;
begin
Result := SCARD_ATTR_VALUE(SCARD_CLASS_ICC_STATE, $0303);
end;
function SCARD_ATTR_ICC_TYPE_PER_ATR: ULONG;
begin
Result := SCARD_ATTR_VALUE(SCARD_CLASS_ICC_STATE, $0304);
end;
function SCARD_ATTR_ESC_RESET: ULONG;
begin
Result := SCARD_ATTR_VALUE(SCARD_CLASS_VENDOR_DEFINED, $A000);
end;
function SCARD_ATTR_ESC_CANCEL: ULONG;
begin
Result := SCARD_ATTR_VALUE(SCARD_CLASS_VENDOR_DEFINED, $A003);
end;
function SCARD_ATTR_ESC_AUTHREQUEST: ULONG;
begin
Result := SCARD_ATTR_VALUE(SCARD_CLASS_VENDOR_DEFINED, $A005);
end;
function SCARD_ATTR_MAXINPUT: ULONG;
begin
Result := SCARD_ATTR_VALUE(SCARD_CLASS_VENDOR_DEFINED, $A007);
end;
function SCARD_ATTR_DEVICE_UNIT: ULONG;
begin
Result := SCARD_ATTR_VALUE(SCARD_CLASS_SYSTEM, $0001);
end;
function SCARD_ATTR_DEVICE_IN_USE: ULONG;
begin
Result := SCARD_ATTR_VALUE(SCARD_CLASS_SYSTEM, $0002);
end;
function SCARD_ATTR_DEVICE_FRIENDLY_NAME_A: ULONG;
begin
Result := SCARD_ATTR_VALUE(SCARD_CLASS_SYSTEM, $0003);
end;
function SCARD_ATTR_DEVICE_SYSTEM_NAME_A: ULONG;
begin
Result := SCARD_ATTR_VALUE(SCARD_CLASS_SYSTEM, $0004);
end;
function SCARD_ATTR_DEVICE_FRIENDLY_NAME_W: ULONG;
begin
Result := SCARD_ATTR_VALUE(SCARD_CLASS_SYSTEM, $0005);
end;
function SCARD_ATTR_DEVICE_SYSTEM_NAME_W: ULONG;
begin
Result := SCARD_ATTR_VALUE(SCARD_CLASS_SYSTEM, $0006);
end;
function SCARD_ATTR_SUPRESS_T1_IFS_REQUEST: ULONG;
begin
Result := SCARD_ATTR_VALUE(SCARD_CLASS_SYSTEM, $0007);
end;
function SCARD_PERF_NUM_TRANSMISSIONS: ULONG;
begin
Result := SCARD_ATTR_VALUE(SCARD_CLASS_PERF, $0001);
end;
function SCARD_PERF_BYTES_TRANSMITTED: ULONG;
begin
Result := SCARD_ATTR_VALUE(SCARD_CLASS_PERF, $0002);
end;
function SCARD_PERF_TRANSMISSION_TIME: ULONG;
begin
Result := SCARD_ATTR_VALUE(SCARD_CLASS_PERF, $0003);
end;
end.