/[rdesktop]/sourceforge.net/trunk/rdesktop/scard.c
This is repository of my old source code which isn't updated any more. Go to git.rot13.org for current projects!
ViewVC logotype

Diff of /sourceforge.net/trunk/rdesktop/scard.c

Parent Directory Parent Directory | Revision Log Revision Log | View Patch Patch

revision 1319 by stargo, Thu Nov 2 20:48:28 2006 UTC revision 1421 by stargo, Tue Oct 30 13:09:37 2007 UTC
# Line 19  Line 19 
19  */  */
20    
21  #include <stdio.h>  #include <stdio.h>
 #include "rdesktop.h"  
22  #include <unistd.h>  #include <unistd.h>
23  #include <fcntl.h>  #include <fcntl.h>
24  #include <strings.h>  #include <strings.h>
25  #include <sys/types.h>  #include <sys/types.h>
26  #include <time.h>  #include <time.h>
27  #ifndef MAKE_PROTO  #ifndef MAKE_PROTO
28  #ifdef PCSC_OSX  #ifdef __APPLE__
29    #include <PCSC/wintypes.h>
30  #include <PCSC/pcsclite.h>  #include <PCSC/pcsclite.h>
31  #include <PCSC/winscard.h>  #include <PCSC/winscard.h>
32  #else  #else
33    #include <wintypes.h>
34  #include <pcsclite.h>  #include <pcsclite.h>
35  #include <winscard.h>  #include <winscard.h>
36  #endif /* PCSC_OSX */  #endif /* PCSC_OSX */
37    #include "rdesktop.h"
38  #include "scard.h"  #include "scard.h"
39    
40  /* variable segment */  /* variable segment */
# Line 40  Line 42 
42  #define SCARD_MAX_MEM 102400  #define SCARD_MAX_MEM 102400
43  #define SCARD_AUTOALLOCATE -1  #define SCARD_AUTOALLOCATE -1
44  #define OUT_STREAM_SIZE 4096  #define OUT_STREAM_SIZE 4096
 #define STREAM_COUNT 8  
45    
46  static struct stream out[STREAM_COUNT];  #ifdef B_ENDIAN
47  static int cur_stream_id = 0;  #define swap32(x)       ((((x) & 0xff) << 24) | (((x) & 0xff00) << 8) | \
48  static pthread_mutex_t *tcp_sendcontrol_mutex = NULL;                          (((x) & 0xff0000) >> 8) | (((x) & 0xff000000) >> 24))
49    
50    #define swap16(x)       ((((x) & 0xff) << 8) | (((x) & 0xff00) >> 8))
51    #else
52    #define swap32(x)       (x)
53    #define swap16(x)       (x)
54    #endif
55    
56    static pthread_mutex_t **scard_mutex = NULL;
57    
58  static uint32 curDevice = 0, curId = 0, curBytesOut = 0;  static uint32 curDevice = 0, curId = 0, curBytesOut = 0;
59  static PSCNameMapRec nameMapList = NULL;  static PSCNameMapRec nameMapList = NULL;
# Line 52  static int nameMapCount = 0; Line 61  static int nameMapCount = 0;
61    
62  static pthread_t queueHandler;  static pthread_t queueHandler;
63  static pthread_mutex_t queueAccess;  static pthread_mutex_t queueAccess;
64  static pthread_mutex_t queueEmpty;  static pthread_cond_t queueEmpty;
65  static pthread_mutex_t hcardAccess;  static pthread_mutex_t hcardAccess;
 /* static pthread_mutex_t sendControl; */  
66    
67  static PMEM_HANDLE threadListHandle = NULL;  static PMEM_HANDLE threadListHandle = NULL;
68  static PThreadListElement threadList = NULL;  static PThreadListElement threadList = NULL;
# Line 80  scardSetInfo(uint32 device, uint32 id, u Line 88  scardSetInfo(uint32 device, uint32 id, u
88    
89  #ifndef MAKE_PROTO  #ifndef MAKE_PROTO
90    
91  static NTSTATUS  static RD_NTSTATUS
92  scard_create(uint32 device_id, uint32 accessmask, uint32 sharemode, uint32 create_disposition,  scard_create(uint32 device_id, uint32 accessmask, uint32 sharemode, uint32 create_disposition,
93               uint32 flags_and_attributes, char *filename, NTHANDLE * phandle)               uint32 flags_and_attributes, char *filename, RD_NTHANDLE * phandle)
94  {  {
95          return STATUS_SUCCESS;          return RD_STATUS_SUCCESS;
96  }  }
97    
98  static NTSTATUS  static RD_NTSTATUS
99  scard_close(NTHANDLE handle)  scard_close(RD_NTHANDLE handle)
100  {  {
101          return STATUS_SUCCESS;          return RD_STATUS_SUCCESS;
102  }  }
103    
104  static NTSTATUS  static RD_NTSTATUS
105  scard_read(NTHANDLE handle, uint8 * data, uint32 length, uint32 offset, uint32 * result)  scard_read(RD_NTHANDLE handle, uint8 * data, uint32 length, uint32 offset, uint32 * result)
106  {  {
107          return STATUS_SUCCESS;          return RD_STATUS_SUCCESS;
108  }  }
109    
110  static NTSTATUS  static RD_NTSTATUS
111  scard_write(NTHANDLE handle, uint8 * data, uint32 length, uint32 offset, uint32 * result)  scard_write(RD_NTHANDLE handle, uint8 * data, uint32 length, uint32 offset, uint32 * result)
112  {  {
113          return STATUS_SUCCESS;          return RD_STATUS_SUCCESS;
114  }  }
115  #endif /* MAKE_PROTO */  #endif /* MAKE_PROTO */
116    
# Line 126  scard_enum_devices(uint32 * id, char *op Line 134  scard_enum_devices(uint32 * id, char *op
134          rv = SCardEstablishContext(SCARD_SCOPE_SYSTEM, NULL, NULL, &hContext);          rv = SCardEstablishContext(SCARD_SCOPE_SYSTEM, NULL, NULL, &hContext);
135          if (rv != SCARD_S_SUCCESS)          if (rv != SCARD_S_SUCCESS)
136          {          {
137                  error("[SMART CARD: PCSC service not available]\n");                  error("scard_enum_devices: PCSC service not available\n");
138                  return 0;                  return 0;
139          }          }
140          else          else
# Line 136  scard_enum_devices(uint32 * id, char *op Line 144  scard_enum_devices(uint32 * id, char *op
144    
145          if (0 != pthread_mutex_init(&queueAccess, NULL))          if (0 != pthread_mutex_init(&queueAccess, NULL))
146          {          {
147                  error("[SMART CARD: Can't initialize queue access mutex]\n");                  error("scard_enum_devices: Can't initialize queue access mutex\n");
148                  return 0;                  return 0;
149          }          }
150    
151          if (0 != pthread_mutex_init(&queueEmpty, NULL))          if (0 != pthread_cond_init(&queueEmpty, NULL))
152          {          {
153                  error("[SMART CARD: Can't initialize queue control mutex]\n");                  error("scard_enum_devices: Can't initialize queue control cv\n");
154                  return 0;                  return 0;
155          }          }
156    
157          if (0 != pthread_mutex_init(&hcardAccess, NULL))          if (0 != pthread_mutex_init(&hcardAccess, NULL))
158          {          {
159                  error("[SMART CARD: Can't initialize hcard list access mutex]\n");                  error("scard_enum_devices: Can't initialize hcard list access mutex\n");
160                  return 0;                  return 0;
161          }          }
162    
 #if 0  
         if (0 != pthread_mutex_init(&sendControl, NULL))  
         {  
                 error("[SMART CARD: Can't initialize send control mutex]\n");  
                 return 0;  
         }  
 #endif  
   
   
163          if (0 !=          if (0 !=
164              pthread_create(&queueHandler, NULL, (void *(*)(void *)) queue_handler_function, NULL))              pthread_create(&queueHandler, NULL, (void *(*)(void *)) queue_handler_function, NULL))
165          {          {
166                  error("[SMART CARD: Can't create queue handling Thread]\n");                  error("scard_enum_devices: Can't create queue handling Thread\n");
167                  return 0;                  return 0;
168          }          }
169    
# Line 233  scard_enum_devices(uint32 * id, char *op Line 232  scard_enum_devices(uint32 * id, char *op
232                  }                  }
233          }          }
234    
   
         printf("******************************************************\n");  
         printf("* Smart Card support for RDesktop is initialized.    *\n");  
         printf("* Copyright (C) by Alexi Volkov, alexi@myrealbox.com *\n");  
         printf("******************************************************\n");  
   
