/// <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> /// 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); }