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