235          return count;          return count;
236  }  }
237    
# Line 497  outBufferFinish(STREAM out, char *buffer Line 490  outBufferFinish(STREAM out, char *buffer
490  }  }
491    
492  static void  static void
493  outForceAllignment(STREAM out, unsigned int seed)  outForceAlignment(STREAM out, unsigned int seed)
494  {  {
495          SERVER_DWORD add = (seed - (out->p - out->data) % seed) % seed;          SERVER_DWORD add = (seed - (out->p - out->data) % seed) % seed;
496          if (add > 0)          if (add > 0)
         {  
497                  out_uint8s(out, add);                  out_uint8s(out, add);
         }  
498  }  }
499    
500  static unsigned int  static unsigned int
501  inString(PMEM_HANDLE * handle, STREAM in, char **destination, SERVER_DWORD dataLength, BOOL wide)  inString(PMEM_HANDLE * handle, STREAM in, char **destination, SERVER_DWORD dataLength, RD_BOOL wide)
502  {  {
503          unsigned int Result = (wide) ? (2 * dataLength) : (dataLength);          unsigned int Result = (wide) ? (2 * dataLength) : (dataLength);
504          PMEM_HANDLE lcHandle = NULL;          PMEM_HANDLE lcHandle = NULL;
# Line 541  inString(PMEM_HANDLE * handle, STREAM in Line 532  inString(PMEM_HANDLE * handle, STREAM in
532  }  }
533    
534  static unsigned int  static unsigned int
535  outString(STREAM out, char *source, BOOL wide)  outString(STREAM out, char *source, RD_BOOL wide)
536  {  {
537          PMEM_HANDLE lcHandle = NULL;          PMEM_HANDLE lcHandle = NULL;
538          char *reader = getAlias(source);          char *reader = getAlias(source);
# Line 575  outString(STREAM out, char *source, BOOL Line 566  outString(STREAM out, char *source, BOOL
566  }  }
567    
568  static void  static void
569  inReaderName(PMEM_HANDLE * handle, STREAM in, char **destination, BOOL wide)  inReaderName(PMEM_HANDLE * handle, STREAM in, char **destination, RD_BOOL wide)
570  {  {
571          SERVER_DWORD dataLength;          SERVER_DWORD dataLength;
572          in->p += 0x08;          in->p += 0x08;
# Line 620  TS_SCardEstablishContext(STREAM in, STRE Line 611  TS_SCardEstablishContext(STREAM in, STRE
611          MYPCSC_SCARDCONTEXT hContext;          MYPCSC_SCARDCONTEXT hContext;
612          /* code segment  */          /* code segment  */
613    
614          DEBUG_SCARD(("Establishing PC/SC Context... \n"));          DEBUG_SCARD(("SCARD: SCardEstablishContext()\n"));
615          rv = SCardEstablishContext(SCARD_SCOPE_SYSTEM, NULL, NULL, &hContext);          rv = SCardEstablishContext(SCARD_SCOPE_SYSTEM, NULL, NULL, &hContext);
616          if (rv)          if (rv)
617          {          {
618                  DEBUG_SCARD(("<--ERROR SCardEstablishContext Code=0x%.8x]-->\n",                  DEBUG_SCARD(("SCARD: -> Failure: %s (0x%08x)\n",
619                               (unsigned int) rv));                               pcsc_stringify_error(rv), (unsigned int) rv));
620          }          }
621          else          else
622          {          {
623                  DEBUG_SCARD(("<--SUCCESS SCardEstablishContext-->\n"));                  DEBUG_SCARD(("SCARD: -> Success (context: 0x%08lx)\n", hContext));
624          }          }
625    
626          out_uint32_le(out, 0x00000004);          out_uint32_le(out, 0x00000004);
# Line 648  TS_SCardReleaseContext(STREAM in, STREAM Line 639  TS_SCardReleaseContext(STREAM in, STREAM
639    
640          in->p += 0x1C;          in->p += 0x1C;
641          in_uint32_le(in, hContext);          in_uint32_le(in, hContext);
642          DEBUG_SCARD(("[CONTEXT 0x%.8x]\n", (unsigned int) hContext));          DEBUG_SCARD(("SCARD: SCardReleaseContext(context: 0x%08x)\n", (unsigned) hContext));
         DEBUG_SCARD(("Releasing context... \n"));  
643          rv = SCardReleaseContext((MYPCSC_SCARDCONTEXT) hContext);          rv = SCardReleaseContext((MYPCSC_SCARDCONTEXT) hContext);
644    
645          if (rv)          if (rv)
646          {          {
647                  DEBUG_SCARD(("<--ERROR SCardReleaseContext Code=0x%.8x-->\n", (unsigned int) rv));                  DEBUG_SCARD(("SCARD: -> Failure: %s (0x%08x)\n",
648                                 pcsc_stringify_error(rv), (unsigned int) rv));
649          }          }
650          else          else
651          {          {
652                  DEBUG_SCARD(("<--SUCCESS SCardReleaseContext-->\n"));                  DEBUG_SCARD(("SCARD: -> Success\n"));
653          }          }
654    
655          return rv;          return rv;
# Line 675  TS_SCardIsValidContext(STREAM in, STREAM Line 666  TS_SCardIsValidContext(STREAM in, STREAM
666    
667          in->p += 0x1C;          in->p += 0x1C;
668          in_uint32_le(in, hContext);          in_uint32_le(in, hContext);
669          DEBUG_SCARD(("[CONTEXT 0x%.8x]\n", (unsigned int) hContext));          DEBUG_SCARD(("SCARD: SCardIsValidContext(context: 0x%08x)\n", (unsigned) hContext));
         DEBUG_SCARD(("Checking... \n"));  
670          /* There is no realization of SCardIsValidContext in PC/SC Lite so we call SCardListReaders */          /* There is no realization of SCardIsValidContext in PC/SC Lite so we call SCardListReaders */
671    
672          readers = SC_xmalloc(&lcHandle, 1024);          readers = SC_xmalloc(&lcHandle, 1024);
# Line 687  TS_SCardIsValidContext(STREAM in, STREAM Line 677  TS_SCardIsValidContext(STREAM in, STREAM
677    
678          if (rv)          if (rv)
679          {          {
680                  DEBUG_SCARD(("<--ERROR SCardListReaders (no SCardIsValidContext) Code=0x%.8x-->\n",                  DEBUG_SCARD(("SCARD: -> Failure: %s (0x%08x)\n",
681                               (unsigned int) rv));                               pcsc_stringify_error(rv), (unsigned int) rv));
682                  rv = SCARD_E_INVALID_HANDLE;                  rv = SCARD_E_INVALID_HANDLE;
683          }          }
684          else          else
685          {          {
686                  DEBUG_SCARD(("<--SUCCESS SCardListReaders (no SCardIsValidContext)-->\n"));                  DEBUG_SCARD(("SCARD: -> Success\n"));
687          }          }
688    
689          outForceAllignment(out, 8);          outForceAlignment(out, 8);
690          SC_xfreeallmemory(&lcHandle);          SC_xfreeallmemory(&lcHandle);
691          return rv;          return rv;
692  }  }
693    
694    
695  static MYPCSC_DWORD  static MYPCSC_DWORD
696  TS_SCardListReaders(STREAM in, STREAM out, BOOL wide)  TS_SCardListReaders(STREAM in, STREAM out, RD_BOOL wide)
697  {  {
698  #define readerArraySize 1024  #define readerArraySize 1024
699          MYPCSC_DWORD rv;          MYPCSC_DWORD rv;
# Line 716  TS_SCardListReaders(STREAM in, STREAM ou Line 706  TS_SCardListReaders(STREAM in, STREAM ou
706    
707          in->p += 0x2C;          in->p += 0x2C;
708          in_uint32_le(in, hContext);          in_uint32_le(in, hContext);
709          DEBUG_SCARD(("[CONTEXT 0x%.8x]\n", (unsigned int) hContext));          DEBUG_SCARD(("SCARD: SCardListReaders(context: 0x%08x)\n", (unsigned) hContext));
710          plen1 = out->p;          plen1 = out->p;
711          out_uint32_le(out, 0x00000000); /* Temp value for data length as 0x0 */          out_uint32_le(out, 0x00000000); /* Temp value for data length as 0x0 */
712          out_uint32_le(out, 0x01760650);          out_uint32_le(out, 0x01760650);
# Line 733  TS_SCardListReaders(STREAM in, STREAM ou Line 723  TS_SCardListReaders(STREAM in, STREAM ou
723          readers[1] = '\0';          readers[1] = '\0';
724          rv = SCardListReaders((MYPCSC_SCARDCONTEXT) hContext, NULL, readers, &cchReaders);          rv = SCardListReaders((MYPCSC_SCARDCONTEXT) hContext, NULL, readers, &cchReaders);
725          cur = readers;          cur = readers;
726          if (!rv)          if (rv != SCARD_S_SUCCESS)
727            {
728                    DEBUG_SCARD(("SCARD: -> Failure: %s (0x%08x)\n",
729                                 pcsc_stringify_error(rv), (unsigned int) rv));
730            }
731            else
732          {          {
733                  int i;                  int i;
734                  PSCNameMapRec tmpMap;                  PSCNameMapRec tmpMap;
735  #ifdef WITH_DEBUG_SCARD                  DEBUG_SCARD(("SCARD: -> Success\n"));
                 DEBUG_SCARD(("[CALL RESULT of SCardListReaders 0x%.8x]\n", (unsigned int) rv));  
                 hexdump((void *) readers, cchReaders);  
 #endif  
736                  for (i = 0, tmpMap = nameMapList; i < nameMapCount; i++, tmpMap++)                  for (i = 0, tmpMap = nameMapList; i < nameMapCount; i++, tmpMap++)
737                  {                  {
738                          dataLength += outString(out, tmpMap->alias, wide);                          dataLength += outString(out, tmpMap->alias, wide);
# Line 753  TS_SCardListReaders(STREAM in, STREAM ou Line 745  TS_SCardListReaders(STREAM in, STREAM ou
745                          while (lenSC > 0)                          while (lenSC > 0)
746                          {                          {
747                                  if (!hasAlias(cur))                                  if (!hasAlias(cur))
748                                    {
749                                            DEBUG_SCARD(("SCARD:    \"%s\"\n", cur));
750                                          dataLength += outString(out, cur, wide);                                          dataLength += outString(out, cur, wide);
751                                    }
752                                  cur = (void *) ((unsigned char *) cur + lenSC + 1);                                  cur = (void *) ((unsigned char *) cur + lenSC + 1);
753                                  lenSC = strlen(cur);                                  lenSC = strlen(cur);
754                          }                          }
# Line 769  TS_SCardListReaders(STREAM in, STREAM ou Line 764  TS_SCardListReaders(STREAM in, STREAM ou
764          out_uint32_le(out, dataLength);          out_uint32_le(out, dataLength);
765          out->p = pend;          out->p = pend;
766    
767          outForceAllignment(out, 8);          outForceAlignment(out, 8);
768          SC_xfreeallmemory(&lcHandle);          SC_xfreeallmemory(&lcHandle);
769          return rv;          return rv;
770  }  }
771    
772    
773  static MYPCSC_DWORD  static MYPCSC_DWORD
774  TS_SCardConnect(STREAM in, STREAM out, BOOL wide)  TS_SCardConnect(STREAM in, STREAM out, RD_BOOL wide)
775  {  {
776          MYPCSC_DWORD rv;          MYPCSC_DWORD rv;
777          SCARDCONTEXT hContext;          SCARDCONTEXT hContext;
# Line 792  TS_SCardConnect(STREAM in, STREAM out, B Line 787  TS_SCardConnect(STREAM in, STREAM out, B
787          in->p += 0x1C;          in->p += 0x1C;
788          in_uint32_le(in, dwShareMode);          in_uint32_le(in, dwShareMode);
789          in_uint32_le(in, dwPreferredProtocol);          in_uint32_le(in, dwPreferredProtocol);
         DEBUG_SCARD(("[SHARE %8x]\n", (unsigned int) dwShareMode));  
         DEBUG_SCARD(("[PROTO %8x]\n", (unsigned int) dwPreferredProtocol));  
790          inReaderName(&lcHandle, in, &szReader, wide);          inReaderName(&lcHandle, in, &szReader, wide);
         DEBUG_SCARD(("[CONNECT TO READER \"%s\"\n", (szReader != NULL) ? (szReader) : ("NULL")));  
791          in->p += 0x04;          in->p += 0x04;
792          in_uint32_le(in, hContext);          in_uint32_le(in, hContext);
793          DEBUG_SCARD(("[CONTEXT 0x%.8x]\n", (unsigned int) hContext));          DEBUG_SCARD(("SCARD: SCardConnect(context: 0x%08x, share: 0x%08x, proto: 0x%08x, reader: \"%s\")\n", (unsigned) hContext, (unsigned) dwShareMode, (unsigned) dwPreferredProtocol, szReader ? szReader : "NULL"));
794          rv = SCardConnect(hContext, szReader, (MYPCSC_DWORD) dwShareMode,          rv = SCardConnect(hContext, szReader, (MYPCSC_DWORD) dwShareMode,
795                            (MYPCSC_DWORD) dwPreferredProtocol, &myHCard, &dwActiveProtocol);                            (MYPCSC_DWORD) dwPreferredProtocol, &myHCard, &dwActiveProtocol);
796          hCard = scHandleToServer(myHCard);          hCard = scHandleToServer(myHCard);
         DEBUG_SCARD(("[RECEIVED HCARD 0x%016lx]\n", (unsigned long) myHCard));  
         DEBUG_SCARD(("[MANGLED  HCARD 0x%08x]\n", hCard));  
797          if (rv != SCARD_S_SUCCESS)          if (rv != SCARD_S_SUCCESS)
798          {          {
799                  DEBUG_SCARD(("<--ERROR SCardConnect Code=0x%.8x-->\n", (unsigned int) rv));                  DEBUG_SCARD(("SCARD: -> Failure: %s (0x%08x)\n",
800                                 pcsc_stringify_error(rv), (unsigned int) rv));
801          }          }
802          else          else
803          {          {
804                  char *szVendor = getVendor(szReader);                  char *szVendor = getVendor(szReader);
805                  DEBUG_SCARD(("<--SUCCESS ScardConnect-->\n"));                  DEBUG_SCARD(("SCARD: -> Success (hcard: 0x%08x [0x%08lx])\n",
806                                 (unsigned) hCard, (unsigned long) myHCard));
807                  if (szVendor && (strlen(szVendor) > 0))                  if (szVendor && (strlen(szVendor) > 0))
808                  {                  {
809                          DEBUG_SCARD(("Set Attribute ATTR_VENDOR_NAME\n"));                          DEBUG_SCARD(("SCARD: Set Attribute ATTR_VENDOR_NAME\n"));
810                          pthread_mutex_lock(&hcardAccess);                          pthread_mutex_lock(&hcardAccess);
811                          PSCHCardRec hcard = xmalloc(sizeof(TSCHCardRec));                          PSCHCardRec hcard = xmalloc(sizeof(TSCHCardRec));
812                          if (hcard)                          if (hcard)
# Line 844  TS_SCardConnect(STREAM in, STREAM out, B Line 836  TS_SCardConnect(STREAM in, STREAM out, B
836          out_uint32_le(out, 0x00000004);          out_uint32_le(out, 0x00000004);
837          out_uint32_le(out, hCard);          out_uint32_le(out, hCard);
838    
839          outForceAllignment(out, 8);          outForceAlignment(out, 8);
840          SC_xfreeallmemory(&lcHandle);          SC_xfreeallmemory(&lcHandle);
841          return rv;          return rv;
842  }  }
# Line 870  TS_SCardReconnect(STREAM in, STREAM out) Line 862  TS_SCardReconnect(STREAM in, STREAM out)
862          in->p += 0x04;          in->p += 0x04;
863          in_uint32_le(in, hCard);          in_uint32_le(in, hCard);
864          myHCard = scHandleToMyPCSC(hCard);          myHCard = scHandleToMyPCSC(hCard);
865          DEBUG_SCARD(("[SHARE = 0x%.8x]\n", (unsigned int) dwShareMode));          DEBUG_SCARD(("SCARD: SCardReconnect(context: 0x%08x, hcard: 0x%08x [0x%08lx], share: 0x%08x, proto: 0x%08x, init: 0x%08x)\n", (unsigned) hContext, (unsigned) hCard, (unsigned long) myHCard, (unsigned) dwShareMode, (unsigned) dwPreferredProtocol, (unsigned) dwInitialization));
         DEBUG_SCARD(("[PROTO = 0x%.8x]\n", (unsigned int) dwPreferredProtocol));  
         DEBUG_SCARD(("[INIT  = 0x%.8x]\n", (unsigned int) dwInitialization));  
         DEBUG_SCARD(("[hContext = 0x%.8x]\n", (unsigned int) hContext));  
         DEBUG_SCARD(("[hCard = 0x%.8x]\n", (unsigned int) hCard));  
         DEBUG_SCARD(("[myHCard = 0x%016lx]\n", (unsigned long) myHCard));  
866          rv = SCardReconnect(myHCard, (MYPCSC_DWORD) dwShareMode, (MYPCSC_DWORD) dwPreferredProtocol,          rv = SCardReconnect(myHCard, (MYPCSC_DWORD) dwShareMode, (MYPCSC_DWORD) dwPreferredProtocol,
867                              (MYPCSC_DWORD) dwInitialization, &dwActiveProtocol);                              (MYPCSC_DWORD) dwInitialization, &dwActiveProtocol);
868          if (rv != SCARD_S_SUCCESS)          if (rv != SCARD_S_SUCCESS)
869          {          {
870                  DEBUG_SCARD(("<--ERROR SCardReconnect Code=0x%.8x-->\n", (unsigned int) rv));                  DEBUG_SCARD(("SCARD: -> Failure: %s (0x%08x)\n",
871                                 pcsc_stringify_error(rv), (unsigned int) rv));
872          }          }
873          else          else
874          {          {
875                  DEBUG_SCARD(("<--SUCCESS SCardReconnect-->\n"));                  DEBUG_SCARD(("SCARD: -> Success (proto: 0x%08x)\n", (unsigned) dwActiveProtocol));
876          }          }
877    
878          outForceAllignment(out, 8);          outForceAlignment(out, 8);
879          out_uint32_le(out, (SERVER_DWORD) dwActiveProtocol);          out_uint32_le(out, (SERVER_DWORD) dwActiveProtocol);
880          return rv;          return rv;
881  }  }
# Line 908  TS_SCardDisconnect(STREAM in, STREAM out Line 896  TS_SCardDisconnect(STREAM in, STREAM out
896          in->p += 0x04;          in->p += 0x04;
897          in_uint32_le(in, hCard);          in_uint32_le(in, hCard);
898    
899          DEBUG_SCARD(("[hContext = 0x%.8x]\n", (unsigned int) hContext));          DEBUG_SCARD(("SCARD: SCardDisconnect(context: 0x%08x, hcard: 0x%08x, disposition: 0x%08x)\n", (unsigned) hContext, (unsigned) hCard, (unsigned) dwDisposition));
         DEBUG_SCARD(("[hCard = 0x%.8x]\n", (unsigned int) hCard));  
         DEBUG_SCARD(("[dwDisposition = 0x%.8x]\n", (unsigned int) dwDisposition));  
900    
901          pthread_mutex_lock(&hcardAccess);          pthread_mutex_lock(&hcardAccess);
902          PSCHCardRec hcard = hcardFirst;          PSCHCardRec hcard = hcardFirst;
# Line 936  TS_SCardDisconnect(STREAM in, STREAM out Line 922  TS_SCardDisconnect(STREAM in, STREAM out
922    
923          if (rv != SCARD_S_SUCCESS)          if (rv != SCARD_S_SUCCESS)
924          {          {
925                  DEBUG_SCARD(("<--ERROR SCardDisconnect Code=0x%.8x-->\n", (unsigned int) rv));                  DEBUG_SCARD(("SCARD: -> Failure: %s (0x%08x)\n",
926                                 pcsc_stringify_error(rv), (unsigned int) rv));
927          }          }
928          else          else
929          {          {
930                  DEBUG_SCARD(("<--SUCCESS SCardDisconnect-->\n"));                  DEBUG_SCARD(("SCARD: -> Success\n"));
931          }          }
932    
933          outForceAllignment(out, 8);          outForceAlignment(out, 8);
934          return rv;          return rv;
935  }  }
936    
# Line 966  needStatusRecheck(MYPCSC_DWORD rv, MYPCS Line 953  needStatusRecheck(MYPCSC_DWORD rv, MYPCS
953          return recall;          return recall;
954  }  }
955    
956  static BOOL  static RD_BOOL
957  mappedStatus(MYPCSC_DWORD code)  mappedStatus(MYPCSC_DWORD code)
958  {  {
959          code >>= 16;          code >>= 16;
# Line 975  mappedStatus(MYPCSC_DWORD code) Line 962  mappedStatus(MYPCSC_DWORD code)
962  }  }
963    
964  static MYPCSC_DWORD  static MYPCSC_DWORD
965  incStatus(MYPCSC_DWORD code, BOOL mapped)  incStatus(MYPCSC_DWORD code, RD_BOOL mapped)
966  {  {
967          if (mapped || (code & SCARD_STATE_CHANGED))          if (mapped || (code & SCARD_STATE_CHANGED))
968          {          {
# Line 1029  copyReaderState_ServerToMyPCSC(SERVER_LP Line 1016  copyReaderState_ServerToMyPCSC(SERVER_LP
1016    
1017    
1018  static MYPCSC_DWORD  static MYPCSC_DWORD
1019  TS_SCardGetStatusChange(STREAM in, STREAM out, BOOL wide)  TS_SCardGetStatusChange(STREAM in, STREAM out, RD_BOOL wide)
1020  {  {
1021          MYPCSC_DWORD rv;          MYPCSC_DWORD rv;
1022          SERVER_SCARDCONTEXT hContext;          SERVER_SCARDCONTEXT hContext;
# Line 1041  TS_SCardGetStatusChange(STREAM in, STREA Line 1028  TS_SCardGetStatusChange(STREAM in, STREA
1028          long i;          long i;
1029          PMEM_HANDLE lcHandle = NULL;          PMEM_HANDLE lcHandle = NULL;
1030  #if 0  #if 0
1031          BOOL mapped = False;          RD_BOOL mapped = False;
1032  #endif  #endif
1033    
1034          in->p += 0x18;          in->p += 0x18;
# Line 1051  TS_SCardGetStatusChange(STREAM in, STREA Line 1038  TS_SCardGetStatusChange(STREAM in, STREA
1038          in_uint32_le(in, hContext);          in_uint32_le(in, hContext);
1039          in->p += 0x04;          in->p += 0x04;
1040    
1041          DEBUG_SCARD(("[CONTEXT 0x%.8x]\n", (unsigned int) hContext));          DEBUG_SCARD(("SCARD: SCardGetStatusChange(context: 0x%08x, timeout: 0x%08x, count: %d)\n",
1042          DEBUG_SCARD(("[dwTimeout 0x%.8x]\n", (unsigned int) dwTimeout));                       (unsigned) hContext, (unsigned) dwTimeout, (int) dwCount));
         DEBUG_SCARD(("[COUNT %d]\n", (unsigned int) dwCount));  
         DEBUG_SCARD(("[TYPE SIZE %d]\n", (unsigned int) sizeof(SERVER_SCARD_READERSTATE_A)));  
1043    
1044          if (dwCount > 0)          if (dwCount > 0)
1045          {          {
# Line 1072  TS_SCardGetStatusChange(STREAM in, STREA Line 1057  TS_SCardGetStatusChange(STREAM in, STREA
1057                          in->p += 0x04;                          in->p += 0x04;
1058                          in_uint8a(in, cur, SERVER_SCARDSTATESIZE);                          in_uint8a(in, cur, SERVER_SCARDSTATESIZE);
1059                  }                  }
 #ifdef WITH_DEBUG_SCARD  
                 DEBUG_SCARD(("[READERS DUMP 1]------------------\n"));  
                 hexdump((void *) rsArray, dwCount * sizeof(SERVER_SCARD_READERSTATE_A));  
 #endif  
   
1060    
1061                  for (i = 0, cur = rsArray, curState = stateArray;                  for (i = 0, cur = rsArray, curState = stateArray;
1062                       i < dwCount; i++, cur++, curState++)                       i < dwCount; i++, cur++, curState++)
1063                  {                  {
1064                          SERVER_DWORD dataLength;                          SERVER_DWORD dataLength;
1065    
1066                            /* Do endian swaps... */
1067                            cur->dwCurrentState = swap32(cur->dwCurrentState);
1068                            cur->dwEventState = swap32(cur->dwEventState);
1069                            cur->cbAtr = swap32(cur->cbAtr);
1070    
1071                          /* reset Current state hign bytes; */                          /* reset Current state hign bytes; */
1072                          *curState = cur->dwCurrentState;                          *curState = cur->dwCurrentState;
1073                          cur->dwCurrentState &= 0x0000FFFF;                          cur->dwCurrentState &= 0x0000FFFF;
# Line 1110  TS_SCardGetStatusChange(STREAM in, STREA Line 1095  TS_SCardGetStatusChange(STREAM in, STREA
1095    
1096                          in->p += 0x08;                          in->p += 0x08;
1097                          in_uint32_le(in, dataLength);                          in_uint32_le(in, dataLength);
                         DEBUG_SCARD(("[%d] Data Length %d]\n", (unsigned int) i, dataLength));  
1098                          inRepos(in,                          inRepos(in,
1099                                  inString(&lcHandle, in, (char **) &(cur->szReader), dataLength,                                  inString(&lcHandle, in, (char **) &(cur->szReader), dataLength,
1100                                           wide));                                           wide));
1101    
1102                          if (strcmp(cur->szReader, "\\\\?PnP?\\Notification") == 0)                          if (strcmp(cur->szReader, "\\\\?PnP?\\Notification") == 0)
1103                                  cur->dwCurrentState |= SCARD_STATE_IGNORE;                                  cur->dwCurrentState |= SCARD_STATE_IGNORE;
1104    
1105                            DEBUG_SCARD(("SCARD:    \"%s\"\n", cur->szReader ? cur->szReader : "NULL"));
1106                            DEBUG_SCARD(("SCARD:        user: 0x%08x, state: 0x%08x, event: 0x%08x\n",
1107                                         (unsigned) cur->pvUserData, (unsigned) cur->dwCurrentState,
1108                                         (unsigned) cur->dwEventState));
1109                            DEBUG_SCARD(("SCARD:            current state: 0x%08x\n",
1110                                         (unsigned) *curState));
1111                  }                  }
 #ifdef WITH_DEBUG_SCARD  
                 DEBUG_SCARD(("[READERS DUMP 2]------------------\n"));  
                 hexdump((void *) rsArray, dwCount * sizeof(SERVER_SCARD_READERSTATE_A));  
 #endif  
1112          }          }
1113          else          else
1114          {          {
# Line 1129  TS_SCardGetStatusChange(STREAM in, STREA Line 1116  TS_SCardGetStatusChange(STREAM in, STREA
1116                  stateArray = NULL;                  stateArray = NULL;
1117          }          }
1118    
         DEBUG_SCARD(("\nCalling SCardGetStatusChange...\n"));  
   
   
1119          myRsArray = SC_xmalloc(&lcHandle, dwCount * sizeof(MYPCSC_SCARD_READERSTATE_A));          myRsArray = SC_xmalloc(&lcHandle, dwCount * sizeof(MYPCSC_SCARD_READERSTATE_A));
1120          if (!rsArray)          if (!rsArray)
1121                  return SC_returnNoMemoryError(&lcHandle, in, out);                  return SC_returnNoMemoryError(&lcHandle, in, out);
1122          memset(myRsArray, 0, dwCount * sizeof(SERVER_SCARD_READERSTATE_A));          memset(myRsArray, 0, dwCount * sizeof(SERVER_SCARD_READERSTATE_A));
1123          copyReaderState_ServerToMyPCSC(rsArray, myRsArray, (SERVER_DWORD) dwCount);          copyReaderState_ServerToMyPCSC(rsArray, myRsArray, (SERVER_DWORD) dwCount);
 #ifdef WITH_DEBUG_SCARD  
         DEBUG_SCARD(("[TRANSLATION OF READERS]--------------------\n"));  
         hexdump((void *) myRsArray, dwCount * sizeof(MYPCSC_SCARD_READERSTATE_A));  
 #endif  
1124    
1125          rv = SCardGetStatusChange((MYPCSC_SCARDCONTEXT) hContext, (MYPCSC_DWORD) dwTimeout,          rv = SCardGetStatusChange((MYPCSC_SCARDCONTEXT) hContext, (MYPCSC_DWORD) dwTimeout,
1126                                    myRsArray, (MYPCSC_DWORD) dwCount);                                    myRsArray, (MYPCSC_DWORD) dwCount);
# Line 1148  TS_SCardGetStatusChange(STREAM in, STREA Line 1128  TS_SCardGetStatusChange(STREAM in, STREA
1128    
1129          if (rv != SCARD_S_SUCCESS)          if (rv != SCARD_S_SUCCESS)
1130          {          {
1131                  DEBUG_SCARD(("<--ERROR SCardGetStatusChange Code=0x%.8x-->\n", (unsigned int) rv));                  DEBUG_SCARD(("SCARD: -> Failure: %s (0x%08x)\n",
1132                                 pcsc_stringify_error(rv), (unsigned int) rv));
1133          }          }
1134          else          else
1135          {          {
1136                  DEBUG_SCARD(("<--SUCCESS SCardGetStatusChange-->\n"));                  DEBUG_SCARD(("SCARD: -> Success\n"));
         }  
   
 #ifdef WITH_DEBUG_SCARD  
         if (dwCount > 0)  
         {  
                 DEBUG_SCARD(("[READERS DUMP]------------------\n"));  
                 hexdump((void *) rsArray, dwCount * sizeof(SERVER_SCARD_READERSTATE_A));  
1137          }          }
 #endif  
1138    
1139          out_uint32_le(out, dwCount);          out_uint32_le(out, dwCount);
1140          out_uint32_le(out, 0x00084dd8);          out_uint32_le(out, 0x00084dd8);
# Line 1197  TS_SCardGetStatusChange(STREAM in, STREA Line 1170  TS_SCardGetStatusChange(STREAM in, STREA
1170  #endif  #endif
1171                  cur->dwEventState = incStatus(cur->dwEventState, False);                  cur->dwEventState = incStatus(cur->dwEventState, False);
1172    
1173                    DEBUG_SCARD(("SCARD:    \"%s\"\n", cur->szReader ? cur->szReader : "NULL"));
1174                    DEBUG_SCARD(("SCARD:        user: 0x%08x, state: 0x%08x, event: 0x%08x\n",
1175                                 (unsigned) cur->pvUserData, (unsigned) cur->dwCurrentState,
1176                                 (unsigned) cur->dwEventState));
1177    
1178                    /* Do endian swaps... */
1179                    cur->dwCurrentState = swap32(cur->dwCurrentState);
1180                    cur->dwEventState = swap32(cur->dwEventState);
1181                    cur->cbAtr = swap32(cur->cbAtr);
1182    
1183                  out_uint8p(out, (void *) ((unsigned char **) cur + 2),                  out_uint8p(out, (void *) ((unsigned char **) cur + 2),
1184                             sizeof(SERVER_SCARD_READERSTATE_A) - 2 * sizeof(unsigned char *));                             sizeof(SERVER_SCARD_READERSTATE_A) - 2 * sizeof(unsigned char *));
1185          }          }
1186          outForceAllignment(out, 8);          outForceAlignment(out, 8);
1187          SC_xfreeallmemory(&lcHandle);          SC_xfreeallmemory(&lcHandle);
1188          return rv;          return rv;
1189  }  }
# Line 1213  TS_SCardCancel(STREAM in, STREAM out) Line 1196  TS_SCardCancel(STREAM in, STREAM out)
1196    
1197          in->p += 0x1C;          in->p += 0x1C;
1198          in_uint32_le(in, hContext);          in_uint32_le(in, hContext);
1199          DEBUG_SCARD(("[CONTEXT 0x%.8x]\n", (unsigned int) hContext));          DEBUG_SCARD(("SCARD: SCardCancel(context: 0x%08x)\n", (unsigned) hContext));
         DEBUG_SCARD(("Canceling... \n"));  
1200          rv = SCardCancel((MYPCSC_SCARDCONTEXT) hContext);          rv = SCardCancel((MYPCSC_SCARDCONTEXT) hContext);
1201          if (rv != SCARD_S_SUCCESS)          if (rv != SCARD_S_SUCCESS)
1202          {          {
1203                  DEBUG_SCARD(("<--ERROR SCardCancel Code=0x%.8x-->\n", (unsigned int) rv));                  DEBUG_SCARD(("SCARD: -> Failure: %s (0x%08x)\n",
1204                                 pcsc_stringify_error(rv), (unsigned int) rv));
1205          }          }
1206          else          else
1207          {          {
1208                  DEBUG_SCARD(("<--SUCCESS SCardCancel-->\n"));                  DEBUG_SCARD(("SCARD: -> Success\n"));
1209          }          }
1210          outForceAllignment(out, 8);          outForceAlignment(out, 8);
1211          return rv;          return rv;
1212  }  }
1213    
1214  static MYPCSC_DWORD  static MYPCSC_DWORD
1215  TS_SCardLocateCardsByATR(STREAM in, STREAM out, BOOL wide)  TS_SCardLocateCardsByATR(STREAM in, STREAM out, RD_BOOL wide)
1216  {  {
1217          int i, j, k;          int i, j, k;
1218          MYPCSC_DWORD rv;          MYPCSC_DWORD rv;
# Line 1245  TS_SCardLocateCardsByATR(STREAM in, STRE Line 1228  TS_SCardLocateCardsByATR(STREAM in, STRE
1228    
1229          in->p += 0x2C;          in->p += 0x2C;
1230          in_uint32_le(in, hContext);          in_uint32_le(in, hContext);
         DEBUG_SCARD(("[CONTEXT 0x%.8x]\n", (unsigned int) hContext));  
1231          in_uint32_le(in, atrMaskCount);          in_uint32_le(in, atrMaskCount);
1232          pAtrMasks = SC_xmalloc(&lcHandle, atrMaskCount * sizeof(SCARD_ATRMASK_L));          pAtrMasks = SC_xmalloc(&lcHandle, atrMaskCount * sizeof(SCARD_ATRMASK_L));
1233          if (!pAtrMasks)          if (!pAtrMasks)
# Line 1258  TS_SCardLocateCardsByATR(STREAM in, STRE Line 1240  TS_SCardLocateCardsByATR(STREAM in, STRE
1240                  return SC_returnNoMemoryError(&lcHandle, in, out);                  return SC_returnNoMemoryError(&lcHandle, in, out);
1241          memset(rsArray, 0, readerCount * sizeof(SCARD_READERSTATE_A));          memset(rsArray, 0, readerCount * sizeof(SCARD_READERSTATE_A));
1242    
1243            DEBUG_SCARD(("SCARD: SCardLocateCardsByATR(context: 0x%08x, atrs: %d, readers: %d)\n",
1244                         (unsigned) hContext, (int) atrMaskCount, (int) readerCount));
1245    
1246            for (i = 0, cur = pAtrMasks; i < atrMaskCount; i++, cur++)
1247            {
1248                    cur->cbAtr = swap32(cur->cbAtr);
1249    
1250                    DEBUG_SCARD(("SCARD:    ATR: "));
1251                    for (j = 0; j < pAtrMasks->cbAtr; j++)
1252                    {
1253                    DEBUG_SCARD(("%02x%c",
1254                                         (unsigned) (unsigned char) cur->rgbAtr[j],
1255                                         (j == pAtrMasks->cbAtr - 1) ? ' ' : ':'))}
1256                    DEBUG_SCARD(("\n"));
1257                    DEBUG_SCARD(("SCARD:         "));
1258                    for (j = 0; j < pAtrMasks->cbAtr; j++)
1259                    {
1260                    DEBUG_SCARD(("%02x%c",
1261                                         (unsigned) (unsigned char) cur->rgbMask[j],
1262                                         (j == pAtrMasks->cbAtr - 1) ? ' ' : ':'))}
1263                    DEBUG_SCARD(("\n"));
1264            }
1265    
1266          for (i = 0, rsCur = (SERVER_LPSCARD_READERSTATE_A) ((unsigned char **) rsArray + 2);          for (i = 0, rsCur = (SERVER_LPSCARD_READERSTATE_A) ((unsigned char **) rsArray + 2);
1267               i < readerCount; i++, rsCur++)               i < readerCount; i++, rsCur++)
1268          {          {
# Line 1268  TS_SCardLocateCardsByATR(STREAM in, STRE Line 1273  TS_SCardLocateCardsByATR(STREAM in, STRE
1273          ResArray = SC_xmalloc(&lcHandle, readerCount * sizeof(SERVER_SCARD_READERSTATE_A));          ResArray = SC_xmalloc(&lcHandle, readerCount * sizeof(SERVER_SCARD_READERSTATE_A));
1274          if (!ResArray)          if (!ResArray)
1275                  return SC_returnNoMemoryError(&lcHandle, in, out);                  return SC_returnNoMemoryError(&lcHandle, in, out);
         memcpy(ResArray, rsArray, readerCount * sizeof(SERVER_SCARD_READERSTATE_A));  
1276    
1277          for (i = 0, rsCur = rsArray; i < readerCount; i++, rsCur++)          for (i = 0, rsCur = rsArray; i < readerCount; i++, rsCur++)
1278          {          {
1279                    /* Do endian swaps... */
1280                    rsCur->dwCurrentState = swap32(rsCur->dwCurrentState);
1281                    rsCur->dwEventState = swap32(rsCur->dwEventState);
1282                    rsCur->cbAtr = swap32(rsCur->cbAtr);
1283    
1284                  inReaderName(&lcHandle, in, (char **) &rsCur->szReader, wide);                  inReaderName(&lcHandle, in, (char **) &rsCur->szReader, wide);
1285                  DEBUG_SCARD(("[CHECK READER %s]\n",                  DEBUG_SCARD(("SCARD:    \"%s\"\n", rsCur->szReader ? rsCur->szReader : "NULL"));
1286                               (rsCur->szReader) ? (rsCur->szReader) : ("NULL")));                  DEBUG_SCARD(("SCARD:        user: 0x%08x, state: 0x%08x, event: 0x%08x\n",
1287                                 (unsigned) rsCur->pvUserData, (unsigned) rsCur->dwCurrentState,
1288                                 (unsigned) rsCur->dwEventState));
1289          }          }
1290            memcpy(ResArray, rsArray, readerCount * sizeof(SERVER_SCARD_READERSTATE_A));
1291    
         DEBUG_SCARD(("[CALL subfunction \"SCardGetStatusChange\"]\n"));  
1292          /* FIXME segfault here. */          /* FIXME segfault here. */
1293          myRsArray = SC_xmalloc(&lcHandle, readerCount * sizeof(MYPCSC_SCARD_READERSTATE_A));          myRsArray = SC_xmalloc(&lcHandle, readerCount * sizeof(MYPCSC_SCARD_READERSTATE_A));
1294          if (!myRsArray)          if (!myRsArray)
1295                  return SC_returnNoMemoryError(&lcHandle, in, out);                  return SC_returnNoMemoryError(&lcHandle, in, out);
1296            copyReaderState_ServerToMyPCSC(rsArray, myRsArray, readerCount);
1297          rv = SCardGetStatusChange((MYPCSC_SCARDCONTEXT) hContext, 0x00000001, myRsArray,          rv = SCardGetStatusChange((MYPCSC_SCARDCONTEXT) hContext, 0x00000001, myRsArray,
1298                                    readerCount);                                    readerCount);
1299          copyReaderState_MyPCSCToServer(myRsArray, rsArray, readerCount);          copyReaderState_MyPCSCToServer(myRsArray, rsArray, readerCount);
1300          if (rv != SCARD_S_SUCCESS)          if (rv != SCARD_S_SUCCESS)
1301          {          {
1302                  DEBUG_SCARD(("<--ERROR SCardGetStatusChange (no SCardLocateCardsByATR) Code=0x%.8x-->\n", (unsigned int) rv));                  DEBUG_SCARD(("SCARD: -> Failure: %s (0x%08x)\n",
1303                                 pcsc_stringify_error(rv), (unsigned int) rv));
1304          }          }
1305          else          else
1306          {          {
1307                  DEBUG_SCARD(("<--SUCCESS SCardGetStatusChange (no SCardLocateCardsByATR)-->\n"));                  DEBUG_SCARD(("SCARD: -> Success\n"));
1308                  cur = pAtrMasks;                  cur = pAtrMasks;
1309                  for (i = 0, cur = pAtrMasks; i < atrMaskCount; i++, cur++)                  for (i = 0, cur = pAtrMasks; i < atrMaskCount; i++, cur++)
1310                  {                  {
1311                          for (j = 0, rsCur = rsArray; j < readerCount; j++, rsCur++)                          for (j = 0, rsCur = rsArray; j < readerCount; j++, rsCur++)
1312                          {                          {
1313                                  BOOL equal = 1;                                  RD_BOOL equal = 1;
1314                                  for (k = 0; k < cur->cbAtr; k++)                                  for (k = 0; k < cur->cbAtr; k++)
1315                                  {                                  {
1316                                          /*  This line check if them equal */                                          if ((cur->rgbAtr[k] & cur->rgbMask[k]) !=
1317                                          if (cur->rgbAtr[k] != rsCur->rgbAtr[k])                                              (rsCur->rgbAtr[k] & cur->rgbMask[k]))
                                                 /*  Next Line was make to search with mask (some strange behavours with applications which use eToken SmartCards) */  
                                                 /*  if((cur->rgbAtr[k]&cur->rgbMask[k])!=(rsCur->rgbAtr[k]&cur->rgbMask[k])){ */  
1318                                          {                                          {
1319                                                  equal = 0;                                                  equal = 0;
1320                                                  break;                                                  break;
# Line 1311  TS_SCardLocateCardsByATR(STREAM in, STRE Line 1322  TS_SCardLocateCardsByATR(STREAM in, STRE
1322                                  }                                  }
1323                                  if (equal)                                  if (equal)
1324                                  {                                  {
                                         DEBUG_SCARD(("[FOUND]\n"));  
1325                                          rsCur->dwEventState |= 0x00000040;      /* SCARD_STATE_ATRMATCH 0x00000040 */                                          rsCur->dwEventState |= 0x00000040;      /* SCARD_STATE_ATRMATCH 0x00000040 */
1326                                          memcpy(ResArray + j, rsCur, sizeof(SCARD_READERSTATE_A));                                          memcpy(ResArray + j, rsCur, sizeof(SCARD_READERSTATE_A));
1327                                            DEBUG_SCARD(("SCARD:    \"%s\"\n",
1328                                                         rsCur->szReader ? rsCur->szReader : "NULL"));
1329                                            DEBUG_SCARD(("SCARD:        user: 0x%08x, state: 0x%08x, event: 0x%08x\n", (unsigned) rsCur->pvUserData, (unsigned) rsCur->dwCurrentState, (unsigned) rsCur->dwEventState));
1330                                  }                                  }
1331                          }                          }
1332                  }                  }
# Line 1323  TS_SCardLocateCardsByATR(STREAM in, STRE Line 1336  TS_SCardLocateCardsByATR(STREAM in, STRE
1336          out_uint32_le(out, 0x00084dd8);          out_uint32_le(out, 0x00084dd8);
1337          out_uint32_le(out, readerCount);          out_uint32_le(out, readerCount);
1338    
1339          for (i = 0, rsCur = rsArray; i < readerCount; i++, rsCur++)          for (i = 0, rsCur = ResArray; i < readerCount; i++, rsCur++)
1340          {          {
1341                    /* Do endian swaps... */
1342                    rsCur->dwCurrentState = swap32(rsCur->dwCurrentState);
1343                    rsCur->dwEventState = swap32(rsCur->dwEventState);
1344                    rsCur->cbAtr = swap32(rsCur->cbAtr);
1345    
1346                  out_uint8p(out, (void *) ((unsigned char **) rsCur + 2),                  out_uint8p(out, (void *) ((unsigned char **) rsCur + 2),
1347                             sizeof(SCARD_READERSTATE_A) - 2 * sizeof(unsigned char *));                             sizeof(SCARD_READERSTATE_A) - 2 * sizeof(unsigned char *));
1348          }          }
1349    
1350          outForceAllignment(out, 8);          outForceAlignment(out, 8);
1351          SC_xfreeallmemory(&lcHandle);          SC_xfreeallmemory(&lcHandle);
1352          return rv;          return rv;
1353  }  }
# Line 1344  TS_SCardBeginTransaction(STREAM in, STRE Line 1362  TS_SCardBeginTransaction(STREAM in, STRE
1362          in->p += 0x30;          in->p += 0x30;
1363          in_uint32_le(in, hCard);          in_uint32_le(in, hCard);
1364          myHCard = scHandleToMyPCSC(hCard);          myHCard = scHandleToMyPCSC(hCard);
1365          DEBUG_SCARD(("[hCard = 0x%.8x]\n", (unsigned int) hCard));          DEBUG_SCARD(("SCARD: SCardBeginTransaction(hcard: 0x%08x [0x%08lx])\n",
1366          DEBUG_SCARD(("[myHCard = 0x%016lx]\n", (unsigned long) myHCard));                       (unsigned) hCard, (unsigned long) myHCard));
1367          rv = SCardBeginTransaction(myHCard);          rv = SCardBeginTransaction(myHCard);
1368          if (rv != SCARD_S_SUCCESS)          if (rv != SCARD_S_SUCCESS)
1369          {          {
1370                  DEBUG_SCARD(("<--ERROR SCardBeginTransaction Code=0x%.8x-->\n", (unsigned int) rv));                  DEBUG_SCARD(("SCARD: -> Failure: %s (0x%08x)\n",
1371                                 pcsc_stringify_error(rv), (unsigned int) rv));
1372          }          }
1373          else          else
1374          {          {
1375                  DEBUG_SCARD(("<--SUCCESS SCardBeginTransaction-->\n"));                  DEBUG_SCARD(("SCARD: -> Success\n"));
1376          }          }
1377          outForceAllignment(out, 8);          outForceAlignment(out, 8);
1378          return rv;          return rv;
1379  }  }
1380    
# Line 1377  TS_SCardEndTransaction(STREAM in, STREAM Line 1396  TS_SCardEndTransaction(STREAM in, STREAM
1396          DEBUG_SCARD(("[myHCard = 0x%016lx]\n", (unsigned long) myHCard));          DEBUG_SCARD(("[myHCard = 0x%016lx]\n", (unsigned long) myHCard));
1397          DEBUG_SCARD(("[dwDisposition = 0x%.8x]\n", (unsigned int) dwDisposition));          DEBUG_SCARD(("[dwDisposition = 0x%.8x]\n", (unsigned int) dwDisposition));
1398    
1399            DEBUG_SCARD(("SCARD: SCardEndTransaction(hcard: 0x%08x [0x%08lx], disposition: 0x%08x)\n",
1400                         (unsigned) hCard, (unsigned long) myHCard, (unsigned) dwDisposition));
1401          rv = SCardEndTransaction(myHCard, (MYPCSC_DWORD) dwDisposition);          rv = SCardEndTransaction(myHCard, (MYPCSC_DWORD) dwDisposition);
1402          if (rv != SCARD_S_SUCCESS)          if (rv != SCARD_S_SUCCESS)
1403          {          {
1404                  DEBUG_SCARD(("<--ERROR SCardEndTransaction Code=0x%.8x-->\n", (unsigned int) rv));                  DEBUG_SCARD(("SCARD: -> Failure: %s (0x%08x)\n",
1405                                 pcsc_stringify_error(rv), (unsigned int) rv));
1406          }          }
1407          else          else
1408          {          {
1409                  DEBUG_SCARD(("<--SUCCESS SCardEndTransaction-->\n"));                  DEBUG_SCARD(("SCARD: -> Success\n"));
1410          }          }
1411          outForceAllignment(out, 8);          outForceAlignment(out, 8);
1412          return rv;          return rv;
1413  }  }
1414    
# Line 1398  copyIORequest_MyPCSCToServer(MYPCSC_LPSC Line 1420  copyIORequest_MyPCSCToServer(MYPCSC_LPSC
1420          size_t bytesToCopy = src->cbPciLength - sizeof(MYPCSC_SCARD_IO_REQUEST);          size_t bytesToCopy = src->cbPciLength - sizeof(MYPCSC_SCARD_IO_REQUEST);
1421          srcBytes = ((unsigned char *) src + sizeof(MYPCSC_SCARD_IO_REQUEST));          srcBytes = ((unsigned char *) src + sizeof(MYPCSC_SCARD_IO_REQUEST));
1422          dstBytes = ((unsigned char *) dst + sizeof(SERVER_SCARD_IO_REQUEST));          dstBytes = ((unsigned char *) dst + sizeof(SERVER_SCARD_IO_REQUEST));
1423          dst->dwProtocol = src->dwProtocol;          dst->dwProtocol = swap32((uint32_t)src->dwProtocol);
1424          dst->cbPciLength = src->cbPciLength          dst->cbPciLength = swap32((uint32_t)src->cbPciLength
1425                  - sizeof(MYPCSC_SCARD_IO_REQUEST) + sizeof(SERVER_SCARD_IO_REQUEST);                  - sizeof(MYPCSC_SCARD_IO_REQUEST) + sizeof(SERVER_SCARD_IO_REQUEST));
1426          memcpy(dstBytes, srcBytes, bytesToCopy);          memcpy(dstBytes, srcBytes, bytesToCopy);
1427  }  }
1428    
# Line 1411  copyIORequest_ServerToMyPCSC(SERVER_LPSC Line 1433  copyIORequest_ServerToMyPCSC(SERVER_LPSC
1433          size_t bytesToCopy = src->cbPciLength - sizeof(SERVER_SCARD_IO_REQUEST);          size_t bytesToCopy = src->cbPciLength - sizeof(SERVER_SCARD_IO_REQUEST);
1434          srcBytes = ((unsigned char *) src + sizeof(SERVER_SCARD_IO_REQUEST));          srcBytes = ((unsigned char *) src + sizeof(SERVER_SCARD_IO_REQUEST));
1435          dstBytes = ((unsigned char *) dst + sizeof(MYPCSC_SCARD_IO_REQUEST));          dstBytes = ((unsigned char *) dst + sizeof(MYPCSC_SCARD_IO_REQUEST));
1436          dst->dwProtocol = src->dwProtocol;          dst->dwProtocol = swap32(src->dwProtocol);
1437          dst->cbPciLength = src->cbPciLength          dst->cbPciLength = src->cbPciLength     /* already correct endian */
1438                  - sizeof(SERVER_SCARD_IO_REQUEST) + sizeof(MYPCSC_SCARD_IO_REQUEST);                  - sizeof(SERVER_SCARD_IO_REQUEST) + sizeof(MYPCSC_SCARD_IO_REQUEST);
1439          memcpy(dstBytes, srcBytes, bytesToCopy);          memcpy(dstBytes, srcBytes, bytesToCopy);
1440  }  }
# Line 1518  TS_SCardTransmit(STREAM in, STREAM out) Line 1540  TS_SCardTransmit(STREAM in, STREAM out)
1540          else          else
1541                  pioRecvPci = NULL;                  pioRecvPci = NULL;
1542    
1543  #ifdef WITH_DEBUG_SCARD          DEBUG_SCARD(("SCARD: SCardTransmit(hcard: 0x%08x [0x%08lx], send: %d bytes, recv: %d bytes)\n", (unsigned) hCard, (unsigned long) myHCard, (int) cbSendLength, (int) cbRecvLength));
         DEBUG_SCARD(("++++++++++\n"));  
         DEBUG_SCARD(("[SEND LEN = %d]\n", (unsigned int) cbSendLength));  
         DEBUG_SCARD(("[RECV LEN = %d]\n", (unsigned int) cbRecvLength));  
         DEBUG_SCARD(("[hCard = 0x%.8x]\n", (unsigned int) hCard));  
         DEBUG_SCARD(("[myHCard = 0x%016lx]\n", (unsigned long) myHCard));  
         DEBUG_SCARD(("[pioSendPci]\n"));  
         if (pioSendPci == NULL)  
         {  
                 DEBUG_SCARD(("NULL\n"));  
         }  
         else  
         {  
                 hexdump((void *) pioSendPci, pioSendPci->cbPciLength);  
         }  
   
         DEBUG_SCARD(("[pioRecvPci]\n"));  
         if (pioRecvPci == NULL)  
         {  
                 DEBUG_SCARD(("NULL\n"));  
         }  
         else  
         {  
                 hexdump((void *) pioRecvPci, pioRecvPci->cbPciLength);  
         }  
         DEBUG_SCARD(("[sendBuf]\n"));  
         hexdump(sendBuf, cbSendLength);  
         DEBUG_SCARD(("++++++++++\n"));  
 #endif  
