Пример #1
3
 public static extern int SCardGetStatusChange(int hContext, int TimeOut, ref SCARD_READERSTATE ReaderState,
                                               int ReaderCount);
Пример #2
0
        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);
        }
Пример #3
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);
        }
Пример #4
0
 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,
     };
 }
Пример #6
0
        private static SCARD_READERSTATE CreateReaderState(string name)
        {
            SCARD_READERSTATE returnValue;

            returnValue = new SCARD_READERSTATE
            {
                szReader       = name,
                dwCurrentState = (uint)SCardReaderEventState.SCARD_STATE_UNAWARE
            };

            return(returnValue);
        }
Пример #7
0
        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.");
        }
    }
Пример #9
0
        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);
        }
Пример #10
0
        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);
        }
Пример #11
0
        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);
        }
Пример #12
0
        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);
        }
Пример #13
0
        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);
        }
Пример #14
0
 //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);
Пример #15
0
 public static extern int SCardGetStatusChange(int hContext, int TimeOut, ref SCARD_READERSTATE ReaderState, int ReaderCount);
Пример #16
0
        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;
        }
Пример #17
0
        private static extern int SCardGetStatusChange(IntPtr hContext, 
	                                                   uint dwTimeout, 
	                                               ref SCARD_READERSTATE rgReaderStates,
	                                                   int cReaders);
Пример #18
0
 private bool SCardGetStatusChange(
     SCARD_READERSTATE[] readerState,
     int timeout = INFINITE
     )
 {
     return SCardGetStatusChange(
         this.Context, timeout,
         readerState, readerState.Length
         ) == SCARD_S_SUCCESS;
 }
Пример #19
0
        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;
                    }
                }
            }
        }
Пример #20
0
        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;
        }
Пример #21
0
 private static extern int SCardGetStatusChange(IntPtr hContext,
                                                uint dwTimeout,
                                                ref SCARD_READERSTATE rgReaderStates,
                                                int cReaders);
Пример #22
0
        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);
                }
            }
        }
Пример #23
0
 static extern Result SCardGetStatusChange(
     IntPtr context,
     int dwTimeOut,
     ref SCARD_READERSTATE rgReaderState,
     int cReaders);