[Pcsclite-cvs-commit] r5910 - in /trunk/PCSC/src: Makefile.am pcsc-spy.c pcsc-spy.py

rousseau at users.alioth.debian.org rousseau at users.alioth.debian.org
Thu Aug 25 08:40:40 UTC 2011


Author: rousseau
Date: Thu Aug 25 08:40:39 2011
New Revision: 5910

URL: http://svn.debian.org/wsvn/pcsclite/?sc=1&rev=5910
Log:
PC/SC function spy layer

Added:
    trunk/PCSC/src/pcsc-spy.c
    trunk/PCSC/src/pcsc-spy.py   (with props)
Modified:
    trunk/PCSC/src/Makefile.am

Modified: trunk/PCSC/src/Makefile.am
URL: http://svn.debian.org/wsvn/pcsclite/trunk/PCSC/src/Makefile.am?rev=5910&op=diff
==============================================================================
--- trunk/PCSC/src/Makefile.am (original)
+++ trunk/PCSC/src/Makefile.am Thu Aug 25 08:40:39 2011
@@ -3,7 +3,7 @@
 AM_CPPFLAGS = -I$(top_srcdir)/src/PCSC -I$(top_builddir)/src/PCSC \
 	$(SYMBOL_VISIBILITY)
 
-lib_LTLIBRARIES = libpcsclite.la
+lib_LTLIBRARIES = libpcsclite.la libpcscspy.la
 
 sbin_PROGRAMS = pcscd
 noinst_PROGRAMS = testpcsc pcsc-wirecheck pcsc-wirecheck-gen
@@ -19,6 +19,10 @@
 	hotplug_linux.c \
 	hotplug_macosx.c
 endif
+
+libpcscspy_la_SOURCES = \
+	pcsc-spy.c
+libpcscspy_la_LIBADD = -ldl
 
 libpcsclite_la_SOURCES = \
 	debug.c \