1544    
1545          myCbRecvLength = cbRecvLength;          myCbRecvLength = cbRecvLength;
1546          myPioSendPci = SC_xmalloc(&lcHandle,          myPioSendPci = SC_xmalloc(&lcHandle,
# Line 1578  TS_SCardTransmit(STREAM in, STREAM out) Line 1572  TS_SCardTransmit(STREAM in, STREAM out)
1572          if (cbRecvLength > 448)          if (cbRecvLength > 448)
1573          {          {
1574                  warning("Card response limited from %d to 448 bytes!\n", cbRecvLength);                  warning("Card response limited from %d to 448 bytes!\n", cbRecvLength);
1575                  DEBUG_SCARD(("[RECV LEN %d -> %d]\n", (unsigned int) cbRecvLength, 400));                  DEBUG_SCARD(("SCARD:    Truncated %d to %d\n", (unsigned int) cbRecvLength, 448));
1576                  cbRecvLength = 448;                  cbRecvLength = 448;
1577          }          }
1578    
1579          if (pioRecvPci)          if (pioRecvPci)
1580          {          {
1581                  copyIORequest_MyPCSCToServer(myPioRecvPci, pioRecvPci);                  /*
1582                     * pscs-lite mishandles this structure in some cases.
1583                     * make sure we only copy it if it is valid.
1584                     */
1585                    if (myPioRecvPci->cbPciLength >= sizeof(MYPCSC_SCARD_IO_REQUEST))
1586                            copyIORequest_MyPCSCToServer(myPioRecvPci, pioRecvPci);
1587          }          }
1588    
1589          if (rv != SCARD_S_SUCCESS)          if (rv != SCARD_S_SUCCESS)
1590          {          {
1591                  DEBUG_SCARD(("<--ERROR SCardTransmit Code=0x%.8x-->\n", (unsigned int) rv));                  DEBUG_SCARD(("SCARD: -> Failure: %s (0x%08x)\n",
1592                                 pcsc_stringify_error(rv), (unsigned int) rv));
1593          }          }
1594          else          else
1595          {          {
1596  #ifdef WITH_DEBUG_SCARD                  DEBUG_SCARD(("SCARD: -> Success (%d bytes)\n", (int) cbRecvLength));
                 DEBUG_SCARD(("<--SUCCESS SCardTransmit-->\n"));  
                 DEBUG_SCARD(("RESULT %d\n", (unsigned int) cbRecvLength));  
                 hexdump(recvBuf, cbRecvLength);  
                 if (myPioRecvPci)  
                 {  
                         DEBUG_SCARD(("--- myPioRecvPci ---\n"));  
                         hexdump((void *) myPioRecvPci, myPioRecvPci->cbPciLength);  
                 }  
                 DEBUG_SCARD(("------------------\n"));  
 #endif  
1597  #if 0  #if 0
1598                  if ((pioRecvPci != NULL) && (pioRecvPci->cbPciLength > 0))                  if ((pioRecvPci != NULL) && (mypioRecvPci->cbPciLength > 0))
1599                  {                  {
1600                          out_uint32_le(out, (DWORD) pioRecvPci); /* if not NULL, this 4 bytes indicates that pioRecvPci is present */                          out_uint32_le(out, (DWORD) pioRecvPci); /* if not NULL, this 4 bytes indicates that pioRecvPci is present */
1601                  }                  }
# Line 1616  TS_SCardTransmit(STREAM in, STREAM out) Line 1606  TS_SCardTransmit(STREAM in, STREAM out)
1606                  outBufferStart(out, cbRecvLength);      /* start of recvBuf output */                  outBufferStart(out, cbRecvLength);      /* start of recvBuf output */
1607    
1608  #if 0  #if 0
1609                  if ((pioRecvPci) && (pioRecvPci->cbPciLength > 0))                  if ((pioRecvPci) && (mypioRecvPci->cbPciLength > 0))
1610                  {                  {
1611                          out_uint32_le(out, pioRecvPci->dwProtocol);                          out_uint32_le(out, mypioRecvPci->dwProtocol);
1612                          int len = pioRecvPci->cbPciLength - sizeof(pioRecvPci);                          int len = mypioRecvPci->cbPciLength - sizeof(mypioRecvPci);
1613                          outBufferStartWithLimit(out, len, 12);                          outBufferStartWithLimit(out, len, 12);
1614                          outBufferFinishWithLimit(out,                          outBufferFinishWithLimit(out,
1615                                                   (char *) ((DWORD) pioRecvPci + sizeof(pioRecvPci)),                                                   (char *) ((DWORD) pioRecvPci + sizeof(pioRecvPci)),
# Line 1629  TS_SCardTransmit(STREAM in, STREAM out) Line 1619  TS_SCardTransmit(STREAM in, STREAM out)
1619    
1620                  outBufferFinish(out, (char *) recvBuf, cbRecvLength);                  outBufferFinish(out, (char *) recvBuf, cbRecvLength);
1621          }          }
1622          outForceAllignment(out, 8);          outForceAlignment(out, 8);
1623          SC_xfreeallmemory(&lcHandle);          SC_xfreeallmemory(&lcHandle);
1624          return rv;          return rv;
1625  }  }
1626    
1627  static MYPCSC_DWORD  static MYPCSC_DWORD
1628  TS_SCardStatus(STREAM in, STREAM out, BOOL wide)  TS_SCardStatus(STREAM in, STREAM out, RD_BOOL wide)
1629  {  {
1630          MYPCSC_DWORD rv;          MYPCSC_DWORD rv;
1631          SERVER_SCARDCONTEXT hCard;          SERVER_SCARDCONTEXT hCard;
# Line 1655  TS_SCardStatus(STREAM in, STREAM out, BO Line 1645  TS_SCardStatus(STREAM in, STREAM out, BO
1645          in->p += 0x04;          in->p += 0x04;
1646          myHCard = scHandleToMyPCSC(hCard);          myHCard = scHandleToMyPCSC(hCard);
1647    
1648          DEBUG_SCARD(("[hCard 0x%.8x]\n", (unsigned int) hCard));          DEBUG_SCARD(("SCARD: SCardStatus(hcard: 0x%08x [0x%08lx], reader len: %d bytes, atr len: %d bytes)\n", (unsigned) hCard, (unsigned long) myHCard, (int) dwReaderLen, (int) dwAtrLen));
         DEBUG_SCARD(("[myHCard 0x%016lx]\n", (unsigned long) myHCard));  
         DEBUG_SCARD(("[dwReaderLen %d]\n", (unsigned int) dwReaderLen));  
         DEBUG_SCARD(("[dwAtrLen %d]\n", (unsigned int) dwAtrLen));  
1649    
1650          if (dwReaderLen <= 0 || dwReaderLen == SCARD_AUTOALLOCATE || dwReaderLen > SCARD_MAX_MEM)          if (dwReaderLen <= 0 || dwReaderLen == SCARD_AUTOALLOCATE || dwReaderLen > SCARD_MAX_MEM)
1651                  dwReaderLen = SCARD_MAX_MEM;                  dwReaderLen = SCARD_MAX_MEM;
1652          if (dwAtrLen <= 0 || dwAtrLen == SCARD_AUTOALLOCATE || dwAtrLen > SCARD_MAX_MEM)          if (dwAtrLen <= 0 || dwAtrLen == SCARD_AUTOALLOCATE || dwAtrLen > SCARD_MAX_MEM)
1653                  dwAtrLen = SCARD_MAX_MEM;                  dwAtrLen = SCARD_MAX_MEM;
1654    
1655    #if 1
1656            /*
1657             * Active client sometimes sends a readerlen *just* big enough
1658             * SCardStatus doesn't seem to like this. This is a workaround,
1659             * aka hack!
1660             */
1661            dwReaderLen = 200;
1662    #endif
1663    
1664          readerName = SC_xmalloc(&lcHandle, dwReaderLen + 2);          readerName = SC_xmalloc(&lcHandle, dwReaderLen + 2);
1665          if (!readerName)          if (!readerName)
1666                  return SC_returnNoMemoryError(&lcHandle, in, out);                  return SC_returnNoMemoryError(&lcHandle, in, out);
# Line 1686  TS_SCardStatus(STREAM in, STREAM out, BO Line 1682  TS_SCardStatus(STREAM in, STREAM out, BO
1682    
1683          if (rv != SCARD_S_SUCCESS)          if (rv != SCARD_S_SUCCESS)
1684          {          {
1685                  DEBUG_SCARD(("<--ERROR SCardStatus Code=0x%.8x-->\n", (unsigned int) rv));                  DEBUG_SCARD(("SCARD: -> Failure: %s (0x%08x)\n",
1686                                 pcsc_stringify_error(rv), (unsigned int) rv));
1687                  return SC_returnCode(rv, &lcHandle, in, out);                  return SC_returnCode(rv, &lcHandle, in, out);
1688          }          }
1689          else          else
1690          {          {
1691  #ifdef WITH_DEBUG_SCARD                  int i;
1692                  DEBUG_SCARD(("<--SUCCESS SCardStatus-->\n"));  
1693                  DEBUG_SCARD(("[dwState 0x%.8x]\n", (unsigned int) dwState));                  DEBUG_SCARD(("SCARD: -> Success (state: 0x%08x, proto: 0x%08x)\n",
1694                  DEBUG_SCARD(("[dwProtocol 0x%.8x]\n", (unsigned int) dwProtocol));                               (unsigned) dwState, (unsigned) dwProtocol));
1695                  DEBUG_SCARD(("[Reader Name]\n"));                  DEBUG_SCARD(("SCARD:        Reader: \"%s\"\n", readerName ? readerName : "NULL"));
1696                  hexdump((unsigned char *) readerName, dwReaderLen);                  DEBUG_SCARD(("SCARD:        ATR: "));
1697                  DEBUG_SCARD(("[Atr]\n"));                  for (i = 0; i < dwAtrLen; i++)
1698                  hexdump(atr, dwAtrLen);                  {
1699  #endif                          DEBUG_SCARD(("%02x%c", atr[i], (i == dwAtrLen - 1) ? ' ' : ':'));
1700                    }
1701                    DEBUG_SCARD(("\n"));
1702    
1703                  if (dwState & (SCARD_SPECIFIC | SCARD_NEGOTIABLE))                  if (dwState & (SCARD_SPECIFIC | SCARD_NEGOTIABLE))
1704                          dwState = 0x00000006;                          dwState = 0x00000006;
1705                  else                  else
# Line 1745  TS_SCardStatus(STREAM in, STREAM out, BO Line 1745  TS_SCardStatus(STREAM in, STREAM out, BO
1745                  out_uint32_le(out, dataLength);                  out_uint32_le(out, dataLength);
1746                  out->p = psave;                  out->p = psave;
1747          }          }
1748          outForceAllignment(out, 8);          outForceAlignment(out, 8);
1749          SC_xfreeallmemory(&lcHandle);          SC_xfreeallmemory(&lcHandle);
1750          return rv;          return rv;
1751  }  }
# Line 1769  TS_SCardState(STREAM in, STREAM out) Line 1769  TS_SCardState(STREAM in, STREAM out)
1769          in->p += 0x04;          in->p += 0x04;
1770          myHCard = scHandleToMyPCSC(hCard);          myHCard = scHandleToMyPCSC(hCard);
1771    
1772          DEBUG_SCARD(("[hCard 0x%.8x]\n", (unsigned int) hCard));          DEBUG_SCARD(("SCARD: SCardState(hcard: 0x%08x [0x%08lx], atr len: %d bytes)\n",
1773          DEBUG_SCARD(("[myHCard 0x%.8x]\n", (unsigned int) myHCard));                       (unsigned) hCard, (unsigned long) myHCard, (int) dwAtrLen));
         DEBUG_SCARD(("[dwAtrLen %d]\n", (unsigned int) dwAtrLen));  
1774    
1775          dwReaderLen = SCARD_MAX_MEM;          dwReaderLen = SCARD_MAX_MEM;
1776          if (dwAtrLen <= 0 || dwAtrLen == SCARD_AUTOALLOCATE || dwAtrLen > SCARD_MAX_MEM)          if (dwAtrLen <= 0 || dwAtrLen == SCARD_AUTOALLOCATE || dwAtrLen > SCARD_MAX_MEM)
# Line 1797  TS_SCardState(STREAM in, STREAM out) Line 1796  TS_SCardState(STREAM in, STREAM out)
1796    
1797          if (rv != SCARD_S_SUCCESS)          if (rv != SCARD_S_SUCCESS)
1798          {          {
1799                  DEBUG_SCARD(("<--ERROR SCardStatus (no ScardState) Code=0x%.8x-->\n",                  DEBUG_SCARD(("SCARD: -> Failure: %s (0x%08x)\n",
1800                               (unsigned int) rv));                               pcsc_stringify_error(rv), (unsigned int) rv));
1801                  return SC_returnCode(rv, &lcHandle, in, out);                  return SC_returnCode(rv, &lcHandle, in, out);
1802          }          }
1803          else          else
1804          {          {
1805  #ifdef WITH_DEBUG_SCARD                  int i;
1806                  DEBUG_SCARD(("<--SUCCESS SCardStatus (no ScardState)-->\n"));  
1807                  DEBUG_SCARD(("[dwState 0x%.8x]\n", (unsigned int) dwState));                  DEBUG_SCARD(("SCARD: -> Success (state: 0x%08x, proto: 0x%08x)\n",
1808                  DEBUG_SCARD(("[dwProtocol 0x%.8x]\n", (unsigned int) dwProtocol));                               (unsigned) dwState, (unsigned) dwProtocol));
1809                  DEBUG_SCARD(("[Atr]\n"));                  DEBUG_SCARD(("SCARD:        ATR: "));
1810                  hexdump(atr, dwAtrLen);                  for (i = 0; i < dwAtrLen; i++)
1811  #endif                  {
1812                            DEBUG_SCARD(("%02x%c", atr[i], (i == dwAtrLen - 1) ? ' ' : ':'));
1813                    }
1814                    DEBUG_SCARD(("\n"));
1815    
1816                  if (dwState & (SCARD_SPECIFIC | SCARD_NEGOTIABLE))                  if (dwState & (SCARD_SPECIFIC | SCARD_NEGOTIABLE))
1817                          dwState = 0x00000006;                          dwState = 0x00000006;
1818                  else                  else
# Line 1839  TS_SCardState(STREAM in, STREAM out) Line 1842  TS_SCardState(STREAM in, STREAM out)
1842                  out_uint8p(out, atr, dwAtrLen);                  out_uint8p(out, atr, dwAtrLen);
1843                  outRepos(out, dwAtrLen);                  outRepos(out, dwAtrLen);
1844          }          }
1845          outForceAllignment(out, 8);          outForceAlignment(out, 8);
1846          SC_xfreeallmemory(&lcHandle);          SC_xfreeallmemory(&lcHandle);
1847          return rv;          return rv;
1848  }  }
# Line 1863  TS_SCardListReaderGroups(STREAM in, STRE Line 1866  TS_SCardListReaderGroups(STREAM in, STRE
1866          in->p += 0x04;          in->p += 0x04;
1867          in_uint32_le(in, hContext);          in_uint32_le(in, hContext);
1868    
1869            DEBUG_SCARD(("SCARD: SCardListReaderGroups(context: 0x%08x, groups: %d)\n",
1870                         (unsigned) hContext, (int) dwGroups));
1871    
1872          if (dwGroups <= 0 || dwGroups == SCARD_AUTOALLOCATE || dwGroups > SCARD_MAX_MEM)          if (dwGroups <= 0 || dwGroups == SCARD_AUTOALLOCATE || dwGroups > SCARD_MAX_MEM)
1873                  dwGroups = SCARD_MAX_MEM;                  dwGroups = SCARD_MAX_MEM;
1874    
# Line 1876  TS_SCardListReaderGroups(STREAM in, STRE Line 1882  TS_SCardListReaderGroups(STREAM in, STRE
1882    
1883          if (rv)          if (rv)
1884          {          {
1885                  DEBUG_SCARD(("<--ERROR SCardListReaderGroups Code=0x%.8x-->\n", (unsigned int) rv));                  DEBUG_SCARD(("SCARD: -> Failure: %s (0x%08x)\n",
1886                                 pcsc_stringify_error(rv), (unsigned int) rv));
1887                  return SC_returnCode(rv, &lcHandle, in, out);                  return SC_returnCode(rv, &lcHandle, in, out);
1888          }          }
1889          else          else
1890          {          {
1891                  DEBUG_SCARD(("<--SUCCESS SCardListReaderGroups-->\n"));                  int i;
1892                    char *cur;
1893    
1894                    DEBUG_SCARD(("SCARD: -> Success\n"));
1895                    for (i = 0, cur = szGroups; i < dwGroups; i++, cur += strlen(cur) + 1)
1896                    {
1897                            DEBUG_SCARD(("SCARD:    %s\n", cur));
1898                    }
1899          }          }
1900    
1901    
# Line 1892  TS_SCardListReaderGroups(STREAM in, STRE Line 1906  TS_SCardListReaderGroups(STREAM in, STRE
1906          outRepos(out, dwGroups);          outRepos(out, dwGroups);
1907          out_uint32_le(out, 0x00000000);          out_uint32_le(out, 0x00000000);
1908    
1909          outForceAllignment(out, 8);          outForceAlignment(out, 8);
1910          SC_xfreeallmemory(&lcHandle);          SC_xfreeallmemory(&lcHandle);
1911          return rv;          return rv;
1912  }  }
# Line 1918  TS_SCardGetAttrib(STREAM in, STREAM out) Line 1932  TS_SCardGetAttrib(STREAM in, STREAM out)
1932    
1933          dwAttrId = dwAttrId & 0x0000FFFF;          dwAttrId = dwAttrId & 0x0000FFFF;
1934    
1935          DEBUG_SCARD(("[hCard = 0x%.8x]\n", (unsigned int) hCard));          DEBUG_SCARD(("SCARD: SCardGetAttrib(hcard: 0x%08x [0x%08lx], attrib: 0x%08x (%d bytes))\n",
1936          DEBUG_SCARD(("[myHCard 0x%.8x]\n", (unsigned int) myHCard));                       (unsigned) hCard, (unsigned long) myHCard,
1937          DEBUG_SCARD(("[dwAttrId = 0x%.8x]\n", (unsigned int) dwAttrId));                       (unsigned) dwAttrId, (int) dwAttrLen));
         DEBUG_SCARD(("[dwAttrLen = 0x%.8x]\n", (unsigned int) dwAttrLen));  
