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); }
/// <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); } }
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); }
public static IEnumerable <string> GetReaderNames(SCardReaderGroup group = SCardReaderGroup.NotSpecified, PcscExceptionHandler onException = null) { return(Instance.GetReaderNames(group.GetDefinedValue(), onException)); }