/// <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)); }
/// <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; } }
/// <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); }
/// <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)); }
internal WinSCardException(ErrorCodes ErrorOnExceptionIn) : base(WinSCard.GetScardErrMsg(ErrorOnExceptionIn)) { ErrorOnException = ErrorOnExceptionIn; }