예제 #1
0
        /// <summary>
        /// Gets all the reader names with the context of current
        ///     Context vers
        /// </summary>
        /// <returns>reader names</returns>
        public List <string> ListReadersAsStrings(bool ThrowOnNoReader = true)
        {
            if (Disposed)
            {
                throw new ObjectDisposedException("WinSmartCardContext");
            }
            int           ReaderCount         = 0;
            List <string> AvailableReaderList = new List <string>();


            //Get count but due to the difference in language get only the count
            LastResultCode = WinSCard.SCardListReaders(_Context, null, null, ref ReaderCount);


            if (!ThrowOnNoReader && LastResultCode == ErrorCodes.SCARD_E_NO_READERS_AVAILABLE)
            {
                throw new WinSCardException(LastResultCode, WinSCard.GetScardErrMsg(LastResultCode) + "\nError perceived durring List Length retrieval");
            }
            else if (LastResultCode != ErrorCodes.SCARD_S_SUCCESS)
            {
                throw new WinSCardException(LastResultCode, WinSCard.GetScardErrMsg(LastResultCode) + "\nError perceived durring List Length retrieval");
            }

            //Alot space for the List
            byte[] ReadersList = new byte[ReaderCount];

            //Fill the list with the actual values
            LastResultCode = WinSCard.SCardListReaders(_Context, null, ReadersList, ref ReaderCount);
            if (LastResultCode != ErrorCodes.SCARD_S_SUCCESS)
            {
                throw new WinSCardException(LastResultCode, WinSCard.GetScardErrMsg(LastResultCode) + "\nError perceived durring Actual List retrieval");
            }

            return(CppToCSharpHelpers.ListOfStringsFromNullTerminatedByteBuffer(ReadersList));
        }
예제 #2
0
 /// <summary>
 /// Disposal for using statements
 /// </summary>
 public void Dispose()
 {
     if (Card != null)
     {
         Card.Dispose();
     }
     if (!Disposed)
     {
         LastResultCode = WinSCard.SCardReleaseContext(_Context);
         if (LastResultCode != ErrorCodes.SCARD_S_SUCCESS)
         {
             throw new WinSCardException(LastResultCode, WinSCard.GetScardErrMsg(LastResultCode) + "\nThrown clean up.");
         }
         Disposed = true;
     }
 }
예제 #3
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);
        }
예제 #4
0
 /// <summary>
 /// a wrapper import of the (mostly)provided error to sting func/meothd
 /// </summary>
 /// <param name="ReturnCode"></param>
 /// <returns></returns>
 public static string GetSmartCardErrMsg(ErrorCodes ReturnCode)
 {
     return(WinSCard.GetScardErrMsg(ReturnCode));
 }
예제 #5
0
 internal WinSCardException(ErrorCodes ErrorOnExceptionIn) : base(WinSCard.GetScardErrMsg(ErrorOnExceptionIn))
 {
     ErrorOnException = ErrorOnExceptionIn;
 }