[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