/// <summary> /// This function must implement a card detection mechanism. /// /// When card insertion is detected, it must call the method CardInserted() /// When card removal is detected, it must call the method CardRemoved() /// /// </summary> protected override void RunCardDetection(object Reader) { bool bFirstLoop = true; UInt32 hContext = 0; // Local context IntPtr phContext; phContext = Marshal.AllocHGlobal(Marshal.SizeOf(hContext)); if (SCardEstablishContext((uint)SCOPE.User, IntPtr.Zero, IntPtr.Zero, phContext) == 0) { hContext = (uint)Marshal.ReadInt32(phContext); Marshal.FreeHGlobal(phContext); UInt32 nbReaders = 1; SCard_ReaderState[] readerState = new SCard_ReaderState[nbReaders]; readerState[0].m_dwCurrentState = (UInt32)CARD_STATE.UNAWARE; readerState[0].m_szReader = (string)Reader; UInt32 eventState; UInt32 currentState = readerState[0].m_dwCurrentState; // Card detection loop do { if (SCardGetStatusChange(hContext, WAIT_TIME , readerState, nbReaders) == 0) { eventState = readerState[0].m_dwEventState; currentState = readerState[0].m_dwCurrentState; // Check state if (((eventState & (uint)CARD_STATE.CHANGED) == (uint)CARD_STATE.CHANGED) && !bFirstLoop) { // State has changed if ((eventState & (uint)CARD_STATE.EMPTY) == (uint)CARD_STATE.EMPTY) { // There is no card, card has been removed -> Fire CardRemoved event CardRemoved(); } if (((eventState & (uint)CARD_STATE.PRESENT) == (uint)CARD_STATE.PRESENT) && ((eventState & (uint)CARD_STATE.PRESENT) != (currentState & (uint)CARD_STATE.PRESENT))) { // There is a card in the reader -> Fire CardInserted event CardInserted(); } if ((eventState & (uint)CARD_STATE.ATRMATCH) == (uint)CARD_STATE.ATRMATCH) { // There is a card in the reader and it matches the ATR we were expecting-> Fire CardInserted event CardInserted(); } } // The current stateis now the event state readerState[0].m_dwCurrentState = eventState; bFirstLoop = false; } Thread.Sleep(100); if (m_bRunCardDetection == false) { break; } }while (true); // Exit on request } else { Marshal.FreeHGlobal(phContext); throw new Exception("PC/SC error"); } SCardReleaseContext(hContext); }
/// <summary> /// This function must implement a card detection mechanism. /// /// When card insertion is detected, it must call the method CardInserted() /// When card removal is detected, it must call the method CardRemoved() /// /// </summary> protected override void RunCardDetection(object Reader) { bool bFirstLoop = true; UInt32 hContext = 0; // Local context IntPtr phContext; phContext = Marshal.AllocHGlobal(Marshal.SizeOf(hContext)); if (SCardEstablishContext((uint) SCOPE.User, IntPtr.Zero, IntPtr.Zero, phContext) == 0) { hContext = (uint)Marshal.ReadInt32(phContext); Marshal.FreeHGlobal(phContext); UInt32 nbReaders = 1; SCard_ReaderState[] readerState = new SCard_ReaderState[nbReaders]; readerState[0].m_dwCurrentState = (UInt32) CARD_STATE.UNAWARE; readerState[0].m_szReader = (string)Reader; UInt32 eventState; UInt32 currentState = readerState[0].m_dwCurrentState; // Card detection loop do { if (SCardGetStatusChange(hContext, WAIT_TIME , readerState, nbReaders) == 0) { eventState = readerState[0].m_dwEventState; currentState = readerState[0].m_dwCurrentState; // Check state if (((eventState & (uint) CARD_STATE.CHANGED) == (uint) CARD_STATE.CHANGED) && !bFirstLoop) { // State has changed if ((eventState & (uint) CARD_STATE.EMPTY) == (uint) CARD_STATE.EMPTY) { // There is no card, card has been removed -> Fire CardRemoved event CardRemoved(); } if (((eventState & (uint)CARD_STATE.PRESENT) == (uint)CARD_STATE.PRESENT) && ((eventState & (uint) CARD_STATE.PRESENT) != (currentState & (uint) CARD_STATE.PRESENT))) { // There is a card in the reader -> Fire CardInserted event CardInserted(); } if ((eventState & (uint) CARD_STATE.ATRMATCH) == (uint) CARD_STATE.ATRMATCH) { // There is a card in the reader and it matches the ATR we were expecting-> Fire CardInserted event CardInserted(); } } // The current stateis now the event state readerState[0].m_dwCurrentState = eventState; bFirstLoop = false; } Thread.Sleep(100); if (m_bRunCardDetection == false) break; } while (true); // Exit on request } else { Marshal.FreeHGlobal(phContext); throw new Exception("PC/SC error"); } SCardReleaseContext(hContext); }