public static List <string> ListModWinsCards()
        {
            int           _context = -1;
            List <string> lst      = new List <string>();
            int           retCode  = ModWinsCard.SCardEstablishContext(ModWinsCard.SCARD_SCOPE_USER, 0, 0, ref _context);

            if (retCode != ModWinsCard.SCARD_S_SUCCESS)
            {
                return(null);
            }
            if (_context == -1)
            {
                return(null);
            }
            int readerCount = 255;

            Byte[] bytes = new Byte[readerCount];

            retCode = ModWinsCard.SCardListReaders(_context, null, bytes, ref readerCount);
            if (retCode != ModWinsCard.SCARD_S_SUCCESS)
            {
                return(null);
            }

            try
            {
                string[] readerArr = System.Text.ASCIIEncoding.ASCII.GetString(bytes, 0, readerCount).Split('\0');
                foreach (string readerName in readerArr)
                {
                    if (!string.IsNullOrEmpty(readerName) && readerName.Length > 1)
                    {
                        // http://stackoverflow.com/questions/6940824/getting-pcsc-reader-serial-number-with-winscard
                        int readerHandle = 0;

                        int protocol = 0;
                        int ret      = ModWinsCard.SCardConnect(_context, readerName, ModWinsCard.SCARD_SHARE_DIRECT, ModWinsCard.SCARD_PROTOCOL_UNDEFINED, ref readerHandle, ref protocol);

                        byte[] data = new byte[128];
                        int    leng = 128;
                        ret = ModWinsCard.SCardGetAttrib(readerHandle, ModWinsCard.SCARD_ATTR_VENDOR_IFD_SERIAL_NO, data, ref leng);

                        string serialNo = System.Text.ASCIIEncoding.ASCII.GetString(data, 0, leng);

                        //int b = ModWinsCard.SCardFreeMemory(_context, data);

                        ModWinsCard.SCardDisconnect(readerHandle, ModWinsCard.SCARD_LEAVE_CARD);

                        lst.Add(serialNo);
                    }
                }
            }
            catch
            {
                return(null);
            }
            return(lst);
        }
        private void GetSerialNumber(string ModWinsDeviceName, Action <string, bool> complete)
        {
            if (!string.IsNullOrEmpty(ModWinsDeviceName) && ModWinsDeviceName.Length > 1)
            {
                // http://stackoverflow.com/questions/6940824/getting-pcsc-reader-serial-number-with-winscard
                int readerHandle = 0;

                int protocol = 0;
                int ret      = ModWinsCard.SCardConnect(_context, ModWinsDeviceName, ModWinsCard.SCARD_SHARE_DIRECT, ModWinsCard.SCARD_PROTOCOL_UNDEFINED, ref readerHandle, ref protocol);

                byte[] data = new byte[128];
                int    leng = 128;
                ret = ModWinsCard.SCardGetAttrib(readerHandle, ModWinsCard.SCARD_ATTR_VENDOR_IFD_SERIAL_NO, data, ref leng);

                string serialNo = System.Text.ASCIIEncoding.ASCII.GetString(data, 0, leng);

                //int b = ModWinsCard.SCardFreeMemory(_context, data);

                ModWinsCard.SCardDisconnect(readerHandle, ModWinsCard.SCARD_LEAVE_CARD);

                if (complete != null)
                {
                    if (ret != ModWinsCard.SCARD_S_SUCCESS)
                    {
                        complete(string.Empty, false);
                    }
                    else
                    {
                        complete(serialNo, true);
                    }
                }
            }
            else
            {
                complete(string.Empty, false);
            }
        }