1938    
1939          if (dwAttrLen > MAX_BUFFER_SIZE)          if (dwAttrLen > MAX_BUFFER_SIZE)
1940                  dwAttrLen = MAX_BUFFER_SIZE;                  dwAttrLen = MAX_BUFFER_SIZE;
# Line 1947  TS_SCardGetAttrib(STREAM in, STREAM out) Line 1960  TS_SCardGetAttrib(STREAM in, STREAM out)
1960    
1961          if (dwAttrId == 0x00000100 && rv != SCARD_S_SUCCESS)          if (dwAttrId == 0x00000100 && rv != SCARD_S_SUCCESS)
1962          {          {
1963                  DEBUG_SCARD(("Get Attribute ATTR_VENDOR_NAME\n"));                  DEBUG_SCARD(("SCARD:    Faking attribute ATTR_VENDOR_NAME\n"));
1964                  pthread_mutex_lock(&hcardAccess);                  pthread_mutex_lock(&hcardAccess);
1965                  PSCHCardRec hcard = hcardFirst;                  PSCHCardRec hcard = hcardFirst;
1966                  while (hcard)                  while (hcard)
# Line 1967  TS_SCardGetAttrib(STREAM in, STREAM out) Line 1980  TS_SCardGetAttrib(STREAM in, STREAM out)
1980    
1981          if (rv != SCARD_S_SUCCESS)          if (rv != SCARD_S_SUCCESS)
1982          {          {
1983                  DEBUG_SCARD(("<--ERROR SCardGetAttrib Code=0x%.8x-->\n", (unsigned int) rv));                  DEBUG_SCARD(("SCARD: -> Failure: %s (0x%08x)\n",
1984                                 pcsc_stringify_error(rv), (unsigned int) rv));
1985                  return SC_returnCode(rv, &lcHandle, in, out);                  return SC_returnCode(rv, &lcHandle, in, out);
1986          }          }
1987          else          else
1988          {          {
1989  #ifdef WITH_DEBUG_SCARD                  DEBUG_SCARD(("SCARD: -> Success (%d bytes)\n", (int) dwAttrLen));
1990                  DEBUG_SCARD(("<--SUCCESS SCardGetAttrib-->\n"));  
                 DEBUG_SCARD(("[LENGTH %d]\n", (unsigned int) dwAttrLen));  
                 DEBUG_SCARD(("+++++++++++++++++++++\n"));  
                 hexdump(pbAttr, dwAttrLen);  
                 DEBUG_SCARD(("+++++++++++++++++++++\n"));  
 #endif  
1991                  out_uint32_le(out, dwAttrLen);                  out_uint32_le(out, dwAttrLen);
1992                  out_uint32_le(out, 0x00000200);                  out_uint32_le(out, 0x00000200);
1993                  out_uint32_le(out, dwAttrLen);                  out_uint32_le(out, dwAttrLen);
# Line 1993  TS_SCardGetAttrib(STREAM in, STREAM out) Line 2002  TS_SCardGetAttrib(STREAM in, STREAM out)
2002                  outRepos(out, dwAttrLen);                  outRepos(out, dwAttrLen);
2003                  out_uint32_le(out, 0x00000000);                  out_uint32_le(out, 0x00000000);
2004          }          }
2005          outForceAllignment(out, 8);          outForceAlignment(out, 8);
2006          return rv;          return rv;
2007  }  }
2008    
# Line 2018  TS_SCardSetAttrib(STREAM in, STREAM out) Line 2027  TS_SCardSetAttrib(STREAM in, STREAM out)
2027    
2028          dwAttrId = dwAttrId & 0x0000FFFF;          dwAttrId = dwAttrId & 0x0000FFFF;
2029    
2030          DEBUG_SCARD(("[hCard = 0x%.8x]\n", (unsigned int) hCard));          DEBUG_SCARD(("SCARD: SCardSetAttrib(hcard: 0x%08x [0x%08lx], attrib: 0x%08x (%d bytes))\n",
2031          DEBUG_SCARD(("[myHCard 0x%.8x]\n", (unsigned int) myHCard));                       (unsigned) hCard, (unsigned long) myHCard,
2032          DEBUG_SCARD(("[dwAttrId = 0x%.8x]\n", (unsigned int) dwAttrId));                       (unsigned) dwAttrId, (int) dwAttrLen));
         DEBUG_SCARD(("[dwAttrLen = 0x%.8x]\n", (unsigned int) dwAttrLen));  
