(require mzlib/foreign) (unsafe!) (define winscard (ffi-lib "winscard")) ;; typedef unsigned long DWORD; (define _DWORD _ulong) ;; typedef long LONG; (define _LONG _long) ;; SCARDHANDLE should be an opaque pointer ;; - for type safety - ;; but we can do with 32 bit integer too. (define _SCARDHANDLE _int) #| The SCARD_IO_REQUEST structure begins a protocol control information structure. typedef struct { DWORD dwProtocol; DWORD cbPciLength; } SCARD_IO_REQUEST; |# (define-cstruct _SCARD_IO_REQUEST ((dwProtocol _DWORD) (cbPciLength _DWORD))) #| The SCardTransmit function sends a service request to the smart card and expects to receive data back from the card. /* Tags for input and output parameters. */ #define IN #define OUT LONG SCardTransmit( IN SCARDHANDLE hCard, IN SCARD_IO_REQUEST* pioSendPci, IN const BYTE* pbSendBuffer, IN DWORD cbSendLength, // Size of pbSendBuffer. IN OUT SCARD_IO_REQUEST* pioRecvPci, // It can be NULL. OUT BYTE* pbRecvBuffer, IN OUT DWORD* pcbRecvLength); |# (define SCardTransmit (get-ffi-obj "SCardTransmit" winscard (_fun ;; IN SCARDHANDLE hCard (hCard : _SCARDHANDLE) ;; IN SCARD_IO_REQUEST* pioSendPci (pioSendPci : (_ptr i _SCARD_IO_REQUEST)) ;; IN const BYTE* pbSendBuffer (pbSendBuffer : (_vector i _byte)) ;; IN DWORD cbSendLength // Size of pbSendBuffer. (_DWORD = (vector-length pbSendBuffer)) ;; IN OUT SCARD_IO_REQUEST* pioRecvPci (ioRecvPci : _SCARD_IO_REQUEST-pointer/null) ;; OUT BYTE* pbRecvBuffer (pbRecvBuffer : (_vector o _byte cbRecvLength)) ;; IN OUT DWORD* pcbRecvLength (cbRecvLength : (_ptr io _DWORD)) ;; return code -> (error : _LONG) ))) (SCardTransmit 1 (make-SCARD_IO_REQUEST 2 8) (make-vector 4 0) ;; cbSendLength AUTOMATICALLY GENERATED. (make-SCARD_IO_REQUEST 2 8) ;; pbRecvBuffer SKIPPED SINCE IT IS AN OUTPUT PARAMETER. 4 )