示例#1
0
        private static string GetGroupName(SCardReaderGroup group)
        {
            string returnValue;

            switch (group)
            {
            case SCardReaderGroup.AllReaders:
                returnValue = "SCard$AllReaders";
                break;

            case SCardReaderGroup.DefaultReaders:
                returnValue = "SCard$DefaultReaders";
                break;

            case SCardReaderGroup.LocalReaders:
                returnValue = "SCard$LocalReaders";
                break;

            case SCardReaderGroup.SystemReaders:
                returnValue = "SCard$SystemReaders";
                break;

            default:
                throw new ArgumentException($"The group {group} was not recognised", nameof(group));
            }

            return(returnValue);
        }
示例#2
0
        /// <summary>
        /// Lists readers in the specified group using the specified context.
        /// </summary>
        /// <param name="context">An IntPtr that is the context to use.</param>
        /// <param name="group">A SCardReaderGroup that is the reader group to use.</param>
        /// <param name="readers">An array of string that will set to the list of readers.</param>
        /// <param name="result">A SCardResponse that will bes et to the result of the operation.</param>
        /// <returns>A bool that indicates whether the operation was a success.</returns>
        internal static bool ListReaders(IntPtr context, SCardReaderGroup group, out string[] readers, out SCardResponse result)
        {
            uint readerSize = 0;
            uint resultCode;
            bool returnValue = false;

            // Defaults
            readers = null;

            resultCode = SCardListReaders(context, GetGroupName(group), null, ref readerSize);
            result     = (SCardResponse)resultCode;
            if (result == SCardResponse.SCARD_S_SUCCESS)
            {
                string readerBuffer;

                readerBuffer = "".PadLeft((int)readerSize);
                resultCode   = SCardListReaders(context, GetGroupName(group), readerBuffer, ref readerSize);
                result       = (SCardResponse)resultCode;
                if (result == SCardResponse.SCARD_S_SUCCESS)
                {
                    readers     = readerBuffer.Split('\0').Where(x => !string.IsNullOrEmpty(x)).Select(x => x.Trim()).ToArray();
                    returnValue = true;
                }
            }

            return(returnValue);
        }
        /// <summary>
        /// Gets defined value for specific SCardReaderGroup.
        /// </summary>
        /// <param name="group">SCardReaderGroup value.</param>
        /// <returns>Defined value.</returns>
        public static string GetDefinedValue(this SCardReaderGroup group)
        {
            switch (group)
            {
            case SCardReaderGroup.All:
                return(All);

            case SCardReaderGroup.Defualt:
                return(Default);

            case SCardReaderGroup.Local:
                return(Local);

            case SCardReaderGroup.System:
                return(System);

            default:
                return(null);
            }
        }
示例#4
0
        private static string[] ListReadersInternal(IntPtr context, SCardReaderGroup group)
        {
            string[] returnValue;

            if (context != null && context != IntPtr.Zero)
            {
                SCardResponse result;
                bool          wasSuccessful;

                try
                {
                    wasSuccessful = NativeMethods.ListReaders(context, group, out returnValue, out result);
                }
                catch (Exception ex)
                {
                    throw new Exception("Unable to list readers due to an exception", ex);
                }

                if (!wasSuccessful)
                {
                    if (result == SCardResponse.SCARD_E_NO_READERS_AVAILABLE)
                    {
                        returnValue = new string[0];
                    }
                    else if (result == SCardResponse.SCARD_E_READER_UNAVAILABLE)
                    {
                        throw new InvalidOperationException($"Unable to list readers. The specified reader is currently unavailable");
                    }
                    else
                    {
                        throw new InvalidOperationException($"Unable to list readers. Error code {result}");
                    }
                }
            }
            else
            {
                throw new ArgumentException("The specified context is invalid", nameof(context));
            }

            return(returnValue);
        }
示例#5
0
 public static IEnumerable <string> GetReaderNames(SCardReaderGroup group = SCardReaderGroup.NotSpecified, PcscExceptionHandler onException = null)
 {
     return(Instance.GetReaderNames(group.GetDefinedValue(), onException));
 }