SCardListReaders (winscard)
Last changed: HussainAkbar@gmail.com-101.53.248.253

.
Summary
The SCardListReaders function provides the list of readers within a set of named reader groups, eliminating duplicates.

C# Signature:

  [DllImport(DllName, EntryPoint="SCardListReadersA", CharSet=CharSet.Ansi)]
    public static extern int SCardListReaders(
      int hContext,
      byte[] mszGroups,
      byte[] mszReaders,
      ref UInt32 pcchReaders
      );

User-Defined Types:

None.

Notes:

None.

Tips & Tricks:

if you invoke SCardListReaders with the hContext parameter set to null, you'll get the list of the installed readers (not the plugged ones !)

Sample Code:

long ret = 0;

int hContext;

Int32 pcchReaders = 0;

int nullindex = -1;

char nullchar = (char) 0;

ArrayList readersList = new ArrayList();

//establish context

ret = SCardEstablishContext(SCARD_SCOPE_USER,IntPtr.Zero,IntPtr.Zero,out hContext);

//get readers buffer len

ret = SCardListReaders(hContext,IntPtr.Zero,null,ref pcchReaders);

byte[] mszReaders = new byte[pcchReaders];

// fill readers' buffer

ret = SCardListReaders(hContext,IntPtr.Zero ,mszReaders, ref pcchReaders);

//fill readersList

//remember that readers is a multistring with a double trailing \0

// This is much easier and faster to do the allocation like this than the looping way

//ASCIIEncoding asc = new ASCIIEncoding();

//String[] Readers = asc.GetString( mszReaders ).Split( '\0' );

ASCIIEncoding ascii = new ASCIIEncoding();

string currbuff = ascii.GetString(mszReaders);

int len = pcchReaders;

while (currbuff[0]!=nullchar)

{

nullindex = currbuff.IndexOf(nullchar);   //get null end character
string reader = currbuff.Substring(0, nullindex);
readersList.Add(reader);
len = len-(reader.Length+1);
currbuff = currbuff.Substring(nullindex+1,len);            

}

ret = SCardReleaseContext(hContext);

Alternative Managed API:

TODO

Documentation