2033    
2034          if (dwAttrLen > MAX_BUFFER_SIZE)          if (dwAttrLen > MAX_BUFFER_SIZE)
2035                  dwAttrLen = MAX_BUFFER_SIZE;                  dwAttrLen = MAX_BUFFER_SIZE;
# Line 2033  TS_SCardSetAttrib(STREAM in, STREAM out) Line 2041  TS_SCardSetAttrib(STREAM in, STREAM out)
2041          in_uint8a(in, pbAttr, dwAttrLen);          in_uint8a(in, pbAttr, dwAttrLen);
2042          rv = SCardSetAttrib(myHCard, (MYPCSC_DWORD) dwAttrId, pbAttr, (MYPCSC_DWORD) dwAttrLen);          rv = SCardSetAttrib(myHCard, (MYPCSC_DWORD) dwAttrId, pbAttr, (MYPCSC_DWORD) dwAttrLen);
2043    
2044          if (rv)          if (rv != SCARD_S_SUCCESS)
2045          {          {
2046                  DEBUG_SCARD(("<--ERROR SCardSetAttrib Code=0x%.8x-->\n", (unsigned int) rv));                  DEBUG_SCARD(("SCARD: -> Failure: %s (0x%08x)\n",
2047                                 pcsc_stringify_error(rv), (unsigned int) rv));
2048          }          }
2049          else          else
2050          {          {
2051                  DEBUG_SCARD(("<--SUCCESS SCardSetAttrib-->\n"));                  DEBUG_SCARD(("SCARD: -> Success\n"));
2052          }          }
2053    
2054          out_uint32_le(out, 0x00000000);          out_uint32_le(out, 0x00000000);
2055          out_uint32_le(out, 0x00000200);          out_uint32_le(out, 0x00000200);
2056          out_uint32_le(out, 0x00000000);          out_uint32_le(out, 0x00000000);
2057          out_uint32_le(out, 0x00000000);          out_uint32_le(out, 0x00000000);
2058          outForceAllignment(out, 8);          outForceAlignment(out, 8);
2059          SC_xfreeallmemory(&lcHandle);          SC_xfreeallmemory(&lcHandle);
2060          return rv;          return rv;
2061  }  }
# Line 2109  TS_SCardControl(STREAM in, STREAM out) Line 2118  TS_SCardControl(STREAM in, STREAM out)
2118          if (!pOutBuffer)          if (!pOutBuffer)
2119                  return SC_returnNoMemoryError(&lcHandle, in, out);                  return SC_returnNoMemoryError(&lcHandle, in, out);
2120    
2121  #ifdef WITH_DEBUG_SCARD          DEBUG_SCARD(("SCARD: SCardControl(context: 0x%08x, hcard: 0x%08x, code: 0x%08x, in: %d bytes, out: %d bytes)\n", (unsigned) hContext, (unsigned) hCard, (unsigned) dwControlCode, (int) nInBufferSize, (int) nOutBufferSize));
         DEBUG_SCARD(("[hContext = 0x%.8x]\n", (unsigned int) hContext));  
         DEBUG_SCARD(("[hCard = 0x%.8x]\n", (unsigned int) hCard));  
         DEBUG_SCARD(("[dwControlCode = 0x%.8x]\n", (unsigned int) dwControlCode));  
         DEBUG_SCARD(("[nInBufferSize  = %d]\n", (unsigned int) nInBufferSize));  
         DEBUG_SCARD(("[nOutBufferSize  = %d]\n", (unsigned int) nOutBufferSize));  
         if (nInBufferSize > 0)  
         {  
                 DEBUG_SCARD(("[In buffer]\n"));  
                 hexdump((unsigned char *) pInBuffer, nInBufferSize);  
         }  
         DEBUG_SCARD(("---> Calling SCardControl\n"));  
 #endif  
