public static extern int SCardGetStatusChange(int hContext, int TimeOut, ref SCARD_READERSTATE ReaderState, int ReaderCount);
public bool WaitForRemoval(double seconds) { var rs = new SCARD_READERSTATE(); rs.reader = _readerName; rs.userData = ""; rs.eventState = ReaderState.SCARD_STATE_UNKNOWN; if (_context != IntPtr.Zero) { rs.currenState = ReaderState.SCARD_STATE_UNAWARE; _result = SCardGetStatusChange(_context, 0, ref rs, 1); if (_result == Result.SCARD_S_SUCCESS) { /* * If card present, wait required time */ if ((rs.eventState & ReaderState.SCARD_STATE_EMPTY) == 0 && seconds > 0) { rs.currenState = rs.eventState; _result = SCardGetStatusChange(_context, (int)(seconds * 1000), ref rs, 1); } } } var maskedState = rs.eventState & ReaderState.SCARD_STATE_EMPTY; return(maskedState != 0); }
public bool WaitForCard(double seconds) { ReaderState maskedState; var rs = new SCARD_READERSTATE(); rs.reader = _readerName; rs.userData = ""; rs.eventState = ReaderState.SCARD_STATE_UNKNOWN; if (_context != IntPtr.Zero) { rs.currenState = ReaderState.SCARD_STATE_UNAWARE; _result = SCardGetStatusChange(_context, 0, ref rs, 1); if (_result == Result.SCARD_S_SUCCESS) { /* * If card not already present, wait required time */ maskedState = rs.eventState & ReaderState.SCARD_STATE_PRESENT; if (maskedState != ReaderState.SCARD_STATE_PRESENT && seconds > 0) { rs.currenState = rs.eventState; _result = SCardGetStatusChange(_context, (int)(seconds * 1000), ref rs, 1); } } } maskedState = rs.eventState & ReaderState.SCARD_STATE_PRESENT; return(maskedState == ReaderState.SCARD_STATE_PRESENT); }
private void SelectReaderForm_Load(object sender, System.EventArgs e) { m_Selected = null; string[] readers = SmartcardReader.InternalGetReaders(m_Context); if (readers == null || readers.Length == 0) { //MessageBox.Show(this, ResourceController.GetString("SelectReaderForm_NoReaders"), ResourceController.GetString("SelectReaderForm_NoReadersTitle"), MessageBoxButtons.OK, MessageBoxIcon.Error, MessageBoxDefaultButton.Button1, MessageBoxOptions.DefaultDesktopOnly); this.Close(); return; } else { m_Readers = new ReaderItem[readers.Length]; m_States = new SCARD_READERSTATE[readers.Length]; CardReaderList.Items.Clear(); for (int i = 0; i < readers.Length; i++) { m_Readers[i].item = CardReaderList.Items.Add(readers[i], 0); m_Readers[i].name = readers[i]; m_States[i].szReader = readers[i]; m_States[i].dwCurrentState = NativeMethods.SCARD_STATE_UNAWARE; } UpdateTimer_Tick(null, null); UpdateTimer.Enabled = true; } SetLabels(); }
internal FelicaReader(string name) { ReaderState = new SCARD_READERSTATE() { szReader = name, dwCurrentState = (uint)State.SCARD_STATE_UNAWARE, }; }
private static SCARD_READERSTATE CreateReaderState(string name) { SCARD_READERSTATE returnValue; returnValue = new SCARD_READERSTATE { szReader = name, dwCurrentState = (uint)SCardReaderEventState.SCARD_STATE_UNAWARE }; return(returnValue); }
public bool SelectDevice() { var availableReaders = ListReaders(); if (!Information.IsNothing(availableReaders) && availableReaders.Count > 0) { RdrState = new SCARD_READERSTATE(); readername = availableReaders[0].ToString(); RdrState.RdrName = readername; return(true); } else { return(false); } }
static void Main(string[] args) { IntPtr hContext; SCardEstablishContext(0, IntPtr.Zero, IntPtr.Zero, out hContext); SCARD_READERSTATE[] rs = new SCARD_READERSTATE[1]; rs[0].szReader = "\\\\?PnP?\\Notification"; int result = SCardGetStatusChange(hContext, 100000000, rs, rs.Length); if (result == 0) { Console.WriteLine("Reader attached."); } else { Console.WriteLine("SCardGetStatusChange failed."); } }
public SCardError GetStatusChange( IntPtr hContext, IntPtr dwTimeout, SCardReaderState[] rgReaderStates) { SCARD_READERSTATE[] readerstates = null; int cReaders = 0; if (rgReaderStates != null) { cReaders = rgReaderStates.Length; readerstates = new SCARD_READERSTATE[cReaders]; for (int i = 0; i < cReaders; i++) { readerstates[i] = rgReaderStates[i].winscard_rstate; } } SCardError rc; // On a 64-bit platforms .ToInt32() will throw an OverflowException Int32 timeout = unchecked ((Int32)dwTimeout.ToInt64()); rc = SCardHelper.ToSCardError( SCardGetStatusChange( (IntPtr)hContext, (Int32)timeout, readerstates, (Int32)cReaders)); if (rc == SCardError.Success) { if (rgReaderStates != null) { for (int i = 0; i < cReaders; i++) { /* replace with returned values */ rgReaderStates[i].winscard_rstate = readerstates[i]; } } } return(rc); }
public SCardError GetStatusChange( IntPtr hContext, IntPtr dwTimeout, SCardReaderState[] rgReaderStates) { SCARD_READERSTATE[] readerstates = null; int cReaders = 0; if (rgReaderStates != null) { cReaders = rgReaderStates.Length; readerstates = new SCARD_READERSTATE[cReaders]; for (int i = 0; i < cReaders; i++) { readerstates[i] = rgReaderStates[i].pcsclite_rstate; } } IntPtr retval = SCardGetStatusChange( (IntPtr)hContext, (IntPtr)dwTimeout, readerstates, (IntPtr)cReaders); SCardError rc = SCardHelper.ToSCardError(retval); if (rc == SCardError.Success) { if (rgReaderStates != null) { for (int i = 0; i < cReaders; i++) { /* replace with returned values */ rgReaderStates[i].pcsclite_rstate = readerstates[i]; } } } return(rc); }
public SCardError GetStatusChange(IntPtr hContext, IntPtr dwTimeout, SCardReaderState[] rgReaderStates) { SCARD_READERSTATE[] readerstates = null; var cReaders = 0; if (rgReaderStates != null) { // copy the last known state into the buffer cReaders = rgReaderStates.Length; readerstates = new SCARD_READERSTATE[cReaders]; for (var i = 0; i < cReaders; i++) { readerstates[i] = rgReaderStates[i].WindowsReaderState; } } // On a 64-bit platforms .ToInt32() will throw an OverflowException var timeout = unchecked ((int)dwTimeout.ToInt64()); var rc = SCardHelper.ToSCardError( SCardGetStatusChange( hContext, timeout, readerstates, cReaders)); if (rc != SCardError.Success || rgReaderStates == null) { return(rc); } for (var i = 0; i < cReaders; i++) { // replace with returned values rgReaderStates[i].WindowsReaderState = readerstates[i]; } return(rc); }
SCARD_READERSTATE[] initializeReaderState(IntPtr hContext, List <string> readerNameList) { const int SCARD_STATE_UNAWARE = 0x00000000; SCARD_READERSTATE[] readerStateArray = new SCARD_READERSTATE[readerNameList.Count]; int i = 0; foreach (string readerName in readerNameList) { readerStateArray[i].dwCurrentState = SCARD_STATE_UNAWARE; readerStateArray[i].szReader = readerName; i++; } uint ret = SCardGetStatusChange(hContext, 100 /*msec*/, readerStateArray, readerStateArray.Length); if (ret != SCARD_S_SUCCESS) { throw new ApplicationException("リーダーの初期状態の取得に失敗。code = " + ret); } return(readerStateArray); }
private static SCARD_READERSTATE[] CreateReaderStates(string[] readers, bool discoverNewDevices = false) { int offset = 0; SCARD_READERSTATE[] returnValue; if (discoverNewDevices) { offset = 1; returnValue = new SCARD_READERSTATE[readers.Length + 1]; returnValue[0] = CreateReaderState(@"\\?PnP?\Notification"); } else { returnValue = new SCARD_READERSTATE[readers.Length]; } for (int i = 0; i < returnValue.Length; i++) { returnValue[i + offset] = CreateReaderState(readers[i]); } return(returnValue); }
//public static extern int SCardState (int hCard, ref uint State, ref uint Protocol, ref byte ATR, ref uint ATRLen); public static extern int SCardGetStatusChangeA(int hContext, uint Timeout, ref SCARD_READERSTATE ReadersState, int ReadersCount);
public SCardError GetStatusChange( IntPtr hContext, IntPtr dwTimeout, SCardReaderState[] rgReaderStates) { SCARD_READERSTATE[] readerstates = null; int cReaders = 0; if (rgReaderStates != null) { cReaders = rgReaderStates.Length; readerstates = new SCARD_READERSTATE[cReaders]; for (int i = 0; i < cReaders; i++) readerstates[i] = rgReaderStates[i].pcsclite_rstate; } IntPtr retval = SCardGetStatusChange( (IntPtr)hContext, (IntPtr)dwTimeout, readerstates, (IntPtr)cReaders); SCardError rc = SCardHelper.ToSCardError(retval); if (rc == SCardError.Success) if (rgReaderStates != null) { for (int i = 0; i < cReaders; i++) /* replace with returned values */ rgReaderStates[i].pcsclite_rstate = readerstates[i]; } return rc; }
private static extern int SCardGetStatusChange(IntPtr hContext, uint dwTimeout, ref SCARD_READERSTATE rgReaderStates, int cReaders);
private bool SCardGetStatusChange( SCARD_READERSTATE[] readerState, int timeout = INFINITE ) { return SCardGetStatusChange( this.Context, timeout, readerState, readerState.Length ) == SCARD_S_SUCCESS; }
private void Polling() { // リーダーの状態を保存する構造体 var readerState = new SCARD_READERSTATE[1]; // UID string uid = null; // 現在の状態を取得 // 取得した状態は dwEventState に入っている while (true) { readerState[0].szReader = this.ReaderName; readerState[0].dwCurrentState = SCARD_STATE_UNAWARE; // 取得成功 if (SCardGetStatusChange(readerState, 0)) { // 既にカードが載せられている場合 if ((readerState[0].dwEventState & SCARD_STATE_EMPTY) == 0) { // 待機する必要は無し uid = this.ConnectCardAndGetUid(); // UID の取得に成功 if (uid != null) { if (this.Callback != null) { this.Callback(uid); } break; } } // カードが載せられていない場合 else { break; } } } // カードが載せられるのを待機 while (true) { // 以前に取得した状態を設定 readerState[0].dwCurrentState = readerState[0].dwEventState; // 状態が変化した場合 if (SCardGetStatusChange(readerState, 100)) { // リーダーが取り外された場合 if ((readerState[0].dwEventState & SCARD_STATE_UNAVAILABLE) != 0) { MessageBox.Show("リーダーが取り外されました。プログラムを終了します。"); Program.Exit(); } // カードが載せられた場合 else if ((readerState[0].dwEventState & SCARD_STATE_PRESENT) != 0) { if (uid == null) { // 待機する必要は無し uid = this.ConnectCardAndGetUid(); // UID の取得に成功 if (uid != null) { if (this.Callback != null) { this.Callback(uid); } continue; } } } // カードが外された場合 else if ((readerState[0].dwEventState & SCARD_STATE_EMPTY) != 0) { uid = null; } } } }
public SCardError GetStatusChange( IntPtr hContext, IntPtr dwTimeout, SCardReaderState[] rgReaderStates) { SCARD_READERSTATE[] readerstates = null; int cReaders = 0; if (rgReaderStates != null) { cReaders = rgReaderStates.Length; readerstates = new SCARD_READERSTATE[cReaders]; for (int i = 0; i < cReaders; i++) readerstates[i] = rgReaderStates[i].winscard_rstate; } SCardError rc; // On a 64-bit platforms .ToInt32() will throw an OverflowException Int32 timeout = unchecked((Int32)dwTimeout.ToInt64()); rc = SCardHelper.ToSCardError( SCardGetStatusChange( (IntPtr)hContext, (Int32)timeout, readerstates, (Int32)cReaders)); if (rc == SCardError.Success) if (rgReaderStates != null) { for (int i = 0; i < cReaders; i++) /* replace with returned values */ rgReaderStates[i].winscard_rstate = readerstates[i]; } return rc; }
private async Task CardDetectionLoop(CancellationToken token) { await Task.Delay(1, token) .ConfigureAwait(false); // resume on threadpool thread while (!token.IsCancellationRequested) { try { var currentState = new SCARD_READERSTATE { RdrName = Name, RdrCurrState = Constants.SCARD_STATE_UNAWARE, RdrEventState = 0 }; const int readerCount = 1; const int timeout = 0; var retval = SafeNativeMethods.SCardGetStatusChange(hContext, timeout, ref currentState, readerCount); if (retval == 0 && currentState.ATRLength > 0) { // Card inserted if (!cardInserted) { cardInserted = true; OnDisconnect(); // clean up if needed var card = new SmartCard(hContext, Name, currentState.ATRValue); if (Interlocked.CompareExchange(ref currentCard, card, null) == null) { // card was not inserted, now it is // Raise on another thread to not block this loop var evt = CardAdded; if (evt != null) { Task.Run(() => evt(this, new CardAddedEventArgs(card))); } } } } else { // Card removed if (cardInserted) { cardInserted = false; // HACK: Let our tranceive method know it's gone for one buggy reader // bug in the 5427 CK reader if (Name.Contains("5427 CK")) { SmartCardConnectionExtension.IsFirstConnection = false; } OnDisconnect(); } } await Task.Delay(250, token); } catch (Exception ex) { Debug.WriteLine("Exception from card monitor thread: " + ex); } } }
static extern Result SCardGetStatusChange( IntPtr context, int dwTimeOut, ref SCARD_READERSTATE rgReaderState, int cReaders);