SCardTransmit (winscard)
Last changed: -88.98.38.185

.
Summary
The SCardTransmit function sends a service request to the smart card and expects to receive data back from the card.

C# Signature:

[DllImport("winscard.dll")]
static extern int SCardTransmit(int hCard, IntPtr pioSendPci, byte[] pbSendBuffer, int cbSendLength, SCARD_IO_REQUEST pioRecvPci,
        byte[] pbRecvBuffer, ref int pcbRecvLength);

User-Defined Types:

None.

Notes:

None.

Tips & Tricks:

One may Get the SCARD_IO_REQUEST values which are defined as pointer to initialised data export in WinSCard.dll using the LoadLibrary and GetProcAddress pair.

If you use a struct rather than a class for SCARD_IO_REQUEST, don't forget to add "ref" to the pioRecvPci parameter in the signature. Alternatively, if you don't care about the returned protocol control information, change the pioRecvPci parameter to an "IntPtr" and pass "IntPtr.Zero" in as this parameter

Sample Code:

// Paste here code for SCardEstablishContext, SCardConnect

[StructLayout(LayoutKind.Sequential)]
internal class SCARD_IO_REQUEST
   {
    internal uint dwProtocol;
    internal int cbPciLength;
    public SCARD_IO_REQUEST()
      {
    dwProtocol = 0;
      }
   }

[DllImport("kernel32.dll", SetLastError=true)]
private extern static IntPtr LoadLibrary(string lpFileName);

[DllImport("kernel32.dll")]
private extern static void FreeLibrary(IntPtr handle) ;

[DllImport("kernel32.dll")]
private extern static IntPtr GetProcAddress(IntPtr handle, string
procName);

//Get the address of Pci from "Winscard.dll".
private static IntPtr GetPciT0()
{
IntPtr handle = LoadLibrary("Winscard.dll") ;
IntPtr pci = GetProcAddress(handle, "g_rgSCardT0Pci") ;
FreeLibrary(handle) ;
return pci ;
}

SCARD_IO_REQUEST ioRecv = new SCARD_IO_REQUEST();
byte[] pbRecvBuffer=new byte [255];
int pcbRecvLength=255;
byte[] pbSendBuffer = { 0xC0, 0xA4, 0x00, 0x00, 0x02, 0x3F, 0x00 }; // Example Cla,Ins,P1,P2,P3,DataIN (Select MF)
int cbSendLength=pbSendBuffer.Length;
ioRecv.cbPciLength = 255;
IntPtr SCARD_PCI_T0 = PCSC.GetPciT0();
uint errors=SCardTransmit(nCard, SCARD_PCI_T0, pbSendBuffer, cbSendLength, ioRecv, pbRecvBuffer, ref pcbRecvLength);

// Paste here code for SCardDisconnect, pbRecvBuffer contains Answer as Byte[]

Alternative Managed API:

TODO

Documentation