Exemple #1
0
        /// <summary>
        /// Transmits a buffer as a command for the ADPU command formate mostly used by the ACR122
        /// </summary>
        /// <param name="SendCommand"></param>
        /// <param name="ReceivedResponse"></param>
        /// <param name="Protocol"></param>
        /// <returns></returns>
        public ErrorCodes Control(byte[] SendCommand, out byte[] ReceivedResponse, out bool HasCard, OperationScopes Scope = OperationScopes.SCARD_SCOPE_SYSTEM, SmartCardProtocols Protocol = SmartCardProtocols.SCARD_PROTOCOL_UNDEFINED)
        {
            if (Disposed)
            {
                throw new ObjectDisposedException("WinSmartCardContext");
            }
            int  TempCard  = 0;
            int  AProtocol = 0;
            uint IOTL      = (uint)IOTLOperations.IOCTL_SMARTCARD_DIRECT; // 3225264;

            ReceivedResponse = new byte[256];

            int outBytes = ReceivedResponse.Length;

            if (Card == null)
            {
                if (LastResultCode != ErrorCodes.SCARD_S_SUCCESS)
                {
                    throw new WinSCardException(LastResultCode, WinSCard.GetScardErrMsg(LastResultCode) + "\nError perceived durring Context Establish");
                }
                LastResultCode = WinSCard.SCardConnect(_Context, ConnectedReaderName, SmartCardShareTypes.SCARD_SHARE_DIRECT, 0, ref TempCard, ref AProtocol);
                if (LastResultCode != ErrorCodes.SCARD_S_SUCCESS)
                {
                    throw new WinSCardException(LastResultCode, WinSCard.GetScardErrMsg(LastResultCode) + "\nError perceived durring Connect");
                }
                LastResultCode = WinSCard.SCardControl(TempCard, IOTL, SendCommand, ref ReceivedResponse, ref outBytes);
                if (LastResultCode != ErrorCodes.SCARD_S_SUCCESS)
                {
                    throw new WinSCardException(LastResultCode, WinSCard.GetScardErrMsg(LastResultCode) + "\nError perceived durring Control");
                }
                LastResultCode = WinSCard.SCardDisconnect(TempCard, SmartCardDispostion.SCARD_RESET_CARD);
                if (LastResultCode != ErrorCodes.SCARD_S_SUCCESS)
                {
                    throw new WinSCardException(LastResultCode, WinSCard.GetScardErrMsg(LastResultCode) + "\nError perceived durring Card Release");
                }
                Array.Resize(ref ReceivedResponse, outBytes);
                HasCard = false;
            }
            else
            {
                Card.Control(SendCommand, out ReceivedResponse, Scope, Protocol);
                HasCard = true;
            }
            //‭‭3136B0‬
            return(LastResultCode);
        }
Exemple #2
0
        /// <summary>
        /// Connects to the reader with a card
        ///     Note Winscard requires a card
        /// </summary>
        /// <param name="ReaderName">The name of the reader to connect to</param>
        /// <param name="SmartCardShareTypes">The perfered protocols to use</param>
        /// <returns></returns>
        public WinSmartCard CardConnect(SmartCardShareTypes SmartCardShareTypes, SmartCardShareTypes ShareType = SmartCardShareTypes.SCARD_SHARE_SHARED, SmartCardProtocols Protocols = SmartCardProtocols.SCARD_PROTOCOL_Any)
        {
            if (Disposed)
            {
                throw new ObjectDisposedException("WinSmartCardContext");
            }
            int Card     = 0;
            int Protocol = 0;

            LastResultCode = WinSCard.SCardConnect(_Context, ConnectedReaderName, ShareType,
                                                   Protocols, ref Card, ref Protocol);

            if (LastResultCode != ErrorCodes.SCARD_S_SUCCESS)
            {
                throw new WinSCardException(LastResultCode);
            }

            this.Card = new WinSmartCard(this, Card);

            return(this.Card);
        }