2122    
2123          sc_nBytesReturned = nBytesReturned;          sc_nBytesReturned = nBytesReturned;
2124          myHCard = scHandleToMyPCSC(hCard);          myHCard = scHandleToMyPCSC(hCard);
# Line 2135  TS_SCardControl(STREAM in, STREAM out) Line 2132  TS_SCardControl(STREAM in, STREAM out)
2132  #endif  #endif
2133          nBytesReturned = sc_nBytesReturned;          nBytesReturned = sc_nBytesReturned;
2134    
 #ifdef WITH_DEBUG_SCARD  
2135          if (rv != SCARD_S_SUCCESS)          if (rv != SCARD_S_SUCCESS)
2136          {          {
2137                  DEBUG_SCARD(("<--ERROR SCardControl Code=0x%.8x-->\n", (unsigned int) rv));                  DEBUG_SCARD(("SCARD: -> Failure: %s (0x%08x)\n",
2138                                 pcsc_stringify_error(rv), (unsigned int) rv));
2139          }          }
2140          else          else
2141          {          {
2142                  DEBUG_SCARD(("<--SUCCESS SCardControl-->\n"));                  DEBUG_SCARD(("SCARD: -> Success (out: %d bytes)\n", (int) nBytesReturned));
                 DEBUG_SCARD(("[LENGTH %d]\n", (unsigned int) nBytesReturned));  
                 DEBUG_SCARD(("+++++++++++++++++++++\n"));  
                 hexdump((unsigned char *) pOutBuffer, nBytesReturned);  
                 DEBUG_SCARD(("+++++++++++++++++++++\n"));  
2143          }          }
 #endif  
