winapi_ui_automation/um/
winscard.rs

1// Licensed under the Apache License, Version 2.0
2// <LICENSE-APACHE or http://www.apache.org/licenses/LICENSE-2.0> or the MIT license
3// <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your option.
4// All files in the project carrying such notice may not be copied, modified, or distributed
5// except according to those terms.
6//! Data Protection API Prototypes and Definitions
7// This header file provides the definitions and symbols necessary for an
8// Application or Smart Card Service Provider to access the Smartcard Subsystem.
9use shared::basetsd::ULONG_PTR;
10use shared::guiddef::{LPCGUID, LPGUID};
11use shared::minwindef::{BOOL, BYTE, DWORD, LPBYTE, LPCVOID, LPDWORD, LPVOID, PBYTE};
12use shared::rpcdce::UUID;
13use shared::windef::{HICON, HWND};
14use um::winnt::{CHAR, HANDLE, LONG, LPCSTR, LPCWSTR, LPSTR, LPWSTR, PVOID, WCHAR};
15use um::winsmcrd::{LPCSCARD_IO_REQUEST, LPSCARD_IO_REQUEST};
16pub type LPCBYTE = *const BYTE;
17pub type SCARDCONTEXT = ULONG_PTR;
18pub type PSCARDCONTEXT = *mut SCARDCONTEXT;
19pub type LPSCARDCONTEXT = *mut SCARDCONTEXT;
20pub type SCARDHANDLE = ULONG_PTR;
21pub type PSCARDHANDLE = *mut SCARDHANDLE;
22pub type LPSCARDHANDLE = *mut SCARDHANDLE;
23pub const SCARD_AUTOALLOCATE: DWORD = -1i32 as u32;
24pub const SCARD_SCOPE_USER: DWORD = 0;
25pub const SCARD_SCOPE_TERMINAL: DWORD = 1;
26pub const SCARD_SCOPE_SYSTEM: DWORD = 2;
27extern "system" {
28    pub fn SCardEstablishContext(
29        dwScope: DWORD,
30        pvReserved1: LPCVOID,
31        pvReserved2: LPCVOID,
32        phContext: LPSCARDCONTEXT,
33    ) -> LONG;
34    pub fn SCardReleaseContext(
35        hContext: SCARDCONTEXT,
36    ) -> LONG;
37    pub fn SCardIsValidContext(
38        hContext: SCARDCONTEXT,
39    ) -> LONG;
40}
41pub const SCARD_PROVIDER_PRIMARY: DWORD = 1;
42pub const SCARD_PROVIDER_CSP: DWORD = 2;
43pub const SCARD_PROVIDER_KSP: DWORD = 3;
44extern "system" {
45    pub fn SCardListReaderGroupsA(
46        hContext: SCARDCONTEXT,
47        mszGroups: LPSTR,
48        pcchGroups: LPDWORD,
49    ) -> LONG;
50    pub fn SCardListReaderGroupsW(
51        hContext: SCARDCONTEXT,
52        mszGroups: LPWSTR,
53        pcchGroups: LPDWORD,
54    ) -> LONG;
55    pub fn SCardListReadersA(
56        hContext: SCARDCONTEXT,
57        mszGroups: LPCSTR,
58        mszReaders: LPSTR,
59        pcchReaders: LPDWORD,
60    ) -> LONG;
61    pub fn SCardListReadersW(
62        hContext: SCARDCONTEXT,
63        mszGroups: LPCWSTR,
64        mszReaders: LPWSTR,
65        pcchReaders: LPDWORD,
66    ) -> LONG;
67    pub fn SCardListCardsA(
68        hContext: SCARDCONTEXT,
69        pbAtr: LPCBYTE,
70        rgquidInterfaces: LPCGUID,
71        cguidInterfaceCount: DWORD,
72        mszCards: *mut CHAR,
73        pcchCards: LPDWORD,
74    ) -> LONG;
75    pub fn SCardListCardsW(
76        hContext: SCARDCONTEXT,
77        pbAtr: LPCBYTE,
78        rgquidInterfaces: LPCGUID,
79        cguidInterfaceCount: DWORD,
80        mszCards: *mut WCHAR,
81        pcchCards: LPDWORD,
82    ) -> LONG;
83    pub fn SCardListInterfacesA(
84        hContext: SCARDCONTEXT,
85        szCard: LPCSTR,
86        pguidInterfaces: LPGUID,
87        pcguidInterfaces: LPDWORD,
88    ) -> LONG;
89    pub fn SCardListInterfacesW(
90        hContext: SCARDCONTEXT,
91        szCard: LPCWSTR,
92        pguidInterfaces: LPGUID,
93        pcguidInterfaces: LPDWORD,
94    ) -> LONG;
95    pub fn SCardGetProviderIdA(
96        hContext: SCARDCONTEXT,
97        szCard: LPCSTR,
98        pguidProviderId: LPGUID,
99    ) -> LONG;
100    pub fn SCardGetProviderIdW(
101        hContext: SCARDCONTEXT,
102        szCard: LPCWSTR,
103        pguidProviderId: LPGUID,
104    ) -> LONG;
105    pub fn SCardGetCardTypeProviderNameA(
106        hContext: SCARDCONTEXT,
107        szCardName: LPCSTR,
108        dwProviderId: DWORD,
109        szProvider: *mut CHAR,
110        pcchProvider: LPDWORD,
111    ) -> LONG;
112    pub fn SCardGetCardTypeProviderNameW(
113        hContext: SCARDCONTEXT,
114        szCardName: LPCWSTR,
115        dwProviderId: DWORD,
116        szProvider: *mut WCHAR,
117        pcchProvider: LPDWORD,
118    ) -> LONG;
119    pub fn SCardIntroduceReaderGroupA(
120        hContext: SCARDCONTEXT,
121        szGroupName: LPCSTR,
122    ) -> LONG;
123    pub fn SCardIntroduceReaderGroupW(
124        hContext: SCARDCONTEXT,
125        szGroupName: LPCWSTR,
126    ) -> LONG;
127    pub fn SCardForgetReaderGroupA(
128        hContext: SCARDCONTEXT,
129        szGroupName: LPCSTR,
130    ) -> LONG;
131    pub fn SCardForgetReaderGroupW(
132        hContext: SCARDCONTEXT,
133        szGroupName: LPCWSTR,
134    ) -> LONG;
135    pub fn SCardIntroduceReaderA(
136        hContext: SCARDCONTEXT,
137        szReaderName: LPCSTR,
138        szDeviceName: LPCSTR,
139    ) -> LONG;
140    pub fn SCardIntroduceReaderW(
141        hContext: SCARDCONTEXT,
142        szReaderName: LPCWSTR,
143        szDeviceName: LPCWSTR,
144    ) -> LONG;
145    pub fn SCardForgetReaderA(
146        hContext: SCARDCONTEXT,
147        szReaderName: LPCSTR,
148    ) -> LONG;
149    pub fn SCardForgetReaderW(
150        hContext: SCARDCONTEXT,
151        szReaderName: LPCWSTR,
152    ) -> LONG;
153    pub fn SCardAddReaderToGroupA(
154        hContext: SCARDCONTEXT,
155        szReaderName: LPCSTR,
156        szGroupName: LPCSTR,
157    ) -> LONG;
158    pub fn SCardAddReaderToGroupW(
159        hContext: SCARDCONTEXT,
160        szReaderName: LPCWSTR,
161        szGroupName: LPCWSTR,
162    ) -> LONG;
163    pub fn SCardRemoveReaderFromGroupA(
164        hContext: SCARDCONTEXT,
165        szReaderName: LPCSTR,
166        szGroupName: LPCSTR,
167    ) -> LONG;
168    pub fn SCardRemoveReaderFromGroupW(
169        hContext: SCARDCONTEXT,
170        szReaderName: LPCWSTR,
171        szGroupName: LPCWSTR,
172    ) -> LONG;
173    pub fn SCardIntroduceCardTypeA(
174        hContext: SCARDCONTEXT,
175        szCardName: LPCSTR,
176        pguidPrimaryProvider: LPCGUID,
177        rgguidInterfaces: LPCGUID,
178        dwInterfaceCount: DWORD,
179        pbAtr: LPCBYTE,
180        pbAtrMask: LPCBYTE,
181        cbAtrLen: DWORD,
182    ) -> LONG;
183    pub fn SCardIntroduceCardTypeW(
184        hContext: SCARDCONTEXT,
185        szCardName: LPCWSTR,
186        pguidPrimaryProvider: LPCGUID,
187        rgguidInterfaces: LPCGUID,
188        dwInterfaceCount: DWORD,
189        pbAtr: LPCBYTE,
190        pbAtrMask: LPCBYTE,
191        cbAtrLen: DWORD,
192    ) -> LONG;
193    pub fn SCardSetCardTypeProviderNameA(
194        hContext: SCARDCONTEXT,
195        szCardName: LPCSTR,
196        dwProviderId: DWORD,
197        szProvider: LPCSTR,
198    ) -> LONG;
199    pub fn SCardSetCardTypeProviderNameW(
200        hContext: SCARDCONTEXT,
201        szCardName: LPCWSTR,
202        dwProviderId: DWORD,
203        szProvider: LPCWSTR,
204    ) -> LONG;
205    pub fn SCardForgetCardTypeA(
206        hContext: SCARDCONTEXT,
207        szCardName: LPCSTR,
208    ) -> LONG;
209    pub fn SCardForgetCardTypeW(
210        hContext: SCARDCONTEXT,
211        szCardName: LPCWSTR,
212    ) -> LONG;
213    pub fn SCardFreeMemory(
214        hContext: SCARDCONTEXT,
215        pvMem: LPCVOID,
216    ) -> LONG;
217    pub fn SCardAccessStartedEvent() -> HANDLE;
218    pub fn SCardReleaseStartedEvent();
219}
220STRUCT!{struct SCARD_READERSTATEA {
221    szReader: LPCSTR,
222    pvUserData: LPVOID,
223    dwCurrentState: DWORD,
224    dwEventState: DWORD,
225    cbAtr: DWORD,
226    rgbAtr: [BYTE; 36],
227}}
228pub type PSCARD_READERSTATEA = *mut SCARD_READERSTATEA;
229pub type LPSCARD_READERSTATEA = *mut SCARD_READERSTATEA;
230STRUCT!{struct SCARD_READERSTATEW {
231    szReader: LPCWSTR,
232    pvUserData: LPVOID,
233    dwCurrentState: DWORD,
234    dwEventState: DWORD,
235    cbAtr: DWORD,
236    rgbAtr: [BYTE; 36],
237}}
238pub type PSCARD_READERSTATEW = *mut SCARD_READERSTATEW;
239pub type LPSCARD_READERSTATEW = *mut SCARD_READERSTATEW;
240pub type SCARD_READERSTATE_A = SCARD_READERSTATEA;
241pub type SCARD_READERSTATE_W = SCARD_READERSTATEW;
242pub type PSCARD_READERSTATE_A = PSCARD_READERSTATEA;
243pub type PSCARD_READERSTATE_W = PSCARD_READERSTATEW;
244pub type LPSCARD_READERSTATE_A = LPSCARD_READERSTATEA;
245pub type LPSCARD_READERSTATE_W = LPSCARD_READERSTATEW;
246pub const SCARD_STATE_UNAWARE: DWORD = 0x00000000;
247pub const SCARD_STATE_IGNORE: DWORD = 0x00000001;
248pub const SCARD_STATE_CHANGED: DWORD = 0x00000002;
249pub const SCARD_STATE_UNKNOWN: DWORD = 0x00000004;
250pub const SCARD_STATE_UNAVAILABLE: DWORD = 0x00000008;
251pub const SCARD_STATE_EMPTY: DWORD = 0x00000010;
252pub const SCARD_STATE_PRESENT: DWORD = 0x00000020;
253pub const SCARD_STATE_ATRMATCH: DWORD = 0x00000040;
254pub const SCARD_STATE_EXCLUSIVE: DWORD = 0x00000080;
255pub const SCARD_STATE_INUSE: DWORD = 0x00000100;
256pub const SCARD_STATE_MUTE: DWORD = 0x00000200;
257pub const SCARD_STATE_UNPOWERED: DWORD = 0x00000400;
258extern "system" {
259    pub fn SCardLocateCardsA(
260        hContext: SCARDCONTEXT,
261        mszCards: LPCSTR,
262        rgReaderStates: LPSCARD_READERSTATEA,
263        cReaders: DWORD,
264    ) -> LONG;
265    pub fn SCardLocateCardsW(
266        hContext: SCARDCONTEXT,
267        mszCards: LPCWSTR,
268        rgReaderStates: LPSCARD_READERSTATEW,
269        cReaders: DWORD,
270    ) -> LONG;
271}
272STRUCT!{struct SCARD_ATRMASK {
273    cbAtr: DWORD,
274    rgbAtr: [BYTE; 36],
275    rgbMask: [BYTE; 36],
276}}
277pub type PSCARD_ATRMASK = *mut SCARD_ATRMASK;
278pub type LPSCARD_ATRMASK = *mut SCARD_ATRMASK;
279extern "system" {
280    pub fn SCardLocateCardsByATRA(
281        hContext: SCARDCONTEXT,
282        rgAtrMasks: LPSCARD_ATRMASK,
283        cAtrs: DWORD,
284        rgReaderStates: LPSCARD_READERSTATEA,
285        cReaders: DWORD,
286    ) -> LONG;
287    pub fn SCardLocateCardsByATRW(
288        hContext: SCARDCONTEXT,
289        rgAtrMasks: LPSCARD_ATRMASK,
290        cAtrs: DWORD,
291        rgReaderStates: LPSCARD_READERSTATEW,
292        cReaders: DWORD,
293    ) -> LONG;
294    pub fn SCardGetStatusChangeA(
295        hContext: SCARDCONTEXT,
296        dwTimeout: DWORD,
297        rgReaderStates: LPSCARD_READERSTATEA,
298        cReaders: DWORD,
299    ) -> LONG;
300    pub fn SCardGetStatusChangeW(
301        hContext: SCARDCONTEXT,
302        dwTimeout: DWORD,
303        rgReaderStates: LPSCARD_READERSTATEW,
304        cReaders: DWORD,
305    ) -> LONG;
306    pub fn SCardCancel(
307        hContext: SCARDCONTEXT,
308    ) -> LONG;
309}
310pub const SCARD_SHARE_EXCLUSIVE: DWORD = 1;
311pub const SCARD_SHARE_SHARED: DWORD = 2;
312pub const SCARD_SHARE_DIRECT: DWORD = 3;
313pub const SCARD_LEAVE_CARD: DWORD = 0;
314pub const SCARD_RESET_CARD: DWORD = 1;
315pub const SCARD_UNPOWER_CARD: DWORD = 2;
316pub const SCARD_EJECT_CARD: DWORD = 3;
317extern "system" {
318    pub fn SCardConnectA(
319        hContext: SCARDCONTEXT,
320        szReader: LPCSTR,
321        dwShareMode: DWORD,
322        dwPreferredProtocols: DWORD,
323        phCard: LPSCARDHANDLE,
324        pdwActiveProtocol: LPDWORD,
325    ) -> LONG;
326    pub fn SCardConnectW(
327        hContext: SCARDCONTEXT,
328        szReader: LPCWSTR,
329        dwShareMode: DWORD,
330        dwPreferredProtocols: DWORD,
331        phCard: LPSCARDHANDLE,
332        pdwActiveProtocol: LPDWORD,
333    ) -> LONG;
334    pub fn SCardReconnect(
335        hCard: SCARDHANDLE,
336        dwShareMode: DWORD,
337        dwPreferredProtocols: DWORD,
338        dwInitialization: DWORD,
339        pdwActiveProtocol: LPDWORD,
340    ) -> LONG;
341    pub fn SCardDisconnect(
342        hCard: SCARDHANDLE,
343        dwDisposition: DWORD,
344    ) -> LONG;
345    pub fn SCardBeginTransaction(
346        hCard: SCARDHANDLE,
347    ) -> LONG;
348    pub fn SCardEndTransaction(
349        hCard: SCARDHANDLE,
350        dwDisposition: DWORD,
351    ) -> LONG;
352    pub fn SCardState(
353        hCard: SCARDHANDLE,
354        pdwState: LPDWORD,
355        pdwProtocol: LPDWORD,
356        pbAtr: LPBYTE,
357        pcbAtrLen: LPDWORD,
358    ) -> LONG;
359    pub fn SCardStatusA(
360        hCard: SCARDHANDLE,
361        mszReaderNames: LPSTR,
362        pcchReaderLen: LPDWORD,
363        pdwState: LPDWORD,
364        pdwProtocol: LPDWORD,
365        pbAtr: LPBYTE,
366        pcbAtrLen: LPDWORD,
367    ) -> LONG;
368    pub fn SCardStatusW(
369        hCard: SCARDHANDLE,
370        mszReaderNames: LPWSTR,
371        pcchReaderLen: LPDWORD,
372        pdwState: LPDWORD,
373        pdwProtocol: LPDWORD,
374        pbAtr: LPBYTE,
375        pcbAtrLen: LPDWORD,
376    ) -> LONG;
377    pub fn SCardTransmit(
378        hCard: SCARDHANDLE,
379        pioSendPci: LPCSCARD_IO_REQUEST,
380        pbSendBuffer: LPCBYTE,
381        cbSendLength: DWORD,
382        pioRecvPci: LPSCARD_IO_REQUEST,
383        pbRecvBuffer: LPBYTE,
384        pcbRecvLength: LPDWORD,
385    ) -> LONG;
386    pub fn SCardGetTransmitCount(
387        hCard: SCARDHANDLE,
388        pcTransmitCount: LPDWORD,
389    ) -> LONG;
390    pub fn SCardControl(
391        hCard: SCARDHANDLE,
392        dwControlCode: DWORD,
393        lpInBuffer: LPCVOID,
394        cbInBufferSize: DWORD,
395        lpOutBuffer: LPVOID,
396        cbOutBufferSize: DWORD,
397        lpBytesReturned: LPDWORD,
398    ) -> LONG;
399    pub fn SCardGetAttrib(
400        hCard: SCARDHANDLE,
401        dwAttrId: DWORD,
402        pbAttr: LPBYTE,
403        pcbAttrLen: LPDWORD,
404    ) -> LONG;
405    pub fn SCardSetAttrib(
406        hCard: SCARDHANDLE,
407        dwAttrId: DWORD,
408        pbAttr: LPCBYTE,
409        cbAttrLen: DWORD,
410    ) -> LONG;
411}
412pub const SC_DLG_MINIMAL_UI: DWORD = 0x01;
413pub const SC_DLG_NO_UI: DWORD = 0x02;
414pub const SC_DLG_FORCE_UI: DWORD = 0x04;
415pub const SCERR_NOCARDNAME: DWORD = 0x4000;
416pub const SCERR_NOGUIDS: DWORD = 0x8000;
417FN!{stdcall LPOCNCONNPROCA(
418    SCARDCONTEXT,
419    LPSTR,
420    LPSTR,
421    PVOID,
422) -> SCARDHANDLE}
423FN!{stdcall LPOCNCONNPROCW(
424    SCARDCONTEXT,
425    LPWSTR,
426    LPWSTR,
427    PVOID,
428) -> SCARDHANDLE}
429FN!{stdcall LPOCNCHKPROC(
430    SCARDCONTEXT,
431    SCARDHANDLE,
432    PVOID,
433) -> BOOL}
434FN!{stdcall LPOCNDSCPROC(
435    SCARDCONTEXT,
436    SCARDHANDLE,
437    PVOID,
438) -> ()}
439STRUCT!{struct OPENCARD_SEARCH_CRITERIAA {
440    dwStructSize: DWORD,
441    lpstrGroupNames: LPSTR,
442    nMaxGroupNames: DWORD,
443    rgguidInterfaces: LPCGUID,
444    cguidInterfaces: DWORD,
445    lpstrCardNames: LPSTR,
446    nMaxCardNames: DWORD,
447    lpfnCheck: LPOCNCHKPROC,
448    lpfnConnect: LPOCNCONNPROCA,
449    lpfnDisconnect: LPOCNDSCPROC,
450    pvUserData: LPVOID,
451    dwShareMode: DWORD,
452    dwPreferredProtocols: DWORD,
453}}
454pub type POPENCARD_SEARCH_CRITERIAA = *mut OPENCARD_SEARCH_CRITERIAA;
455pub type LPOPENCARD_SEARCH_CRITERIAA = *mut OPENCARD_SEARCH_CRITERIAA;
456STRUCT!{struct OPENCARD_SEARCH_CRITERIAW {
457    dwStructSize: DWORD,
458    lpstrGroupNames: LPWSTR,
459    nMaxGroupNames: DWORD,
460    rgguidInterfaces: LPCGUID,
461    cguidInterfaces: DWORD,
462    lpstrCardNames: LPWSTR,
463    nMaxCardNames: DWORD,
464    lpfnCheck: LPOCNCHKPROC,
465    lpfnConnect: LPOCNCONNPROCW,
466    lpfnDisconnect: LPOCNDSCPROC,
467    pvUserData: LPVOID,
468    dwShareMode: DWORD,
469    dwPreferredProtocols: DWORD,
470}}
471pub type POPENCARD_SEARCH_CRITERIAW = *mut OPENCARD_SEARCH_CRITERIAW;
472pub type LPOPENCARD_SEARCH_CRITERIAW = *mut OPENCARD_SEARCH_CRITERIAW;
473STRUCT!{struct OPENCARDNAME_EXA {
474    dwStructSize: DWORD,
475    hSCardContext: SCARDCONTEXT,
476    hwndOwner: HWND,
477    dwFlags: DWORD,
478    lpstrTitle: LPCSTR,
479    lpstrSearchDesc: LPCSTR,
480    hIcon: HICON,
481    pOpenCardSearchCriteria: POPENCARD_SEARCH_CRITERIAA,
482    lpfnConnect: LPOCNCONNPROCA,
483    pvUserData: LPVOID,
484    dwShareMode: DWORD,
485    dwPreferredProtocols: DWORD,
486    lpstrRdr: LPSTR,
487    nMaxRdr: DWORD,
488    lpstrCard: LPSTR,
489    nMaxCard: DWORD,
490    dwActiveProtocol: DWORD,
491    hCardHandle: SCARDHANDLE,
492}}
493pub type POPENCARDNAME_EXA = *mut OPENCARDNAME_EXA;
494pub type LPOPENCARDNAME_EXA = *mut OPENCARDNAME_EXA;
495STRUCT!{struct OPENCARDNAME_EXW {
496    dwStructSize: DWORD,
497    hSCardContext: SCARDCONTEXT,
498    hwndOwner: HWND,
499    dwFlags: DWORD,
500    lpstrTitle: LPCWSTR,
501    lpstrSearchDesc: LPCWSTR,
502    hIcon: HICON,
503    pOpenCardSearchCriteria: POPENCARD_SEARCH_CRITERIAW,
504    lpfnConnect: LPOCNCONNPROCW,
505    pvUserData: LPVOID,
506    dwShareMode: DWORD,
507    dwPreferredProtocols: DWORD,
508    lpstrRdr: LPWSTR,
509    nMaxRdr: DWORD,
510    lpstrCard: LPWSTR,
511    nMaxCard: DWORD,
512    dwActiveProtocol: DWORD,
513    hCardHandle: SCARDHANDLE,
514}}
515pub type POPENCARDNAME_EXW = *mut OPENCARDNAME_EXW;
516pub type LPOPENCARDNAME_EXW = *mut OPENCARDNAME_EXW;
517pub type OPENCARDNAMEA_EX = OPENCARDNAME_EXA;
518pub type OPENCARDNAMEW_EX = OPENCARDNAME_EXW;
519pub type POPENCARDNAMEA_EX = POPENCARDNAME_EXA;
520pub type POPENCARDNAMEW_EX = POPENCARDNAME_EXW;
521pub type LPOPENCARDNAMEA_EX = LPOPENCARDNAME_EXA;
522pub type LPOPENCARDNAMEW_EX = LPOPENCARDNAME_EXW;
523pub const SCARD_READER_SEL_AUTH_PACKAGE: DWORD = -629i32 as u32;
524ENUM!{enum READER_SEL_REQUEST_MATCH_TYPE {
525    RSR_MATCH_TYPE_READER_AND_CONTAINER = 1,
526    RSR_MATCH_TYPE_SERIAL_NUMBER,
527    RSR_MATCH_TYPE_ALL_CARDS,
528}}
529STRUCT!{struct READER_SEL_REQUEST_ReaderAndContainerParameter {
530    cbReaderNameOffset: DWORD,
531    cchReaderNameLength: DWORD,
532    cbContainerNameOffset: DWORD,
533    cchContainerNameLength: DWORD,
534    dwDesiredCardModuleVersion: DWORD,
535    dwCspFlags: DWORD,
536}}
537STRUCT!{struct READER_SEL_REQUEST_SerialNumberParameter {
538    cbSerialNumberOffset: DWORD,
539    cbSerialNumberLength: DWORD,
540    dwDesiredCardModuleVersion: DWORD,
541}}
542UNION!{union READER_SEL_REQUEST_u {
543    [u32; 6],
544    ReaderAndContainerParameter ReaderAndContainerParameter_mut:
545        READER_SEL_REQUEST_ReaderAndContainerParameter,
546    SerialNumberParameter SerialNumberParameter_mut: READER_SEL_REQUEST_SerialNumberParameter,
547}}
548STRUCT!{struct READER_SEL_REQUEST {
549    dwShareMode: DWORD,
550    dwPreferredProtocols: DWORD,
551    MatchType: READER_SEL_REQUEST_MATCH_TYPE,
552    u: READER_SEL_REQUEST_u,
553}}
554pub type PREADER_SEL_REQUEST = *mut READER_SEL_REQUEST;
555STRUCT!{struct READER_SEL_RESPONSE {
556    cbReaderNameOffset: DWORD,
557    cchReaderNameLength: DWORD,
558    cbCardNameOffset: DWORD,
559    cchCardNameLength: DWORD,
560}}
561pub type PREADER_SEL_RESPONSE = *mut READER_SEL_RESPONSE;
562STRUCT!{struct OPENCARDNAMEA {
563    dwStructSize: DWORD,
564    hwndOwner: HWND,
565    hSCardContext: SCARDCONTEXT,
566    lpstrGroupNames: LPSTR,
567    nMaxGroupNames: DWORD,
568    lpstrCardNames: LPSTR,
569    nMaxCardNames: DWORD,
570    rgguidInterfaces: LPCGUID,
571    cguidInterfaces: DWORD,
572    lpstrRdr: LPSTR,
573    nMaxRdr: DWORD,
574    lpstrCard: LPSTR,
575    nMaxCard: DWORD,
576    lpstrTitle: LPCSTR,
577    dwFlags: DWORD,
578    pvUserData: LPVOID,
579    dwShareMode: DWORD,
580    dwPreferredProtocols: DWORD,
581    dwActiveProtocol: DWORD,
582    lpfnConnect: LPOCNCONNPROCA,
583    lpfnCheck: LPOCNCHKPROC,
584    lpfnDisconnect: LPOCNDSCPROC,
585    hCardHandle: SCARDHANDLE,
586}}
587pub type POPENCARDNAMEA = *mut OPENCARDNAMEA;
588pub type LPOPENCARDNAMEA = *mut OPENCARDNAMEA;
589STRUCT!{struct OPENCARDNAMEW {
590    dwStructSize: DWORD,
591    hwndOwner: HWND,
592    hSCardContext: SCARDCONTEXT,
593    lpstrGroupNames: LPWSTR,
594    nMaxGroupNames: DWORD,
595    lpstrCardNames: LPWSTR,
596    nMaxCardNames: DWORD,
597    rgguidInterfaces: LPCGUID,
598    cguidInterfaces: DWORD,
599    lpstrRdr: LPWSTR,
600    nMaxRdr: DWORD,
601    lpstrCard: LPWSTR,
602    nMaxCard: DWORD,
603    lpstrTitle: LPCWSTR,
604    dwFlags: DWORD,
605    pvUserData: LPVOID,
606    dwShareMode: DWORD,
607    dwPreferredProtocols: DWORD,
608    dwActiveProtocol: DWORD,
609    lpfnConnect: LPOCNCONNPROCW,
610    lpfnCheck: LPOCNCHKPROC,
611    lpfnDisconnect: LPOCNDSCPROC,
612    hCardHandle: SCARDHANDLE,
613}}
614pub type POPENCARDNAMEW = *mut OPENCARDNAMEW;
615pub type LPOPENCARDNAMEW = *mut OPENCARDNAMEW;
616pub type OPENCARDNAME_A = OPENCARDNAMEA;
617pub type OPENCARDNAME_W = OPENCARDNAMEW;
618pub type POPENCARDNAME_A = POPENCARDNAMEA;
619pub type POPENCARDNAME_W = POPENCARDNAMEW;
620pub type LPOPENCARDNAME_A = LPOPENCARDNAMEA;
621pub type LPOPENCARDNAME_W = LPOPENCARDNAMEW;
622extern "system" {
623    pub fn SCardReadCacheA(
624        hContext: SCARDCONTEXT,
625        CardIdentifier: *mut UUID,
626        FreshnessCounter: DWORD,
627        LookupName: LPSTR,
628        Data: PBYTE,
629        DataLen: *mut DWORD,
630    ) -> LONG;
631    pub fn SCardReadCacheW(
632        hContext: SCARDCONTEXT,
633        CardIdentifier: *mut UUID,
634        FreshnessCounter: DWORD,
635        LookupName: LPWSTR,
636        Data: PBYTE,
637        DataLen: *mut DWORD,
638    ) -> LONG;
639    pub fn SCardWriteCacheA(
640        hContext: SCARDCONTEXT,
641        CardIdentifier: *mut UUID,
642        FreshnessCounter: DWORD,
643        LookupName: LPSTR,
644        Data: PBYTE,
645        DataLen: DWORD,
646    ) -> LONG;
647    pub fn SCardWriteCacheW(
648        hContext: SCARDCONTEXT,
649        CardIdentifier: *mut UUID,
650        FreshnessCounter: DWORD,
651        LookupName: LPWSTR,
652        Data: PBYTE,
653        DataLen: DWORD,
654    ) -> LONG;
655    pub fn SCardGetReaderIconA(
656        hContext: SCARDCONTEXT,
657        szReaderName: LPCSTR,
658        pbIcon: LPBYTE,
659        pcbIcon: LPDWORD,
660    ) -> LONG;
661    pub fn SCardGetReaderIconW(
662        hContext: SCARDCONTEXT,
663        szReaderName: LPCWSTR,
664        pbIcon: LPBYTE,
665        pcbIcon: LPDWORD,
666    ) -> LONG;
667    pub fn SCardGetDeviceTypeIdA(
668        hContext: SCARDCONTEXT,
669        szReaderName: LPCSTR,
670        pdwDeviceTypeId: LPDWORD,
671    ) -> LONG;
672    pub fn SCardGetDeviceTypeIdW(
673        hContext: SCARDCONTEXT,
674        szReaderName: LPCWSTR,
675        pdwDeviceTypeId: LPDWORD,
676    ) -> LONG;
677    pub fn SCardGetReaderDeviceInstanceIdA(
678        hContext: SCARDCONTEXT,
679        szReaderName: LPCSTR,
680        szDeviceInstanceId: LPSTR,
681        pcchDeviceInstanceId: LPDWORD,
682    ) -> LONG;
683    pub fn SCardGetReaderDeviceInstanceIdW(
684        hContext: SCARDCONTEXT,
685        szReaderName: LPCWSTR,
686        szDeviceInstanceId: LPWSTR,
687        pcchDeviceInstanceId: LPDWORD,
688    ) -> LONG;
689    pub fn SCardListReadersWithDeviceInstanceIdA(
690        hContext: SCARDCONTEXT,
691        szDeviceInstanceId: LPCSTR,
692        mszReaders: LPSTR,
693        pcchReaders: LPDWORD,
694    ) -> LONG;
695    pub fn SCardListReadersWithDeviceInstanceIdW(
696        hContext: SCARDCONTEXT,
697        szDeviceInstanceId: LPCWSTR,
698        mszReaders: LPWSTR,
699        pcchReaders: LPDWORD,
700    ) -> LONG;
701}
702pub const SCARD_AUDIT_CHV_FAILURE: DWORD = 0x0;
703pub const SCARD_AUDIT_CHV_SUCCESS: DWORD = 0x1;
704extern "system" {
705    pub fn SCardAudit(
706        hContext: SCARDCONTEXT,
707        dwEvent: DWORD,
708    ) -> LONG;
709}