#ifndef _MARSHAL_H_DEF #define _MARSHAL_H_DEF // Card SCODEs are 8 bits with msb meaning error // Win32 SCODEs are 32 bits with msb meaning error #define MAKESCODE(r) ((SCODE)((((r) & 0x80) != 0) ? (r) | 0xC0000000L : (r))) #include "wpscproxy.h" // Smart Card Marshaling structure typedef struct { WORD wGenLen; // Size of the generated buffer WORD wExpLen; // Size of the expanded buffer (after unmarshaling in the card) WORD wResLen; // Size of the reserved buffer (as returned by the card) BYTE *pbBuffer; // Pointer where the next argument will be added } XSCM; typedef XSCM *LPXSCM; #define FLAG_REALPCSC 0 #define FLAG_FAKEPCSC 1 #define FLAG_NOT_PCSC 2 #define FLAG_MASKPCSC 1 // To get the PC/SC index in the array below #define FLAG_TYPEPCSC 3 // To get the PC/SC type #define FLAG_BIGENDIAN 0x80000000L #define FLAG_MY_ATTACH 0x40000000L #define FLAG_ISPROXY 0x20000000L #define FLAG_MASKVER 0x00FF0000L #define FLAG2VERSION(dw) ((dw)&FLAG_MASKVER) #define VERSION_1_0 0x00100000L #define VERSION_1_1 0x00110000L typedef struct { SCARDCONTEXT hCtx; // Associated ResMgr context SCARDHANDLE hCard; // Associated PC/SC card handle DWORD dwFlags; // DWORD dwProtocol; LPFNSCWTRANSMITPROC lpfnTransmit; BYTE bResLen; // Reserved length in TheBuffer in the card BYTE *pbLc; // Stores Crt SCM pointer for future update XSCM xSCM; BYTE byINS; // INS to be used for proxy BYTE byCryptoM; // Last Crypto mechanism } MYSCARDHANDLE; typedef MYSCARDHANDLE *LPMYSCARDHANDLE; // // Copies the current SCARDHANDLE, owned by the caller, into the proxy // MYSCARDHANDLE context structure. This is necessary in case the original // SCARDHANDLE used to connect has become invalid and subsequently reconnected. // static void ProxyUpdateScardHandle( IN SCARDHANDLE hProxy, IN SCARDHANDLE hScardHandle) { ((LPMYSCARDHANDLE) hProxy)->hCard = hScardHandle; } // Raisable exceptions #define STATUS_INSUFFICIENT_MEM 0xE0000001 #define STATUS_INVALID_PARAM 0xE0000002 #define STATUS_NO_SERVICE 0xE0000003 #define STATUS_INTERNAL_ERROR 0xE0000004 // len will set wResLen in the above structure // If wExpLen gets bigger than wResLen, an exception will be generated (marshaling) // If wResLen indicates that the buffer cannot hold the parameter, an exception // will be raised too (unmarshaling) void InitXSCM(LPMYSCARDHANDLE phTmp, const BYTE *pbBuffer, WORD len); // Generated buffer length WORD GetSCMBufferLength(LPXSCM pxSCM); BYTE *GetSCMCrtPointer(LPXSCM pxSCM); // Extraction of data from the returned buffer (PC unmarshaling) // helper functions SCODE XSCM2SCODE(LPXSCM pxSCM); UINT8 XSCM2UINT8(LPXSCM pxSCM); HFILE XSCM2HFILE(LPXSCM pxSCM); UINT16 XSCM2UINT16(LPXSCM pxSCM, BOOL fBigEndian); WCSTR XSCM2String(LPXSCM pxSCM, UINT8 *plen, BOOL fBigEndian); TCOUNT XSCM2ByteArray(LPXSCM pxSCM, UINT8 **ppb); // Laying out of data in the buffer to be sent (PC marshaling) // helper functions #define TYPE_NOTYPE_NOCOUNT 0 // Not prefixed with type, not data #define TYPE_TYPED 1 // Prefixed with type (always counts) #define TYPE_NOTYPE_COUNT 2 // Not prefixed with type, but is data void UINT82XSCM(LPXSCM pxSCM, UINT8 val, int type); void HFILE2XSCM(LPXSCM pxSCM, HFILE val); void UINT162XSCM(LPXSCM pxSCM, UINT16 val, BOOL fBigEndian); void ByteArray2XSCM(LPXSCM pxSCM, const BYTE *pbBuffer, TCOUNT len); void String2XSCM(LPXSCM pxSCM, WCSTR wsz, BOOL fBigEndian); void SW2XSCM(LPXSCM pxSCM, UINT16 wSW); void UINT8BYREF2XSCM(LPXSCM pxSCM, UINT8 *val); void HFILEBYREF2XSCM(LPXSCM pxSCM, HFILE *val); void UINT16BYREF2XSCM(LPXSCM pxSCM, UINT16 *val, BOOL fBigEndian); void ByteArrayOut2XSCM(LPXSCM pxSCM, BYTE *pb, TCOUNT len); void StringOut2XSCM(LPXSCM pxSCM, WSTR wsz, TCOUNT len, BOOL fBigEndian); void NULL2XSCM(LPXSCM pxSCM); #endif