2144    
2145          out_uint32_le(out, nBytesReturned);          out_uint32_le(out, nBytesReturned);
2146          out_uint32_le(out, 0x00000004);          out_uint32_le(out, 0x00000004);
# Line 2159  TS_SCardControl(STREAM in, STREAM out) Line 2151  TS_SCardControl(STREAM in, STREAM out)
2151                  outRepos(out, nBytesReturned);                  outRepos(out, nBytesReturned);
2152          }          }
2153    
2154          outForceAllignment(out, 8);          outForceAlignment(out, 8);
2155          SC_xfreeallmemory(&lcHandle);          SC_xfreeallmemory(&lcHandle);
2156          return rv;          return rv;
2157  }  }
# Line 2167  TS_SCardControl(STREAM in, STREAM out) Line 2159  TS_SCardControl(STREAM in, STREAM out)
2159  static MYPCSC_DWORD  static MYPCSC_DWORD
2160  TS_SCardAccessStartedEvent(STREAM in, STREAM out)  TS_SCardAccessStartedEvent(STREAM in, STREAM out)
2161  {  {
2162            DEBUG_SCARD(("SCARD: SCardAccessStartedEvent()\n"));
2163          out_uint8s(out, 8);          out_uint8s(out, 8);
2164          return SCARD_S_SUCCESS;          return SCARD_S_SUCCESS;
2165  }  }
2166    
2167    
2168  static NTSTATUS  static RD_NTSTATUS
2169  scard_device_control(NTHANDLE handle, uint32 request, STREAM in, STREAM out)  scard_device_control(RD_NTHANDLE handle, uint32 request, STREAM in, STREAM out)
2170  {  {
2171          SERVER_DWORD Result = 0x00000000;          SERVER_DWORD Result = 0x00000000;
2172          unsigned char *psize, *pend, *pStatusCode;          unsigned char *psize, *pend, *pStatusCode;
2173          SERVER_DWORD addToEnd = 0;          SERVER_DWORD addToEnd = 0;
 #ifdef WITH_DEBUG_SCARD  
         unsigned char *pbeg = out->p;  
2174    
         DEBUG_SCARD(("--------------------------------\n"));  
         DEBUG_SCARD(("[NTHANDLE %08X]\n", handle));  
         DEBUG_SCARD(("[REQUEST %08X]\n", request));  
         DEBUG_SCARD(("[INPUT DUMP]--------------------\n"));  
         hexdump(in->p, in->end - in->p);  
 #endif  
2175          /* Processing request */          /* Processing request */
2176    
2177          out_uint32_le(out, 0x00081001); /* Header lines */          out_uint32_le(out, 0x00081001); /* Header lines */
# Line 2202  scard_device_control(NTHANDLE handle, ui Line 2187  scard_device_control(NTHANDLE handle, ui
2187                          /* SCardEstablishContext */                          /* SCardEstablishContext */
2188                  case SC_ESTABLISH_CONTEXT:                  case SC_ESTABLISH_CONTEXT:
2189                          {                          {
                                 DEBUG_SCARD(("<---SCardEstablishContext--->\n"));  
2190                                  Result = (SERVER_DWORD) TS_SCardEstablishContext(in, out);                                  Result = (SERVER_DWORD) TS_SCardEstablishContext(in, out);
2191                                  break;                                  break;
2192                          }                          }
2193                          /* SCardReleaseContext */                          /* SCardReleaseContext */
2194                  case SC_RELEASE_CONTEXT:                  case SC_RELEASE_CONTEXT:
2195                          {                          {
                                 DEBUG_SCARD(("<---SCardReleaseContext--->\n"));  
2196                                  Result = (SERVER_DWORD) TS_SCardReleaseContext(in, out);                                  Result = (SERVER_DWORD) TS_SCardReleaseContext(in, out);
2197                                  break;                                  break;
2198                          }                          }
2199                          /* SCardIsValidContext */                          /* SCardIsValidContext */
2200                  case SC_IS_VALID_CONTEXT:                  case SC_IS_VALID_CONTEXT:
2201                          {                          {
                                 DEBUG_SCARD(("<---SCardIsValidContext--->\n"));  
2202                                  Result = (SERVER_DWORD) TS_SCardIsValidContext(in, out);                                  Result = (SERVER_DWORD) TS_SCardIsValidContext(in, out);
2203                                  break;                                  break;
2204                          }                          }
# Line 2224  scard_device_control(NTHANDLE handle, ui Line 2206  scard_device_control(NTHANDLE handle, ui
2206                  case SC_LIST_READERS:   /* SCardListReadersA */                  case SC_LIST_READERS:   /* SCardListReadersA */
2207                  case SC_LIST_READERS + 4:       /* SCardListReadersW */                  case SC_LIST_READERS + 4:       /* SCardListReadersW */
2208                          {                          {
2209                                  BOOL wide = request != SC_LIST_READERS;                                  RD_BOOL wide = request != SC_LIST_READERS;
                                 DEBUG_SCARD(("<---SCardListReaders---> (%s)\n",  
                                              (wide) ? ("WIDE") : ("ASCII")));  
2210                                  Result = (SERVER_DWORD) TS_SCardListReaders(in, out, wide);                                  Result = (SERVER_DWORD) TS_SCardListReaders(in, out, wide);
2211                                  break;                                  break;
2212                          }                          }
# Line 2234  scard_device_control(NTHANDLE handle, ui Line 2214  scard_device_control(NTHANDLE handle, ui
2214                  case SC_CONNECT:        /* ScardConnectA */                  case SC_CONNECT:        /* ScardConnectA */
2215                  case SC_CONNECT + 4:    /* SCardConnectW */                  case SC_CONNECT + 4:    /* SCardConnectW */
2216                          {                          {
2217                                  BOOL wide = request != SC_CONNECT;                                  RD_BOOL wide = request != SC_CONNECT;
                                 DEBUG_SCARD(("<---SCardConnect---> (%s)\n",  
                                              (wide) ? ("WIDE") : ("ASCII")));  
2218                                  Result = (SERVER_DWORD) TS_SCardConnect(in, out, wide);                                  Result = (SERVER_DWORD) TS_SCardConnect(in, out, wide);
2219                                  break;                                  break;
2220                          }                          }
2221                          /* ScardReconnect */                          /* ScardReconnect */
2222                  case SC_RECONNECT:                  case SC_RECONNECT:
2223                          {                          {
                                 DEBUG_SCARD(("<---SCardReconnect--->\n"));  
2224                                  Result = (SERVER_DWORD) TS_SCardReconnect(in, out);                                  Result = (SERVER_DWORD) TS_SCardReconnect(in, out);
2225                                  break;                                  break;
2226                          }                          }
2227                          /* ScardDisconnect */                          /* ScardDisconnect */
2228                  case SC_DISCONNECT:                  case SC_DISCONNECT:
2229                          {                          {
                                 DEBUG_SCARD(("<---SCardDisconnect--->\n"));  
2230                                  Result = (SERVER_DWORD) TS_SCardDisconnect(in, out);                                  Result = (SERVER_DWORD) TS_SCardDisconnect(in, out);
2231                                  break;                                  break;
2232                          }                          }
# Line 2258  scard_device_control(NTHANDLE handle, ui Line 2234  scard_device_control(NTHANDLE handle, ui
2234                  case SC_GET_STATUS_CHANGE:      /* SCardGetStatusChangeA */                  case SC_GET_STATUS_CHANGE:      /* SCardGetStatusChangeA */
2235                  case SC_GET_STATUS_CHANGE + 4:  /* SCardGetStatusChangeW */                  case SC_GET_STATUS_CHANGE + 4:  /* SCardGetStatusChangeW */
2236                          {                          {
2237                                  BOOL wide = request != SC_GET_STATUS_CHANGE;                                  RD_BOOL wide = request != SC_GET_STATUS_CHANGE;
                                 DEBUG_SCARD(("<---SCardGetStatusChange---> (%s)\n",  
                                              (wide) ? ("WIDE") : ("ASCII")));  
2238                                  Result = (SERVER_DWORD) TS_SCardGetStatusChange(in, out, wide);                                  Result = (SERVER_DWORD) TS_SCardGetStatusChange(in, out, wide);
2239                                  break;                                  break;
2240                          }                          }
2241                          /* SCardCancel */                          /* SCardCancel */
2242                  case SC_CANCEL:                  case SC_CANCEL:
2243                          {                          {
                                 DEBUG_SCARD(("<---SCardCancel--->\n"));  
2244                                  Result = (SERVER_DWORD) TS_SCardCancel(in, out);                                  Result = (SERVER_DWORD) TS_SCardCancel(in, out);
2245                                  break;                                  break;
2246                          }                          }
# Line 2275  scard_device_control(NTHANDLE handle, ui Line 2248  scard_device_control(NTHANDLE handle, ui
2248                  case SC_LOCATE_CARDS_BY_ATR:    /* SCardLocateCardsByATRA */                  case SC_LOCATE_CARDS_BY_ATR:    /* SCardLocateCardsByATRA */
2249                  case SC_LOCATE_CARDS_BY_ATR + 4:        /* SCardLocateCardsByATRW */                  case SC_LOCATE_CARDS_BY_ATR + 4:        /* SCardLocateCardsByATRW */
2250                          {                          {
2251                                  BOOL wide = request != SC_LOCATE_CARDS_BY_ATR;                                  RD_BOOL wide = request != SC_LOCATE_CARDS_BY_ATR;
                                 DEBUG_SCARD(("<---SCardLocateCardsByATR---> (%s)\n",  
                                              (wide) ? ("WIDE") : ("ASCII")));  
2252                                  Result = (SERVER_DWORD) TS_SCardLocateCardsByATR(in, out, wide);                                  Result = (SERVER_DWORD) TS_SCardLocateCardsByATR(in, out, wide);
2253                                  break;                                  break;
2254                          }                          }
2255                          /* SCardBeginTransaction */                          /* SCardBeginTransaction */
2256                  case SC_BEGIN_TRANSACTION:                  case SC_BEGIN_TRANSACTION:
2257                          {                          {
                                 DEBUG_SCARD(("<---SCardBeginTransaction--->\n"));  
2258                                  Result = (SERVER_DWORD) TS_SCardBeginTransaction(in, out);                                  Result = (SERVER_DWORD) TS_SCardBeginTransaction(in, out);
2259                                  break;                                  break;
2260                          }                          }
2261                          /* SCardBeginTransaction */                          /* SCardBeginTransaction */
2262                  case SC_END_TRANSACTION:                  case SC_END_TRANSACTION:
2263                          {                          {
                                 DEBUG_SCARD(("<---SCardEndTransaction--->\n"));  
2264                                  Result = (SERVER_DWORD) TS_SCardEndTransaction(in, out);                                  Result = (SERVER_DWORD) TS_SCardEndTransaction(in, out);
2265                                  break;                                  break;
2266                          }                          }
2267                          /* ScardTransmit */                          /* ScardTransmit */
2268                  case SC_TRANSMIT:                  case SC_TRANSMIT:
2269                          {                          {
                                 DEBUG_SCARD(("<---SCardTransmit--->\n"));  
2270                                  Result = (SERVER_DWORD) TS_SCardTransmit(in, out);                                  Result = (SERVER_DWORD) TS_SCardTransmit(in, out);
2271                                  break;                                  break;
2272                          }                          }
2273                          /* SCardControl */                          /* SCardControl */
2274                  case SC_CONTROL:                  case SC_CONTROL:
2275                          {                          {
                                 DEBUG_SCARD(("<---SCardControl--->\n"));  
2276                                  Result = (SERVER_DWORD) TS_SCardControl(in, out);                                  Result = (SERVER_DWORD) TS_SCardControl(in, out);
2277                                  break;                                  break;
2278                          }                          }
# Line 2313  scard_device_control(NTHANDLE handle, ui Line 2280  scard_device_control(NTHANDLE handle, ui
2280  #ifndef WITH_PCSC120  #ifndef WITH_PCSC120
2281                  case SC_GETATTRIB:                  case SC_GETATTRIB:
2282                          {                          {
                                 DEBUG_SCARD(("<---SCardGetAttrib--->\n"));  
2283                                  Result = (SERVER_DWORD) TS_SCardGetAttrib(in, out);                                  Result = (SERVER_DWORD) TS_SCardGetAttrib(in, out);
2284                                  break;                                  break;
2285                          }                          }
2286  #endif  #endif
2287                  case SC_ACCESS_STARTED_EVENT:                  case SC_ACCESS_STARTED_EVENT:
2288                          {                          {
                                 DEBUG_SCARD(("<---SCardAccessStartedEvent-->\n"));  
2289                                  Result = (SERVER_DWORD) TS_SCardAccessStartedEvent(in, out);                                  Result = (SERVER_DWORD) TS_SCardAccessStartedEvent(in, out);
2290                                  break;                                  break;
2291                          }                          }
2292                  case SC_STATUS: /* SCardStatusA */                  case SC_STATUS: /* SCardStatusA */
2293                  case SC_STATUS + 4:     /* SCardStatusW */                  case SC_STATUS + 4:     /* SCardStatusW */
2294                          {                          {
2295                                  BOOL wide = request != SC_STATUS;                                  RD_BOOL wide = request != SC_STATUS;
                                 DEBUG_SCARD(("<---SCardStatus---> (%s)\n",  
                                              (wide) ? ("WIDE") : ("ASCII")));  
2296                                  Result = (SERVER_DWORD) TS_SCardStatus(in, out, wide);                                  Result = (SERVER_DWORD) TS_SCardStatus(in, out, wide);
2297                                  break;                                  break;
2298                          }                          }
2299                  case SC_STATE:  /* SCardState */                  case SC_STATE:  /* SCardState */
2300                          {                          {
                                 DEBUG_SCARD(("<---SCardState--->"));  
2301                                  Result = (SERVER_DWORD) TS_SCardState(in, out);                                  Result = (SERVER_DWORD) TS_SCardState(in, out);
2302                                  break;                                  break;
2303                          }                          }
2304                  default:                  default:
2305                          {                          {
2306                                  DEBUG_SCARD(("<---UNSUPPORTED-FUNC--->\n"));                                  warning("SCARD: Unknown function %d\n", (int) request);
2307                                  Result = 0x80100014;                                  Result = 0x80100014;
2308                                  out_uint8s(out, 256);                                  out_uint8s(out, 256);
2309                                  break;                                  break;
# Line 2368  scard_device_control(NTHANDLE handle, ui Line 2330  scard_device_control(NTHANDLE handle, ui
2330                  out_uint8s(out, addToEnd);                  out_uint8s(out, addToEnd);
2331          }          }
2332    
2333  #ifdef WITH_DEBUG_SCARD          return RD_STATUS_SUCCESS;
         DEBUG_SCARD(("[OUTPUT DUMP]-------------------\n"));  
         hexdump(pbeg, (size_t) (out->p) - (size_t) pbeg);  
         DEBUG_SCARD(("--------------------------------\n"));  
 #endif  
         return STATUS_SUCCESS;  
2334  }  }
2335    
2336  /* Thread functions */  /* Thread functions */
2337    
2338  static STREAM  static STREAM
2339  duplicateStream(PMEM_HANDLE * handle, STREAM s, uint32 buffer_size, BOOL isInputStream)  duplicateStream(PMEM_HANDLE * handle, STREAM s, uint32 buffer_size, RD_BOOL isInputStream)
2340  {  {
2341          STREAM d = SC_xmalloc(handle, sizeof(struct stream));          STREAM d = SC_xmalloc(handle, sizeof(struct stream));
2342          if (d != NULL)          if (d != NULL)
# Line 2428  freeStream(PMEM_HANDLE * handle, STREAM Line 2385  freeStream(PMEM_HANDLE * handle, STREAM
2385  }  }
2386    
2387  static PSCThreadData  static PSCThreadData
2388  SC_addToQueue(NTHANDLE handle, uint32 request, STREAM in, STREAM out)  SC_addToQueue(RD_NTHANDLE handle, uint32 request, STREAM in, STREAM out)
2389  {  {
2390          PMEM_HANDLE lcHandle = NULL;          PMEM_HANDLE lcHandle = NULL;
2391          PSCThreadData data = SC_xmalloc(&lcHandle, sizeof(TSCThreadData));          PSCThreadData data = SC_xmalloc(&lcHandle, sizeof(TSCThreadData));
# Line 2466  SC_addToQueue(NTHANDLE handle, uint32 re Line 2423  SC_addToQueue(NTHANDLE handle, uint32 re
2423                  if (!queueFirst)                  if (!queueFirst)
2424                          queueFirst = data;                          queueFirst = data;
2425    
2426                  pthread_mutex_unlock(&queueEmpty);                  pthread_cond_broadcast(&queueEmpty);
2427                  pthread_mutex_unlock(&queueAccess);                  pthread_mutex_unlock(&queueAccess);
2428          }          }
2429          return data;          return data;
# Line 2486  static PSCThreadData Line 2443  static PSCThreadData
2443  SC_getNextInQueue()  SC_getNextInQueue()
2444  {  {
2445          PSCThreadData Result = NULL;          PSCThreadData Result = NULL;
2446    
2447          pthread_mutex_lock(&queueAccess);          pthread_mutex_lock(&queueAccess);
2448          if (queueFirst != NULL)  
2449            while (queueFirst == NULL)
2450                    pthread_cond_wait(&queueEmpty, &queueAccess);
2451    
2452            Result = queueFirst;
2453            queueFirst = queueFirst->next;
2454            if (!queueFirst)
2455          {          {
2456                  Result = queueFirst;                  queueLast = NULL;
                 queueFirst = queueFirst->next;  
                 if (!queueFirst)  
                 {  
                         queueLast = NULL;  
                         pthread_mutex_trylock(&queueEmpty);  
                 }  
                 Result->next = NULL;  
2457          }          }
2458            Result->next = NULL;
2459    
2460          pthread_mutex_unlock(&queueAccess);          pthread_mutex_unlock(&queueAccess);
2461    
2462          return Result;          return Result;
2463  }  }
2464    
# Line 2508  SC_deviceControl(PSCThreadData data) Line 2468  SC_deviceControl(PSCThreadData data)
2468          size_t buffer_len = 0;          size_t buffer_len = 0;
2469          scard_device_control(data->handle, data->request, data->in, data->out);          scard_device_control(data->handle, data->request, data->in, data->out);
2470          buffer_len = (size_t) data->out->p - (size_t) data->out->data;          buffer_len = (size_t) data->out->p - (size_t) data->out->data;
 #if 0  
         pthread_mutex_lock(&sendControl);  
 #endif  