Added: trunk/PCSC/src/pcsc-spy.c
URL: http://svn.debian.org/wsvn/pcsclite/trunk/PCSC/src/pcsc-spy.c?rev=5910&op=file
==============================================================================
--- trunk/PCSC/src/pcsc-spy.c (added)
+++ trunk/PCSC/src/pcsc-spy.c Thu Aug 25 08:40:39 2011
@@ -1,0 +1,580 @@
+/*
+    Log PC/SC arguments
+    Copyright (C) 2001  Ludovic Rousseau
+
+    This program is free software: you can redistribute it and/or modify
+    it under the terms of the GNU General Public License as published by
+    the Free Software Foundation, either version 3 of the License, or
+    (at your option) any later version.
+
+    This program is distributed in the hope that it will be useful,
+    but WITHOUT ANY WARRANTY; without even the implied warranty of
+    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+    GNU General Public License for more details.
+
+    You should have received a copy of the GNU General Public License
+    along with this program.  If not, see <http://www.gnu.org/licenses/>.
+*/
+
+/* $Id$ */
+
+#include <dlfcn.h>
+#include <stdio.h>
+#include <stdarg.h>
+#include <fcntl.h>
+#include <stdlib.h>
+#include <errno.h>
+#include <string.h>
+#include <unistd.h>
+
+#include "misc.h"
+#include <winscard.h>
+
+#define VERSION 1
+
+#define DEBUG
+
+/* function prototypes */
+
+#define p_SCardEstablishContext(fct) LONG(fct)(DWORD dwScope, LPCVOID pvReserved1, LPCVOID pvReserved2, LPSCARDCONTEXT phContext)
+
+#define p_SCardReleaseContext(fct) LONG(fct)(SCARDCONTEXT hContext)
+
+#define p_SCardIsValidContext(fct) LONG(fct) (SCARDCONTEXT hContext)
+
+#define p_SCardConnect(fct) LONG(fct) (SCARDCONTEXT hContext, LPCSTR szReader, DWORD dwShareMode, DWORD dwPreferredProtocols, LPSCARDHANDLE phCard, LPDWORD pdwActiveProtocol)
+
+#define p_SCardReconnect(fct) LONG(fct) (SCARDHANDLE hCard, DWORD dwShareMode, DWORD dwPreferredProtocols, DWORD dwInitialization, LPDWORD pdwActiveProtocol)
+
+#define p_SCardDisconnect(fct) LONG(fct) (SCARDHANDLE hCard, DWORD dwDisposition)
+
+#define p_SCardBeginTransaction(fct) LONG(fct) (SCARDHANDLE hCard)
+
+#define p_SCardEndTransaction(fct) LONG(fct) (SCARDHANDLE hCard, DWORD dwDisposition)
+
+#define p_SCardStatus(fct) LONG(fct) (SCARDHANDLE hCard, LPSTR mszReaderName, LPDWORD pcchReaderLen, LPDWORD pdwState, LPDWORD pdwProtocol, LPBYTE pbAtr, LPDWORD pcbAtrLen)
+
+#define p_SCardGetStatusChange(fct) LONG(fct) (SCARDCONTEXT hContext, DWORD dwTimeout, LPSCARD_READERSTATE rgReaderStates, DWORD cReaders)
+
+#define p_SCardControl(fct) LONG(fct) (SCARDHANDLE hCard, DWORD dwControlCode, LPCVOID pbSendBuffer, DWORD cbSendLength, LPVOID pbRecvBuffer, DWORD cbRecvLength, LPDWORD lpBytesReturned)
+
+#define p_SCardTransmit(fct) LONG(fct) (SCARDHANDLE hCard, const SCARD_IO_REQUEST * pioSendPci, LPCBYTE pbSendBuffer, DWORD cbSendLength, SCARD_IO_REQUEST * pioRecvPci, LPBYTE pbRecvBuffer, LPDWORD pcbRecvLength)
+
+#define p_SCardListReaderGroups(fct) LONG(fct) (SCARDCONTEXT hContext, LPSTR mszGroups, LPDWORD pcchGroups)
+
+#define p_SCardListReaders(fct) LONG(fct) (SCARDCONTEXT hContext, LPCSTR mszGroups, LPSTR mszReaders, LPDWORD pcchReaders)
+
+#define p_SCardFreeMemory(fct) LONG(fct) (SCARDCONTEXT hContext, LPCVOID pvMem)
+
+#define p_SCardCancel(fct) LONG(fct) (SCARDCONTEXT hContext)
+
+#define p_SCardGetAttrib(fct) LONG(fct) (SCARDHANDLE hCard, DWORD dwAttrId, LPBYTE pbAttr, LPDWORD pcbAttrLen)
+
+#define p_SCardSetAttrib(fct) LONG(fct) (SCARDHANDLE hCard, DWORD dwAttrId, LPCBYTE pbAttr, DWORD cbAttrLen)
+
+/* fake function to just return en error code */
+static LONG internal_error(void)
+{
+	return SCARD_F_INTERNAL_ERROR;
+}
+
+/* contains pointers to real functions */
+static struct
+{
+	p_SCardEstablishContext(*SCardEstablishContext);
+	p_SCardReleaseContext(*SCardReleaseContext);
+	p_SCardIsValidContext(*SCardIsValidContext);
+	p_SCardConnect(*SCardConnect);
+	p_SCardReconnect(*SCardReconnect);
+	p_SCardDisconnect(*SCardDisconnect);
+	p_SCardBeginTransaction(*SCardBeginTransaction);
+	p_SCardEndTransaction(*SCardEndTransaction);
+	p_SCardStatus(*SCardStatus);
+	p_SCardGetStatusChange(*SCardGetStatusChange);
+	p_SCardControl(*SCardControl);
+	p_SCardTransmit(*SCardTransmit);
+	p_SCardListReaderGroups(*SCardListReaderGroups);
+	p_SCardListReaders(*SCardListReaders);
+	p_SCardFreeMemory(*SCardFreeMemory);
+	p_SCardCancel(*SCardCancel);
+	p_SCardGetAttrib(*SCardGetAttrib);
+	p_SCardSetAttrib(*SCardSetAttrib);
+} spy = {
+	/* initialized with the fake internal_error() function */
+	.SCardEstablishContext = (p_SCardEstablishContext(*))internal_error,
+	.SCardReleaseContext = (p_SCardReleaseContext(*))internal_error,
+	.SCardIsValidContext = (p_SCardIsValidContext(*))internal_error,
+	.SCardConnect = (p_SCardConnect(*))internal_error,
+	.SCardReconnect = (p_SCardReconnect(*))internal_error,
+	.SCardDisconnect = (p_SCardDisconnect(*))internal_error,
+	.SCardBeginTransaction = (p_SCardBeginTransaction(*))internal_error,
+	.SCardEndTransaction = (p_SCardEndTransaction(*))internal_error,
+	.SCardStatus = (p_SCardStatus(*))internal_error,
+	.SCardGetStatusChange = (p_SCardGetStatusChange(*))internal_error,
+	.SCardControl = (p_SCardControl(*))internal_error,
+	.SCardTransmit = (p_SCardTransmit(*))internal_error,
+	.SCardListReaderGroups = (p_SCardListReaderGroups(*))internal_error,
+	.SCardListReaders = (p_SCardListReaders(*))internal_error,
+	.SCardFreeMemory = (p_SCardFreeMemory(*))internal_error,
+	.SCardCancel = (p_SCardCancel(*))internal_error,
+	.SCardGetAttrib = (p_SCardGetAttrib(*))internal_error,
+	.SCardSetAttrib = (p_SCardSetAttrib(*))internal_error
+};
+
+#define LOG log_line("%s:%d", __FILE__, __LINE__)
+
+#define Enter() spy_line("> %s", __FUNCTION__);
+#define Quit() spy_line("< %s: %s (0x%08X)", __FUNCTION__, pcsc_stringify_error(rv), rv)
+
+static int Log_fd = -1;
+
+#ifdef DEBUG
+static void log_line(const char *fmt, ...)
+{
+	va_list args;
+
+	va_start(args, fmt);
+	vprintf(fmt, args);
+	printf("\n");
+	va_end(args);
+}
+#else
+static void log_line(const char *fmt, ...)
+{
+}
+#endif
+
+static void spy_line(const char *fmt, ...)
+{
+	va_list args;
+	char line[256];
+	int size;
+
+	/* spying disabled */
+	if (Log_fd < 0)
+		return;
+
+	va_start(args, fmt);
+	size = vsnprintf(line, sizeof line, fmt, args);
+	write(Log_fd, line, size);
+	write(Log_fd, "\n", 1);
+	va_end(args);
+}
+
+static void spy_long(long arg)
+{
+	spy_line("0x%08lX", arg);
+}
+
+static void spy_ptr_long(long *arg)
+{
+	if (arg)
+		spy_line("0x%08lX", *arg);
+	else
+		spy_line("NULL");
+}
+
+static void spy_ptr_ulong(unsigned long *arg)
+{
+	if (arg)
+		spy_line("0x%08lX", *arg);
+	else
+		spy_line("NULL");
+}
+
+static void spy_pvoid(const void *ptr)
+{
+    spy_line("%p", ptr);
+}
+
+static void spy_buffer(const unsigned char *buffer, size_t length)
+{
+    char log_buffer[length * 3 +1], *p;
+
+    if (NULL == buffer)
+        spy_line("NULL");
+    else
+    {
+        size_t i;
+        p = log_buffer;
+        for (i=0; i<length; i++)
+        {
+            snprintf(p, 4, "%02X ", buffer[i]);
+            p += 3;
+        }
+        spy_line(log_buffer);
+    }
+}
+
+static void spy_str(const char *str)
+{
+    spy_line("%s", str);
+}
+
+static void spy_n_str(const char *str, unsigned long *len, int autoallocate)
+{
+    spy_ptr_ulong(len);
+    if (NULL == len)
+    {
+        spy_line("\"\"");
+    }
+    else
+    {
+        if (NULL == str)
+        {
+            spy_line("NULL");
+        }
+        else
+        {
+            if (autoallocate)
+            {
+                const char *s;
+
+                s = *(char **)str;
+                spy_line("%s", s);
+            }
+            else
+            {
+                spy_line("%s", str);
+            }
+        }
+    }
+}
+
+static LONG load_lib(void)
+{
+	void *handle;
+
+#define LIBPCSC "/usr/lib/libpcsclite.so.1"
+	handle = dlopen(LIBPCSC, RTLD_LAZY);
+	if (NULL == handle)
+	{
+		spy_line("%s", dlerror());
+		return SCARD_F_INTERNAL_ERROR;
+	}
+
+#define get_symbol(s) spy.s = dlsym(handle, #s)
+	get_symbol(SCardEstablishContext);
+	get_symbol(SCardReleaseContext);
+	get_symbol(SCardIsValidContext);
+	get_symbol(SCardConnect);
+	get_symbol(SCardReconnect);
+	get_symbol(SCardDisconnect);
+	get_symbol(SCardBeginTransaction);
+	get_symbol(SCardEndTransaction);
+	get_symbol(SCardStatus);
+	get_symbol(SCardGetStatusChange);
+	get_symbol(SCardControl);
+	get_symbol(SCardTransmit);
+	get_symbol(SCardListReaderGroups);
+	get_symbol(SCardListReaders);
+	get_symbol(SCardFreeMemory);
+	get_symbol(SCardCancel);
+	get_symbol(SCardGetAttrib);
+	get_symbol(SCardSetAttrib);
+
+	dlclose(handle);
+
+	return SCARD_S_SUCCESS;
+}
+
+
+/* exported functions */
+PCSC_API p_SCardEstablishContext(SCardEstablishContext)
+{
+	LONG rv;
+	static int init = 0;
+
+	if (!init)
+	{
+		const char *home;
+		char log_pipe[128];
+
+		init = 1;
+
+		/* load the real library */
+		load_lib();
+
+		/* check if we can log */
+		home = getenv("HOME");
+		if (NULL == home)
+			home = "/tmp";
+
+		snprintf(log_pipe, sizeof log_pipe, "%s/pcsc-spy", home);
+		Log_fd = open(log_pipe, O_WRONLY);
+		if (Log_fd < 0)
+		{
+			log_line("open %s failed: %s", log_pipe, strerror(errno));
+		}
+		else
+			spy_line("PCSC SPY VERSION: %d", VERSION);
+	}
+
+	Enter();
+	spy_long(dwScope);
+	rv = spy.SCardEstablishContext(dwScope, pvReserved1, pvReserved2,
+		phContext);
+	spy_ptr_long(phContext);
+	Quit();
+	return rv;
+}
+
+PCSC_API p_SCardReleaseContext(SCardReleaseContext)
+{
+	LONG rv;
+
+	Enter();
+	spy_long(hContext);
+	rv = spy.SCardReleaseContext(hContext);
+	Quit();
+	return rv;
+}
+
+PCSC_API p_SCardIsValidContext(SCardIsValidContext)
+{
+	LONG rv;
+
+	Enter();
+	spy_long(hContext);
+	rv = spy.SCardIsValidContext(hContext);
+	Quit();
+	return rv;
+}
+
+PCSC_API p_SCardConnect(SCardConnect)
+{
+	LONG rv;
+
+	Enter();
+	spy_long(hContext);
+    spy_str(szReader);
+    spy_long(dwShareMode);
+    spy_long(dwPreferredProtocols);
+    spy_ptr_long(phCard);
+    spy_ptr_ulong(pdwActiveProtocol);
+	rv = spy.SCardConnect(hContext, szReader, dwShareMode,
+		dwPreferredProtocols, phCard, pdwActiveProtocol);
+    spy_ptr_long(phCard);
+    spy_ptr_ulong(pdwActiveProtocol);
+	Quit();
+	return rv;
+}
+
+PCSC_API p_SCardReconnect(SCardReconnect)
+{
+	LONG rv;
+
+	Enter();
+	spy_long(hCard);
+    spy_long(dwShareMode);
+    spy_long(dwPreferredProtocols);
+    spy_long(dwInitialization);
+	rv = spy.SCardReconnect(hCard, dwShareMode, dwPreferredProtocols,
+		dwInitialization, pdwActiveProtocol);
+    spy_ptr_ulong(pdwActiveProtocol);
+	Quit();
+	return rv;
+}
+
+PCSC_API p_SCardDisconnect(SCardDisconnect)
+{
+	LONG rv;
+
+	Enter();
+	spy_long(hCard);
+    spy_long(dwDisposition);
+	rv = spy.SCardDisconnect(hCard, dwDisposition);
+	Quit();
+	return rv;
+}
+
+PCSC_API p_SCardBeginTransaction(SCardBeginTransaction)
+{
+	LONG rv;
+
+	Enter();
+	rv = spy.SCardBeginTransaction(hCard);
+	Quit();
+	return rv;
+}
+
+PCSC_API p_SCardEndTransaction(SCardEndTransaction)
+{
+	LONG rv;
+
+	Enter();
+	rv = spy.SCardEndTransaction(hCard, dwDisposition);
+	Quit();
+	return rv;
+}
+
+PCSC_API p_SCardStatus(SCardStatus)
+{
+	LONG rv;
+    int autoallocate_ReaderName = 0, autoallocate_Atr = 0;
+
+    if (pcchReaderLen)
+        autoallocate_ReaderName = *pcchReaderLen == SCARD_AUTOALLOCATE;
+
+    if (pcbAtrLen)
+        autoallocate_Atr = *pcbAtrLen == SCARD_AUTOALLOCATE;
+
+	Enter();
+	spy_long(hCard);
+    spy_ptr_ulong(pcchReaderLen);
+    spy_ptr_ulong(pcbAtrLen);
+	rv = spy.SCardStatus(hCard, mszReaderName, pcchReaderLen, pdwState,
+		pdwProtocol, pbAtr, pcbAtrLen);
+    spy_n_str(mszReaderName, pcchReaderLen, autoallocate_ReaderName);
+    spy_ptr_ulong(pdwState);
+    spy_ptr_ulong(pdwProtocol);
+    if (NULL == pcbAtrLen)
+        spy_line("NULL");
+    else
+    {
+        if (autoallocate_Atr)
+        {
+            const unsigned char *b = *(unsigned char **)pbAtr;
+
+            spy_buffer(b, *pcbAtrLen);
+        }
+        else
+            spy_buffer(pbAtr, *pcbAtrLen);
+    }
+	Quit();
+	return rv;
+}
+
+PCSC_API p_SCardGetStatusChange(SCardGetStatusChange)
+{
+	LONG rv;
+
+	Enter();
+	spy_long(hContext);
+    spy_long(dwTimeout);
+    spy_long(cReaders);
+	rv = spy.SCardGetStatusChange(hContext, dwTimeout, rgReaderStates,
+		cReaders);
+	Quit();
+	return rv;
+}
+
+PCSC_API p_SCardControl(SCardControl)
+{
+	LONG rv;
+
+	Enter();
+	spy_long(hCard);
+    spy_long(dwControlCode);
+    spy_buffer(pbSendBuffer, cbSendLength);
+	rv = spy.SCardControl(hCard, dwControlCode, pbSendBuffer, cbSendLength,
+		pbRecvBuffer, cbRecvLength, lpBytesReturned);
+    if (lpBytesReturned)
+        spy_buffer(pbRecvBuffer, *lpBytesReturned);
+    else
+        spy_line("NULL");
+	Quit();
+	return rv;
+}
+
+PCSC_API p_SCardTransmit(SCardTransmit)
+{
+	LONG rv;
+
+	Enter();
+	spy_long(hCard);
+    spy_buffer(pbSendBuffer, cbSendLength);
+	rv = spy.SCardTransmit(hCard, pioSendPci, pbSendBuffer, cbSendLength,
+		pioRecvPci, pbRecvBuffer, pcbRecvLength);
+    if (pcbRecvLength)
+        spy_buffer(pbRecvBuffer, *pcbRecvLength);
+    else
+        spy_line("NULL");
+	Quit();
+	return rv;
+}
+
+PCSC_API p_SCardListReaderGroups(SCardListReaderGroups)
+{
+	LONG rv;
+    int autoallocate = 0;
+    
+    if (pcchGroups)
+        autoallocate = *pcchGroups == SCARD_AUTOALLOCATE;
+
+	Enter();
+	spy_long(hContext);
+	spy_ptr_ulong(pcchGroups);
+	rv = spy.SCardListReaderGroups(hContext, mszGroups, pcchGroups);
+    spy_n_str(mszGroups, pcchGroups, autoallocate);
+	Quit();
+	return rv;
+}
+
+PCSC_API p_SCardListReaders(SCardListReaders)
+{
+	LONG rv;
+    int autoallocate = 0;
+    
+    if (pcchReaders)
+        autoallocate = *pcchReaders == SCARD_AUTOALLOCATE;
+
+	Enter();
+	spy_long(hContext);
+    spy_str(mszGroups);
+	rv = spy.SCardListReaders(hContext, mszGroups, mszReaders, pcchReaders);
+    spy_n_str(mszReaders, pcchReaders, autoallocate);
+	Quit();
+	return rv;
+}
+
+PCSC_API p_SCardFreeMemory(SCardFreeMemory)
+{
+	LONG rv;
+
+	Enter();
+	spy_long(hContext);
+    spy_pvoid(pvMem);
+	rv = spy.SCardFreeMemory(hContext, pvMem);
+	Quit();
+	return rv;
+}
+
+PCSC_API p_SCardCancel(SCardCancel)
+{
+	LONG rv;
+
+	Enter();
+	rv = spy.SCardCancel(hContext);
+	Quit();
+	return rv;
+}
+
+PCSC_API p_SCardGetAttrib(SCardGetAttrib)
+{
+	LONG rv;
+
+	Enter();
+	spy_long(hCard);
+    spy_long(dwAttrId);
+	rv = spy.SCardGetAttrib(hCard, dwAttrId, pbAttr, pcbAttrLen);
+    if (NULL == pcbAttrLen)
+        spy_line("NULL");
+    else
+        spy_buffer(pbAttr, *pcbAttrLen);
+	Quit();
+	return rv;
+}
+
+PCSC_API p_SCardSetAttrib(SCardSetAttrib)
+{
+	LONG rv;
+
+	Enter();
+	spy_long(hCard);
+    spy_long(dwAttrId);
+    spy_buffer(pbAttr, cbAttrLen);
+	rv = spy.SCardSetAttrib(hCard, dwAttrId, pbAttr, cbAttrLen);
+	Quit();
+	return rv;
+}