2471          rdpdr_send_completion(data->device, data->id, 0, buffer_len, data->out->data, buffer_len);          rdpdr_send_completion(data->device, data->id, 0, buffer_len, data->out->data, buffer_len);
 #if 0  
         pthread_mutex_unlock(&sendControl);  
 #endif  
2472          SC_destroyThreadData(data);          SC_destroyThreadData(data);
2473  }  }
2474    
# Line 2522  SC_deviceControl(PSCThreadData data) Line 2476  SC_deviceControl(PSCThreadData data)
2476  static void *  static void *
2477  thread_function(PThreadListElement listElement)  thread_function(PThreadListElement listElement)
2478  {  {
2479  #ifdef WITH_DEBUG_SCARD          pthread_mutex_lock(&listElement->busy);
2480          long sTime = 0;          while (1)
 #endif  
         if ((listElement != NULL) && (listElement->data != NULL))  
2481          {          {
2482                  while (1)                  while (listElement->data == NULL)
2483                  {                          pthread_cond_wait(&listElement->nodata,
2484  #ifdef WITH_DEBUG_SCARD                              &listElement->busy);
2485                          sTime = time(NULL);  
2486  #endif                  SC_deviceControl(listElement->data);
2487                          pthread_mutex_lock(&listElement->nodata);                  listElement->data = NULL;
                         SC_deviceControl(listElement->data);  
                         listElement->data = NULL;  
                         DEBUG_SCARD(("[HANDLING TIME %d]\n", (int) (time(NULL) - sTime)));  
                         pthread_mutex_unlock(&listElement->busy);  
                 }  
2488          }          }
2489            pthread_mutex_unlock(&listElement->busy);
2490    
2491          pthread_exit(NULL);          pthread_exit(NULL);
2492          return NULL;          return NULL;
2493  }  }
# Line 2547  static void Line 2496  static void
2496  SC_handleRequest(PSCThreadData data)  SC_handleRequest(PSCThreadData data)
2497  {  {
2498          int Result = 0;          int Result = 0;
2499          PThreadListElement cur = threadList, last = threadList;          PThreadListElement cur;
   
         DEBUG_SCARD(("[THREAD COUNT %d]\n", threadCount));  
2500    
2501          while (cur)          for (cur = threadList; cur != NULL; cur = cur->next) {
2502          {                  if (cur->data == NULL) {
2503                  if (0 == pthread_mutex_trylock(&cur->busy))                          pthread_mutex_lock(&cur->busy);
2504                  {                          /* double check with lock held.... */
2505                            if (cur->data != NULL) {
2506                                    pthread_mutex_unlock(&cur->busy);
2507                                    continue;
2508                            }
2509                            
2510                            /* Wake up thread */
2511                          cur->data = data;                          cur->data = data;
2512                          pthread_mutex_unlock(&cur->nodata);                          pthread_cond_broadcast(&cur->nodata);
2513                            pthread_mutex_unlock(&cur->busy);
2514                          return;                          return;
2515                  }                  }
                 else  
                 {  
                         last = cur;  
                         cur = cur->next;  
                 }  
2516          }          }
2517    
2518          cur = SC_xmalloc(&threadListHandle, sizeof(TThreadListElement));          cur = SC_xmalloc(&threadListHandle, sizeof(TThreadListElement));
# Line 2572  SC_handleRequest(PSCThreadData data) Line 2521  SC_handleRequest(PSCThreadData data)
2521    
2522          threadCount++;          threadCount++;
2523    
         cur->next = NULL;  
2524          pthread_mutex_init(&cur->busy, NULL);          pthread_mutex_init(&cur->busy, NULL);
2525          pthread_mutex_init(&cur->nodata, NULL);          pthread_cond_init(&cur->nodata, NULL);
         pthread_mutex_trylock(&cur->busy);  
2526          cur->data = data;          cur->data = data;
         pthread_mutex_unlock(&cur->nodata);  
2527    
2528          Result = pthread_create(&cur->thread, NULL, (void *(*)(void *)) thread_function, cur);          Result = pthread_create(&cur->thread, NULL, (void *(*)(void *)) thread_function, cur);
2529          if (0 != Result)          if (0 != Result)
# Line 2587  SC_handleRequest(PSCThreadData data) Line 2533  SC_handleRequest(PSCThreadData data)
2533                  SC_destroyThreadData(data);                  SC_destroyThreadData(data);
2534                  data = NULL;                  data = NULL;
2535          }          }
2536          else if (last)          cur->next = threadList;
2537                  last->next = cur;          threadList = cur;
         else  
                 threadList = cur;  
2538  }  }
2539    
2540  static void *  static void *
# Line 2600  queue_handler_function(void *data) Line 2544  queue_handler_function(void *data)
2544          while (1)          while (1)
2545          {          {
2546                  cur_data = SC_getNextInQueue();                  cur_data = SC_getNextInQueue();
2547                  if (cur_data != NULL)                  switch (cur_data->request)
2548                  {                  {
2549                          switch (cur_data->request)                          case SC_ESTABLISH_CONTEXT:
2550                          {                          case SC_RELEASE_CONTEXT:
2551                                  case SC_ESTABLISH_CONTEXT:                                  {
2552                                  case SC_RELEASE_CONTEXT:                                          SC_deviceControl(cur_data);
2553                                          {                                          break;
2554                                                  SC_deviceControl(cur_data);                                  }
2555                                                  break;                          default:
2556                                          }                                  {
2557                                  default:                                          SC_handleRequest(cur_data);
2558                                          {                                          break;
2559                                                  SC_handleRequest(cur_data);                                  }
                                                 break;  
                                         }  
                         }  
                         cur_data = NULL;  
2560                  }                  }
                 else  
                         pthread_mutex_lock(&queueEmpty);  
2561          }          }
2562          return NULL;          return NULL;
2563  }  }
2564    
2565  static NTSTATUS  static RD_NTSTATUS
2566  thread_wrapper(NTHANDLE handle, uint32 request, STREAM in, STREAM out)  thread_wrapper(RD_NTHANDLE handle, uint32 request, STREAM in, STREAM out)
2567  {  {
2568          if (SC_addToQueue(handle, request, in, out))          if (SC_addToQueue(handle, request, in, out))
2569                  return STATUS_PENDING | 0xC0000000;                  return RD_STATUS_PENDING | 0xC0000000;
2570          else          else
2571                  return STATUS_NO_SUCH_FILE;                  return RD_STATUS_NO_SUCH_FILE;
2572  }  }
2573    
2574  DEVICE_FNS scard_fns = {  DEVICE_FNS scard_fns = {
# Line 2643  DEVICE_FNS scard_fns = { Line 2581  DEVICE_FNS scard_fns = {
2581  #endif /* MAKE_PROTO */  #endif /* MAKE_PROTO */
2582    
2583  void  void
2584  scard_tcp_lock(void)  scard_lock(int lock)
2585  {  {
2586          if (!tcp_sendcontrol_mutex)          if (!scard_mutex)
2587          {          {
2588                  tcp_sendcontrol_mutex = (pthread_mutex_t *) malloc(sizeof(pthread_mutex_t));                  int i;
                 pthread_mutex_init(tcp_sendcontrol_mutex, NULL);  
         }  
   
         pthread_mutex_lock(tcp_sendcontrol_mutex);  
 }  
   
 void  
 scard_tcp_unlock(void)  
 {  
         pthread_mutex_unlock(tcp_sendcontrol_mutex);  
 }  
   
 STREAM  
 scard_tcp_init(void)  
 {  
         STREAM result = NULL;  
2589    
2590          result = &out[cur_stream_id];                  scard_mutex =
2591          cur_stream_id = (cur_stream_id + 1) % STREAM_COUNT;                          (pthread_mutex_t **) xmalloc(sizeof(pthread_mutex_t *) * SCARD_LOCK_LAST);
2592    
2593          return result;                  for (i = 0; i < SCARD_LOCK_LAST; i++)
2594  }                  {
2595                            scard_mutex[i] = NULL;
2596  void                  }
2597  scard_tcp_connect(void)          }
 {  
         int i;  
2598    
2599          for (i = 0; i < STREAM_COUNT; i++)          if (!scard_mutex[lock])
2600          {          {
2601                  out[i].size = 4096;                  scard_mutex[lock] = (pthread_mutex_t *) xmalloc(sizeof(pthread_mutex_t));
2602                  out[i].data = (uint8 *) xmalloc(out[i].size);                  pthread_mutex_init(scard_mutex[lock], NULL);
2603          }          }
2604    
2605            pthread_mutex_lock(scard_mutex[lock]);
2606  }  }
2607    
2608  void  void
2609  scard_tcp_reset_state(void)  scard_unlock(int lock)
2610  {  {
2611          int i;          pthread_mutex_unlock(scard_mutex[lock]);
         struct stream *p;  
   
         for (i = 0, p = out; i < STREAM_COUNT; i++, p++)  
         {  
                 if (p->data != NULL)  
                         xfree(p->data);  
                 p->p = NULL;  
                 p->end = NULL;  
                 p->data = NULL;  
                 p->size = 0;  
                 p->iso_hdr = NULL;  
                 p->mcs_hdr = NULL;  
                 p->sec_hdr = NULL;  
                 p->rdp_hdr = NULL;  
                 p->channel_hdr = NULL;  
         }  
2612  }  }

Legend:
Removed from v.1319  
changed lines
  Added in v.1421

  ViewVC Help
Powered by ViewVC 1.1.26