Added: trunk/PCSC/src/pcsc-spy.py
URL: http://svn.debian.org/wsvn/pcsclite/trunk/PCSC/src/pcsc-spy.py?rev=5910&op=file
==============================================================================
--- trunk/PCSC/src/pcsc-spy.py (added)
+++ trunk/PCSC/src/pcsc-spy.py Thu Aug 25 08:40:39 2011
@@ -1,0 +1,265 @@
+#! /usr/bin/env python
+
+#    Display PC/SC functions arguments
+#    Copyright (C) 2011  Ludovic Rousseau
+#
+#    This program is free software: you can redistribute it and/or modify
+#    it under the terms of the GNU General Public License as published by
+#    the Free Software Foundation, either version 3 of the License, or
+#    (at your option) any later version.
+#
+#    This program is distributed in the hope that it will be useful,
+#    but WITHOUT ANY WARRANTY; without even the implied warranty of
+#    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+#    GNU General Public License for more details.
+#
+#    You should have received a copy of the GNU General Public License
+#    along with this program.  If not, see <http://www.gnu.org/licenses/>.
+
+# $Id$
+
+import os
+import atexit
+import sys
+
+fifo = os.path.expanduser('~/pcsc-spy')
+
+color_red = "\x1b[01;31m"
+color_green = "\x1b[32m"
+color_blue = "\x1b[34m"
+color_magenta = "\x1b[35m"
+color_normal = "\x1b[0m"
+
+def cleanup():
+    os.unlink(fifo)
+
+def parse_rv(line):
+    (function, rv) = line.split(':')
+    if function[0] != '<':
+        raise Exception("Wrong line:", line)
+
+    return rv
+
+def log_rv(f):
+    line = f.readline().strip()
+    rv = parse_rv(line)
+    if not "0x00000000" in rv:
+        print color_red + " =>" + rv + color_normal
+    else:
+        print " =>", rv
+
+def log_in(line):
+    print color_green + " i " + line + color_normal
+
+def log_out(line):
+    print color_magenta + " o " + line + color_normal
+
+def log_in_hCard(f):
+    hContext = f.readline().strip()
+    log_in("hCard: %s" % hContext)
+
+def log_in_hContext(f):
+    hContext = f.readline().strip()
+    log_in("hContext: %s" % hContext)
+
+def log_out_hContext(f):
+    hContext = f.readline().strip()
+    log_out("hContext: %s" % hContext)
+
+def log_in2(header, f):
+    data = f.readline().strip()
+    log_in("%s %s" % (header, data))
+
+def log_out2(header, f):
+    data = f.readline().strip()
+    log_out("%s %s" % (header, data))
+
+def log_name(name):
+    print color_blue + name + color_normal
+
+def SCardEstablishContext(f):
+    log_name("SCardEstablishContext")
+    dwScope = f.readline().strip()
+    scopes = {0: 'SCARD_SCOPE_USER',
+            1: 'SCARD_SCOPE_TERMINAL',
+            2: 'SCARD_SCOPE_SYSTEM'}
+    log_in("dwScope: %s (%s)" % (scopes[int(dwScope, 16)], dwScope))
+    log_out_hContext(f)
+    log_rv(f)
+
+def SCardIsValidContext(f):
+    log_name("SCardIsValidContext")
+    log_in_hContext(f)
+    log_rv(f)
+
+def SCardReleaseContext(f):
+    log_name("SCardReleaseContext")
+    log_in_hContext(f)
+    log_rv(f)
+
+def SCardListReaders(f):
+    log_name("SCardListReaders")
+    log_in_hContext(f)
+    log_in2("mszGroups:", f)
+    log_out2("pcchReaders:", f)
+    log_out2("mszReaders:", f)
+    log_rv(f)
+
+def SCardListReaderGroups(f):
+    log_name("SCardListReaderGroups")
+    log_in_hContext(f)
+    log_in2("pcchGroups:", f)
+    log_out2("pcchGroups:", f)
+    log_out2("mszGroups:", f)
+    log_rv(f)
+
+def SCardGetStatusChange(f):
+    log_name("SCardGetStatusChange")
+    log_in_hContext(f)
+    log_in2("dwTimeout:", f)
+    log_in2("cReaders:", f)
+    log_rv(f)
+
+def SCardFreeMemory(f):
+    log_name("SCardFreeMemory")
+    log_in_hContext(f)
+    log_in2("pvMem:", f)
+    log_rv(f)
+
+def SCardConnect(f):
+    log_name("SCardConnect")
+    log_in_hContext(f)
+    log_in2("szReader", f)
+    log_in2("dwShareMode", f)
+    log_in2("dwPreferredProtocols", f)
+    log_in2("phCard", f)
+    log_in2("pdwActiveProtocol", f)
+    log_out2("phCard", f)
+    log_out2("pdwActiveProtocol", f)
+    log_rv(f)
+
+def SCardTransmit(f):
+    log_name("SCardTransmit")
+    log_in_hCard(f)
+    log_in2("bSendBuffer", f)
+    log_out2("bRecvBuffer", f)
+    log_rv(f)
+
+def SCardControl(f):
+    log_name("SCarControl")
+    log_in_hCard(f)
+    log_in2("dwControlCode", f)
+    log_in2("bSendBuffer", f)
+    log_out2("bRecvBuffer", f)
+    log_rv(f)
+
+def SCardGetAttrib(f):
+    log_name("SCardGetAttrib")
+    log_in_hCard(f)
+    log_in2("dwAttrId", f)
+    log_out2("bAttr", f)
+    log_rv(f)
+
+def SCardSetAttrib(f):
+    log_name("SCardSetAttrib")
+    log_in_hCard(f)
+    log_in2("dwAttrId", f)
+    log_in2("bAttr", f)
+    log_rv(f)
+
+def SCardStatus(f):
+    log_name("SCardStatus")
+    log_in_hCard(f)
+    log_in2("pcchReaderLen", f)
+    log_in2("pcbAtrLen", f)
+    log_out2("cchReaderLen", f)
+    log_out2("mszReaderName", f)
+    log_out2("dwState", f)
+    log_out2("dwProtocol", f)
+    log_out2("bAtr", f)
+    log_rv(f)
+
+def SCardReconnect(f):
+    log_name("SCardReconnect")
+    log_in_hCard(f)
+    log_in2("dwShareMode", f)
+    log_in2("dwPreferredProtocols", f)
+    log_in2("dwInitialization", f)
+    log_out2("dwActiveProtocol", f)
+    log_rv(f)
+
+def SCardDisconnect(f):
+    log_name("SCardDisconnect")
+    log_in_hCard(f)
+    log_in2("dwDisposition", f)
+    log_rv(f)
+
+def main():
+    # register clean up function
+    atexit.register(cleanup)
+
+    # create the FIFO file
+    try:
+        os.mkfifo(fifo)
+    except (OSError):
+        print "fifo %s already present. Reusing it." % fifo
+
+    f = open(fifo, 'r')
+    #f = sys.stdin
+
+    # check version
+    version = f.readline().strip()
+    if version != "PCSC SPY VERSION: 1":
+        print "Wrong version:", version
+        return
+
+    functions = {'SCardEstablishContext': SCardEstablishContext,
+            'SCardIsValidContext': SCardIsValidContext,
+            'SCardReleaseContext': SCardReleaseContext }
+
+    line = f.readline()
+    while line != '':
+        # Enter function?
+        if line[0] != '>':
+            print "Garbage: ", line
+        else:
+            # dispatch
+            fct = line[2:-1]
+            if fct == 'SCardEstablishContext':
+                SCardEstablishContext(f)
+            elif fct == 'SCardReleaseContext':
+                SCardReleaseContext(f)
+            elif fct == 'SCardIsValidContext':
+                SCardIsValidContext(f)
+            elif fct == 'SCardListReaderGroups':
+                SCardListReaderGroups(f)
+            elif fct == 'SCardFreeMemory':
+                SCardFreeMemory(f)
+            elif fct == 'SCardListReaders':
+                SCardListReaders(f)
+            elif fct == 'SCardGetStatusChange':
+                SCardGetStatusChange(f)
+            elif fct == 'SCardConnect':
+                SCardConnect(f)
+            elif fct == 'SCardTransmit':
+                SCardTransmit(f)
+            elif fct == 'SCardControl':
+                SCardControl(f)
+            elif fct == 'SCardGetAttrib':
+                SCardGetAttrib(f)
+            elif fct == 'SCardSetAttrib':
+                SCardSetAttrib(f)
+            elif fct == 'SCardStatus':
+                SCardStatus(f)
+            elif fct == 'SCardReconnect':
+                SCardReconnect(f)
+            elif fct == 'SCardDisconnect':
+                SCardDisconnect(f)
+            else:
+                print "Unknown function:", fct
+
+        line = f.readline()
+
+
+if __name__ == "__main__":
+    main()

Propchange: trunk/PCSC/src/pcsc-spy.py
------------------------------------------------------------------------------
    svn:executable = *




More information about the Pcsclite-cvs-commit mailing list