Improve readability of smart card code.
git-svn-id: svn://svn.code.sf.net/p/rdesktop/code/trunk/rdesktop@1414 423420c4-83ab-492f-b58f-81f9feb106b5
This commit is contained in:
parent
d90bdbcb23
commit
421c2386d3
6
rdpdr.c
6
rdpdr.c
@ -684,18 +684,12 @@ rdpdr_process_irp(STREAM s)
|
||||
out.data = out.p = buffer;
|
||||
out.size = sizeof(buffer);
|
||||
|
||||
DEBUG_SCARD(("[SMART-CARD TRACE]\n"));
|
||||
DEBUG_SCARD(("device 0x%.8x\n", device));
|
||||
DEBUG_SCARD(("file 0x%.8x\n", file));
|
||||
DEBUG_SCARD(("id 0x%.8x\n", id));
|
||||
#ifdef WITH_SCARD
|
||||
scardSetInfo(device, id, bytes_out + 0x14);
|
||||
#endif
|
||||
status = fns->device_control(file, request, s, &out);
|
||||
result = buffer_len = out.p - out.data;
|
||||
|
||||
DEBUG_SCARD(("[SMART-CARD TRACE] OUT 0x%.8x\n", status));
|
||||
|
||||
/* Serial SERIAL_WAIT_ON_MASK */
|
||||
if (status == RD_STATUS_PENDING)
|
||||
{
|
||||
|
437
scard.c
437
scard.c
@ -124,7 +124,7 @@ scard_enum_devices(uint32 * id, char *optarg)
|
||||
rv = SCardEstablishContext(SCARD_SCOPE_SYSTEM, NULL, NULL, &hContext);
|
||||
if (rv != SCARD_S_SUCCESS)
|
||||
{
|
||||
error("[SMART CARD: PCSC service not available]\n");
|
||||
error("scard_enum_devices: PCSC service not available\n");
|
||||
return 0;
|
||||
}
|
||||
else
|
||||
@ -134,26 +134,26 @@ scard_enum_devices(uint32 * id, char *optarg)
|
||||
|
||||
if (0 != pthread_mutex_init(&queueAccess, NULL))
|
||||
{
|
||||
error("[SMART CARD: Can't initialize queue access mutex]\n");
|
||||
error("scard_enum_devices: Can't initialize queue access mutex\n");
|
||||
return 0;
|
||||
}
|
||||
|
||||
if (0 != pthread_mutex_init(&queueEmpty, NULL))
|
||||
{
|
||||
error("[SMART CARD: Can't initialize queue control mutex]\n");
|
||||
error("scard_enum_devices: Can't initialize queue control mutex\n");
|
||||
return 0;
|
||||
}
|
||||
|
||||
if (0 != pthread_mutex_init(&hcardAccess, NULL))
|
||||
{
|
||||
error("[SMART CARD: Can't initialize hcard list access mutex]\n");
|
||||
error("scard_enum_devices: Can't initialize hcard list access mutex\n");
|
||||
return 0;
|
||||
}
|
||||
|
||||
if (0 !=
|
||||
pthread_create(&queueHandler, NULL, (void *(*)(void *)) queue_handler_function, NULL))
|
||||
{
|
||||
error("[SMART CARD: Can't create queue handling Thread]\n");
|
||||
error("scard_enum_devices: Can't create queue handling Thread\n");
|
||||
return 0;
|
||||
}
|
||||
|
||||
@ -601,16 +601,16 @@ TS_SCardEstablishContext(STREAM in, STREAM out)
|
||||
MYPCSC_SCARDCONTEXT hContext;
|
||||
/* code segment */
|
||||
|
||||
DEBUG_SCARD(("Establishing PC/SC Context... \n"));
|
||||
DEBUG_SCARD(("SCARD: SCardEstablishContext()\n"));
|
||||
rv = SCardEstablishContext(SCARD_SCOPE_SYSTEM, NULL, NULL, &hContext);
|
||||
if (rv)
|
||||
{
|
||||
DEBUG_SCARD(("<--ERROR SCardEstablishContext Code=0x%.8x, %s]-->\n",
|
||||
(unsigned int) rv, pcsc_stringify_error(rv)));
|
||||
DEBUG_SCARD(("SCARD: -> Failure: %s (0x%08x)\n",
|
||||
pcsc_stringify_error(rv), (unsigned int) rv));
|
||||
}
|
||||
else
|
||||
{
|
||||
DEBUG_SCARD(("<--SUCCESS SCardEstablishContext-->\n"));
|
||||
DEBUG_SCARD(("SCARD: -> Success (context: 0x%08x)\n", (unsigned) hContext));
|
||||
}
|
||||
|
||||
out_uint32_le(out, 0x00000004);
|
||||
@ -629,18 +629,17 @@ TS_SCardReleaseContext(STREAM in, STREAM out)
|
||||
|
||||
in->p += 0x1C;
|
||||
in_uint32_le(in, hContext);
|
||||
DEBUG_SCARD(("[CONTEXT 0x%.8x]\n", (unsigned int) hContext));
|
||||
DEBUG_SCARD(("Releasing context... \n"));
|
||||
DEBUG_SCARD(("SCARD: SCardReleaseContext(context: 0x%08x)\n", (unsigned) hContext));
|
||||
rv = SCardReleaseContext((MYPCSC_SCARDCONTEXT) hContext);
|
||||
|
||||
if (rv)
|
||||
{
|
||||
DEBUG_SCARD(("<--ERROR SCardReleaseContext Code=0x%.8x, %s-->\n", (unsigned int) rv,
|
||||
pcsc_stringify_error(rv)));
|
||||
DEBUG_SCARD(("SCARD: -> Failure: %s (0x%08x)\n",
|
||||
pcsc_stringify_error(rv), (unsigned int) rv));
|
||||
}
|
||||
else
|
||||
{
|
||||
DEBUG_SCARD(("<--SUCCESS SCardReleaseContext-->\n"));
|
||||
DEBUG_SCARD(("SCARD: -> Success\n"));
|
||||
}
|
||||
|
||||
return rv;
|
||||
@ -657,8 +656,7 @@ TS_SCardIsValidContext(STREAM in, STREAM out)
|
||||
|
||||
in->p += 0x1C;
|
||||
in_uint32_le(in, hContext);
|
||||
DEBUG_SCARD(("[CONTEXT 0x%.8x]\n", (unsigned int) hContext));
|
||||
DEBUG_SCARD(("Checking... \n"));
|
||||
DEBUG_SCARD(("SCARD: SCardIsValidContext(context: 0x%08x)\n", (unsigned) hContext));
|
||||
/* There is no realization of SCardIsValidContext in PC/SC Lite so we call SCardListReaders */
|
||||
|
||||
readers = SC_xmalloc(&lcHandle, 1024);
|
||||
@ -669,12 +667,13 @@ TS_SCardIsValidContext(STREAM in, STREAM out)
|
||||
|
||||
if (rv)
|
||||
{
|
||||
DEBUG_SCARD(("<--ERROR SCardListReaders (no SCardIsValidContext) Code=0x%.8x, %s-->\n", (unsigned int) rv, pcsc_stringify_error(rv)));
|
||||
DEBUG_SCARD(("SCARD: -> Failure: %s (0x%08x)\n",
|
||||
pcsc_stringify_error(rv), (unsigned int) rv));
|
||||
rv = SCARD_E_INVALID_HANDLE;
|
||||
}
|
||||
else
|
||||
{
|
||||
DEBUG_SCARD(("<--SUCCESS SCardListReaders (no SCardIsValidContext)-->\n"));
|
||||
DEBUG_SCARD(("SCARD: -> Success\n"));
|
||||
}
|
||||
|
||||
outForceAlignment(out, 8);
|
||||
@ -697,7 +696,7 @@ TS_SCardListReaders(STREAM in, STREAM out, RD_BOOL wide)
|
||||
|
||||
in->p += 0x2C;
|
||||
in_uint32_le(in, hContext);
|
||||
DEBUG_SCARD(("[CONTEXT 0x%.8x]\n", (unsigned int) hContext));
|
||||
DEBUG_SCARD(("SCARD: SCardListReaders(context: 0x%08x)\n", (unsigned) hContext));
|
||||
plen1 = out->p;
|
||||
out_uint32_le(out, 0x00000000); /* Temp value for data length as 0x0 */
|
||||
out_uint32_le(out, 0x01760650);
|
||||
@ -714,14 +713,16 @@ TS_SCardListReaders(STREAM in, STREAM out, RD_BOOL wide)
|
||||
readers[1] = '\0';
|
||||
rv = SCardListReaders((MYPCSC_SCARDCONTEXT) hContext, NULL, readers, &cchReaders);
|
||||
cur = readers;
|
||||
if (!rv)
|
||||
if (rv != SCARD_S_SUCCESS)
|
||||
{
|
||||
DEBUG_SCARD(("SCARD: -> Failure: %s (0x%08x)\n",
|
||||
pcsc_stringify_error(rv), (unsigned int) rv));
|
||||
}
|
||||
else
|
||||
{
|
||||
int i;
|
||||
PSCNameMapRec tmpMap;
|
||||
#ifdef WITH_DEBUG_SCARD
|
||||
DEBUG_SCARD(("[CALL RESULT of SCardListReaders 0x%.8x]\n", (unsigned int) rv));
|
||||
hexdump((void *) readers, cchReaders);
|
||||
#endif
|
||||
DEBUG_SCARD(("SCARD: -> Success\n"));
|
||||
for (i = 0, tmpMap = nameMapList; i < nameMapCount; i++, tmpMap++)
|
||||
{
|
||||
dataLength += outString(out, tmpMap->alias, wide);
|
||||
@ -734,7 +735,10 @@ TS_SCardListReaders(STREAM in, STREAM out, RD_BOOL wide)
|
||||
while (lenSC > 0)
|
||||
{
|
||||
if (!hasAlias(cur))
|
||||
{
|
||||
DEBUG_SCARD(("SCARD: \"%s\"\n", cur));
|
||||
dataLength += outString(out, cur, wide);
|
||||
}
|
||||
cur = (void *) ((unsigned char *) cur + lenSC + 1);
|
||||
lenSC = strlen(cur);
|
||||
}
|
||||
@ -773,30 +777,26 @@ TS_SCardConnect(STREAM in, STREAM out, RD_BOOL wide)
|
||||
in->p += 0x1C;
|
||||
in_uint32_le(in, dwShareMode);
|
||||
in_uint32_le(in, dwPreferredProtocol);
|
||||
DEBUG_SCARD(("[SHARE %8x]\n", (unsigned int) dwShareMode));
|
||||
DEBUG_SCARD(("[PROTO %8x]\n", (unsigned int) dwPreferredProtocol));
|
||||
inReaderName(&lcHandle, in, &szReader, wide);
|
||||
DEBUG_SCARD(("[CONNECT TO READER \"%s\"\n", (szReader != NULL) ? (szReader) : ("NULL")));
|
||||
in->p += 0x04;
|
||||
in_uint32_le(in, hContext);
|
||||
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"));
|
||||
rv = SCardConnect(hContext, szReader, (MYPCSC_DWORD) dwShareMode,
|
||||
(MYPCSC_DWORD) dwPreferredProtocol, &myHCard, &dwActiveProtocol);
|
||||
hCard = scHandleToServer(myHCard);
|
||||
DEBUG_SCARD(("[RECEIVED HCARD 0x%016lx]\n", (unsigned long) myHCard));
|
||||
DEBUG_SCARD(("[MANGLED HCARD 0x%08x]\n", hCard));
|
||||
if (rv != SCARD_S_SUCCESS)
|
||||
{
|
||||
DEBUG_SCARD(("<--ERROR SCardConnect Code=0x%.8x, %s-->\n", (unsigned int) rv,
|
||||
pcsc_stringify_error(rv)));
|
||||
DEBUG_SCARD(("SCARD: -> Failure: %s (0x%08x)\n",
|
||||
pcsc_stringify_error(rv), (unsigned int) rv));
|
||||
}
|
||||
else
|
||||
{
|
||||
char *szVendor = getVendor(szReader);
|
||||
DEBUG_SCARD(("<--SUCCESS ScardConnect-->\n"));
|
||||
DEBUG_SCARD(("SCARD: -> Success (hcard: 0x%08x [0x%08lx])\n",
|
||||
(unsigned) hCard, (unsigned long) myHCard));
|
||||
if (szVendor && (strlen(szVendor) > 0))
|
||||
{
|
||||
DEBUG_SCARD(("Set Attribute ATTR_VENDOR_NAME\n"));
|
||||
DEBUG_SCARD(("SCARD: Set Attribute ATTR_VENDOR_NAME\n"));
|
||||
pthread_mutex_lock(&hcardAccess);
|
||||
PSCHCardRec hcard = xmalloc(sizeof(TSCHCardRec));
|
||||
if (hcard)
|
||||
@ -852,22 +852,17 @@ TS_SCardReconnect(STREAM in, STREAM out)
|
||||
in->p += 0x04;
|
||||
in_uint32_le(in, hCard);
|
||||
myHCard = scHandleToMyPCSC(hCard);
|
||||
DEBUG_SCARD(("[SHARE = 0x%.8x]\n", (unsigned int) dwShareMode));
|
||||
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));
|
||||
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));
|
||||
rv = SCardReconnect(myHCard, (MYPCSC_DWORD) dwShareMode, (MYPCSC_DWORD) dwPreferredProtocol,
|
||||
(MYPCSC_DWORD) dwInitialization, &dwActiveProtocol);
|
||||
if (rv != SCARD_S_SUCCESS)
|
||||
{
|
||||
DEBUG_SCARD(("<--ERROR SCardReconnect Code=0x%.8x, %s-->\n", (unsigned int) rv,
|
||||
pcsc_stringify_error(rv)));
|
||||
DEBUG_SCARD(("SCARD: -> Failure: %s (0x%08x)\n",
|
||||
pcsc_stringify_error(rv), (unsigned int) rv));
|
||||
}
|
||||
else
|
||||
{
|
||||
DEBUG_SCARD(("<--SUCCESS SCardReconnect-->\n"));
|
||||
DEBUG_SCARD(("SCARD: -> Success (proto: 0x%08x)\n", (unsigned) dwActiveProtocol));
|
||||
}
|
||||
|
||||
outForceAlignment(out, 8);
|
||||
@ -891,9 +886,7 @@ TS_SCardDisconnect(STREAM in, STREAM out)
|
||||
in->p += 0x04;
|
||||
in_uint32_le(in, hCard);
|
||||
|
||||
DEBUG_SCARD(("[hContext = 0x%.8x]\n", (unsigned int) hContext));
|
||||
DEBUG_SCARD(("[hCard = 0x%.8x]\n", (unsigned int) hCard));
|
||||
DEBUG_SCARD(("[dwDisposition = 0x%.8x]\n", (unsigned int) dwDisposition));
|
||||
DEBUG_SCARD(("SCARD: SCardDisconnect(context: 0x%08x, hcard: 0x%08x, disposition: 0x%08x)\n", (unsigned) hContext, (unsigned) hCard, (unsigned) dwDisposition));
|
||||
|
||||
pthread_mutex_lock(&hcardAccess);
|
||||
PSCHCardRec hcard = hcardFirst;
|
||||
@ -919,12 +912,12 @@ TS_SCardDisconnect(STREAM in, STREAM out)
|
||||
|
||||
if (rv != SCARD_S_SUCCESS)
|
||||
{
|
||||
DEBUG_SCARD(("<--ERROR SCardDisconnect Code=0x%.8x, %s-->\n", (unsigned int) rv,
|
||||
pcsc_stringify_error(rv)));
|
||||
DEBUG_SCARD(("SCARD: -> Failure: %s (0x%08x)\n",
|
||||
pcsc_stringify_error(rv), (unsigned int) rv));
|
||||
}
|
||||
else
|
||||
{
|
||||
DEBUG_SCARD(("<--SUCCESS SCardDisconnect-->\n"));
|
||||
DEBUG_SCARD(("SCARD: -> Success\n"));
|
||||
}
|
||||
|
||||
outForceAlignment(out, 8);
|
||||
@ -1035,10 +1028,8 @@ TS_SCardGetStatusChange(STREAM in, STREAM out, RD_BOOL wide)
|
||||
in_uint32_le(in, hContext);
|
||||
in->p += 0x04;
|
||||
|
||||
DEBUG_SCARD(("[CONTEXT 0x%.8x]\n", (unsigned int) hContext));
|
||||
DEBUG_SCARD(("[dwTimeout 0x%.8x]\n", (unsigned int) dwTimeout));
|
||||
DEBUG_SCARD(("[COUNT %d]\n", (unsigned int) dwCount));
|
||||
DEBUG_SCARD(("[TYPE SIZE %d]\n", (unsigned int) sizeof(SERVER_SCARD_READERSTATE_A)));
|
||||
DEBUG_SCARD(("SCARD: SCardGetStatusChange(context: 0x%08x, timeout: 0x%08x, count: %d)\n",
|
||||
(unsigned) hContext, (unsigned) dwTimeout, (int) dwCount));
|
||||
|
||||
if (dwCount > 0)
|
||||
{
|
||||
@ -1056,11 +1047,6 @@ TS_SCardGetStatusChange(STREAM in, STREAM out, RD_BOOL wide)
|
||||
in->p += 0x04;
|
||||
in_uint8a(in, cur, SERVER_SCARDSTATESIZE);
|
||||
}
|
||||
#ifdef WITH_DEBUG_SCARD
|
||||
DEBUG_SCARD(("[READERS DUMP 1]------------------\n"));
|
||||
hexdump((void *) rsArray, dwCount * sizeof(SERVER_SCARD_READERSTATE_A));
|
||||
#endif
|
||||
|
||||
|
||||
for (i = 0, cur = rsArray, curState = stateArray;
|
||||
i < dwCount; i++, cur++, curState++)
|
||||
@ -1094,18 +1080,20 @@ TS_SCardGetStatusChange(STREAM in, STREAM out, RD_BOOL wide)
|
||||
|
||||
in->p += 0x08;
|
||||
in_uint32_le(in, dataLength);
|
||||
DEBUG_SCARD(("[%d] Data Length %d]\n", (unsigned int) i, dataLength));
|
||||
inRepos(in,
|
||||
inString(&lcHandle, in, (char **) &(cur->szReader), dataLength,
|
||||
wide));
|
||||
|
||||
if (strcmp(cur->szReader, "\\\\?PnP?\\Notification") == 0)
|
||||
cur->dwCurrentState |= SCARD_STATE_IGNORE;
|
||||
|
||||
DEBUG_SCARD(("SCARD: \"%s\"\n", cur->szReader ? cur->szReader : "NULL"));
|
||||
DEBUG_SCARD(("SCARD: user: 0x%08x, state: 0x%08x, event: 0x%08x\n",
|
||||
(unsigned) cur->pvUserData, (unsigned) cur->dwCurrentState,
|
||||
(unsigned) cur->dwEventState));
|
||||
DEBUG_SCARD(("SCARD: current state: 0x%08x\n",
|
||||
(unsigned) *curState));
|
||||
}
|
||||
#ifdef WITH_DEBUG_SCARD
|
||||
DEBUG_SCARD(("[READERS DUMP 2]------------------\n"));
|
||||
hexdump((void *) rsArray, dwCount * sizeof(SERVER_SCARD_READERSTATE_A));
|
||||
#endif
|
||||
}
|
||||
else
|
||||
{
|
||||
@ -1113,18 +1101,11 @@ TS_SCardGetStatusChange(STREAM in, STREAM out, RD_BOOL wide)
|
||||
stateArray = NULL;
|
||||
}
|
||||
|
||||
DEBUG_SCARD(("\nCalling SCardGetStatusChange...\n"));
|
||||
|
||||
|
||||
myRsArray = SC_xmalloc(&lcHandle, dwCount * sizeof(MYPCSC_SCARD_READERSTATE_A));
|
||||
if (!rsArray)
|
||||
return SC_returnNoMemoryError(&lcHandle, in, out);
|
||||
memset(myRsArray, 0, dwCount * sizeof(SERVER_SCARD_READERSTATE_A));
|
||||
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
|
||||
|
||||
rv = SCardGetStatusChange((MYPCSC_SCARDCONTEXT) hContext, (MYPCSC_DWORD) dwTimeout,
|
||||
myRsArray, (MYPCSC_DWORD) dwCount);
|
||||
@ -1132,22 +1113,14 @@ TS_SCardGetStatusChange(STREAM in, STREAM out, RD_BOOL wide)
|
||||
|
||||
if (rv != SCARD_S_SUCCESS)
|
||||
{
|
||||
DEBUG_SCARD(("<--ERROR SCardGetStatusChange Code=0x%.8x, %s-->\n",
|
||||
(unsigned int) rv, pcsc_stringify_error(rv)));
|
||||
DEBUG_SCARD(("SCARD: -> Failure: %s (0x%08x)\n",
|
||||
pcsc_stringify_error(rv), (unsigned int) rv));
|
||||
}
|
||||
else
|
||||
{
|
||||
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));
|
||||
}
|
||||
#endif
|
||||
|
||||
out_uint32_le(out, dwCount);
|
||||
out_uint32_le(out, 0x00084dd8);
|
||||
out_uint32_le(out, dwCount);
|
||||
@ -1182,6 +1155,11 @@ TS_SCardGetStatusChange(STREAM in, STREAM out, RD_BOOL wide)
|
||||
#endif
|
||||
cur->dwEventState = incStatus(cur->dwEventState, False);
|
||||
|
||||
DEBUG_SCARD(("SCARD: \"%s\"\n", cur->szReader ? cur->szReader : "NULL"));
|
||||
DEBUG_SCARD(("SCARD: user: 0x%08x, state: 0x%08x, event: 0x%08x\n",
|
||||
(unsigned) cur->pvUserData, (unsigned) cur->dwCurrentState,
|
||||
(unsigned) cur->dwEventState));
|
||||
|
||||
out_uint8p(out, (void *) ((unsigned char **) cur + 2),
|
||||
sizeof(SERVER_SCARD_READERSTATE_A) - 2 * sizeof(unsigned char *));
|
||||
}
|
||||
@ -1198,17 +1176,16 @@ TS_SCardCancel(STREAM in, STREAM out)
|
||||
|
||||
in->p += 0x1C;
|
||||
in_uint32_le(in, hContext);
|
||||
DEBUG_SCARD(("[CONTEXT 0x%.8x]\n", (unsigned int) hContext));
|
||||
DEBUG_SCARD(("Canceling... \n"));
|
||||
DEBUG_SCARD(("SCARD: SCardCancel(context: 0x%08x)\n", (unsigned) hContext));
|
||||
rv = SCardCancel((MYPCSC_SCARDCONTEXT) hContext);
|
||||
if (rv != SCARD_S_SUCCESS)
|
||||
{
|
||||
DEBUG_SCARD(("<--ERROR SCardCancel Code=0x%.8x, %s-->\n", (unsigned int) rv,
|
||||
pcsc_stringify_error(rv)));
|
||||
DEBUG_SCARD(("SCARD: -> Failure: %s (0x%08x)\n",
|
||||
pcsc_stringify_error(rv), (unsigned int) rv));
|
||||
}
|
||||
else
|
||||
{
|
||||
DEBUG_SCARD(("<--SUCCESS SCardCancel-->\n"));
|
||||
DEBUG_SCARD(("SCARD: -> Success\n"));
|
||||
}
|
||||
outForceAlignment(out, 8);
|
||||
return rv;
|
||||
@ -1231,7 +1208,6 @@ TS_SCardLocateCardsByATR(STREAM in, STREAM out, RD_BOOL wide)
|
||||
|
||||
in->p += 0x2C;
|
||||
in_uint32_le(in, hContext);
|
||||
DEBUG_SCARD(("[CONTEXT 0x%.8x]\n", (unsigned int) hContext));
|
||||
in_uint32_le(in, atrMaskCount);
|
||||
pAtrMasks = SC_xmalloc(&lcHandle, atrMaskCount * sizeof(SCARD_ATRMASK_L));
|
||||
if (!pAtrMasks)
|
||||
@ -1244,6 +1220,27 @@ TS_SCardLocateCardsByATR(STREAM in, STREAM out, RD_BOOL wide)
|
||||
return SC_returnNoMemoryError(&lcHandle, in, out);
|
||||
memset(rsArray, 0, readerCount * sizeof(SCARD_READERSTATE_A));
|
||||
|
||||
DEBUG_SCARD(("SCARD: SCardLocateCardsByATR(context: 0x%08x, atrs: %d, readers: %d)\n",
|
||||
(unsigned) hContext, (int) atrMaskCount, (int) readerCount));
|
||||
|
||||
for (i = 0, cur = pAtrMasks; i < atrMaskCount; i++, cur++)
|
||||
{
|
||||
DEBUG_SCARD(("SCARD: ATR: "));
|
||||
for (j = 0; j < pAtrMasks->cbAtr; j++)
|
||||
{
|
||||
DEBUG_SCARD(("%02x%c",
|
||||
(unsigned) (unsigned char) cur->rgbAtr[j],
|
||||
(j == pAtrMasks->cbAtr - 1) ? ' ' : ':'))}
|
||||
DEBUG_SCARD(("\n"));
|
||||
DEBUG_SCARD(("SCARD: "));
|
||||
for (j = 0; j < pAtrMasks->cbAtr; j++)
|
||||
{
|
||||
DEBUG_SCARD(("%02x%c",
|
||||
(unsigned) (unsigned char) cur->rgbMask[j],
|
||||
(j == pAtrMasks->cbAtr - 1) ? ' ' : ':'))}
|
||||
DEBUG_SCARD(("\n"));
|
||||
}
|
||||
|
||||
for (i = 0, rsCur = (SERVER_LPSCARD_READERSTATE_A) ((unsigned char **) rsArray + 2);
|
||||
i < readerCount; i++, rsCur++)
|
||||
{
|
||||
@ -1259,11 +1256,12 @@ TS_SCardLocateCardsByATR(STREAM in, STREAM out, RD_BOOL wide)
|
||||
for (i = 0, rsCur = rsArray; i < readerCount; i++, rsCur++)
|
||||
{
|
||||
inReaderName(&lcHandle, in, (char **) &rsCur->szReader, wide);
|
||||
DEBUG_SCARD(("[CHECK READER %s]\n",
|
||||
(rsCur->szReader) ? (rsCur->szReader) : ("NULL")));
|
||||
DEBUG_SCARD(("SCARD: \"%s\"\n", rsCur->szReader ? rsCur->szReader : "NULL"));
|
||||
DEBUG_SCARD(("SCARD: user: 0x%08x, state: 0x%08x, event: 0x%08x\n",
|
||||
(unsigned) rsCur->pvUserData, (unsigned) rsCur->dwCurrentState,
|
||||
(unsigned) rsCur->dwEventState));
|
||||
}
|
||||
|
||||
DEBUG_SCARD(("[CALL subfunction \"SCardGetStatusChange\"]\n"));
|
||||
/* FIXME segfault here. */
|
||||
myRsArray = SC_xmalloc(&lcHandle, readerCount * sizeof(MYPCSC_SCARD_READERSTATE_A));
|
||||
if (!myRsArray)
|
||||
@ -1274,11 +1272,12 @@ TS_SCardLocateCardsByATR(STREAM in, STREAM out, RD_BOOL wide)
|
||||
copyReaderState_MyPCSCToServer(myRsArray, rsArray, readerCount);
|
||||
if (rv != SCARD_S_SUCCESS)
|
||||
{
|
||||
DEBUG_SCARD(("<--ERROR SCardGetStatusChange (no SCardLocateCardsByATR) Code=0x%.8x, %s-->\n", (unsigned int) rv, pcsc_stringify_error(rv)));
|
||||
DEBUG_SCARD(("SCARD: -> Failure: %s (0x%08x)\n",
|
||||
pcsc_stringify_error(rv), (unsigned int) rv));
|
||||
}
|
||||
else
|
||||
{
|
||||
DEBUG_SCARD(("<--SUCCESS SCardGetStatusChange (no SCardLocateCardsByATR)-->\n"));
|
||||
DEBUG_SCARD(("SCARD: -> Success\n"));
|
||||
cur = pAtrMasks;
|
||||
for (i = 0, cur = pAtrMasks; i < atrMaskCount; i++, cur++)
|
||||
{
|
||||
@ -1298,9 +1297,11 @@ TS_SCardLocateCardsByATR(STREAM in, STREAM out, RD_BOOL wide)
|
||||
}
|
||||
if (equal)
|
||||
{
|
||||
DEBUG_SCARD(("[FOUND]\n"));
|
||||
rsCur->dwEventState |= 0x00000040; /* SCARD_STATE_ATRMATCH 0x00000040 */
|
||||
memcpy(ResArray + j, rsCur, sizeof(SCARD_READERSTATE_A));
|
||||
DEBUG_SCARD(("SCARD: \"%s\"\n",
|
||||
rsCur->szReader ? rsCur->szReader : "NULL"));
|
||||
DEBUG_SCARD(("SCARD: user: 0x%08x, state: 0x%08x, event: 0x%08x\n", (unsigned) rsCur->pvUserData, (unsigned) rsCur->dwCurrentState, (unsigned) rsCur->dwEventState));
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -1331,17 +1332,17 @@ TS_SCardBeginTransaction(STREAM in, STREAM out)
|
||||
in->p += 0x30;
|
||||
in_uint32_le(in, hCard);
|
||||
myHCard = scHandleToMyPCSC(hCard);
|
||||
DEBUG_SCARD(("[hCard = 0x%.8x]\n", (unsigned int) hCard));
|
||||
DEBUG_SCARD(("[myHCard = 0x%016lx]\n", (unsigned long) myHCard));
|
||||
DEBUG_SCARD(("SCARD: SCardBeginTransaction(hcard: 0x%08x [0x%08lx])\n",
|
||||
(unsigned) hCard, (unsigned long) myHCard));
|
||||
rv = SCardBeginTransaction(myHCard);
|
||||
if (rv != SCARD_S_SUCCESS)
|
||||
{
|
||||
DEBUG_SCARD(("<--ERROR SCardBeginTransaction Code=0x%.8x, %s-->\n",
|
||||
(unsigned int) rv, pcsc_stringify_error(rv)));
|
||||
DEBUG_SCARD(("SCARD: -> Failure: %s (0x%08x)\n",
|
||||
pcsc_stringify_error(rv), (unsigned int) rv));
|
||||
}
|
||||
else
|
||||
{
|
||||
DEBUG_SCARD(("<--SUCCESS SCardBeginTransaction-->\n"));
|
||||
DEBUG_SCARD(("SCARD: -> Success\n"));
|
||||
}
|
||||
outForceAlignment(out, 8);
|
||||
return rv;
|
||||
@ -1365,15 +1366,17 @@ TS_SCardEndTransaction(STREAM in, STREAM out)
|
||||
DEBUG_SCARD(("[myHCard = 0x%016lx]\n", (unsigned long) myHCard));
|
||||
DEBUG_SCARD(("[dwDisposition = 0x%.8x]\n", (unsigned int) dwDisposition));
|
||||
|
||||
DEBUG_SCARD(("SCARD: SCardEndTransaction(hcard: 0x%08x [0x%08lx], disposition: 0x%08x)\n",
|
||||
(unsigned) hCard, (unsigned long) myHCard, (unsigned) dwDisposition));
|
||||
rv = SCardEndTransaction(myHCard, (MYPCSC_DWORD) dwDisposition);
|
||||
if (rv != SCARD_S_SUCCESS)
|
||||
{
|
||||
DEBUG_SCARD(("<--ERROR SCardEndTransaction Code=0x%.8x, %s-->\n", (unsigned int) rv,
|
||||
pcsc_stringify_error(rv)));
|
||||
DEBUG_SCARD(("SCARD: -> Failure: %s (0x%08x)\n",
|
||||
pcsc_stringify_error(rv), (unsigned int) rv));
|
||||
}
|
||||
else
|
||||
{
|
||||
DEBUG_SCARD(("<--SUCCESS SCardEndTransaction-->\n"));
|
||||
DEBUG_SCARD(("SCARD: -> Success\n"));
|
||||
}
|
||||
outForceAlignment(out, 8);
|
||||
return rv;
|
||||
@ -1507,35 +1510,7 @@ TS_SCardTransmit(STREAM in, STREAM out)
|
||||
else
|
||||
pioRecvPci = NULL;
|
||||
|
||||
#ifdef WITH_DEBUG_SCARD
|
||||
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
|
||||
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));
|
||||
|
||||
myCbRecvLength = cbRecvLength;
|
||||
myPioSendPci = SC_xmalloc(&lcHandle,
|
||||
@ -1567,7 +1542,7 @@ TS_SCardTransmit(STREAM in, STREAM out)
|
||||
if (cbRecvLength > 448)
|
||||
{
|
||||
warning("Card response limited from %d to 448 bytes!\n", cbRecvLength);
|
||||
DEBUG_SCARD(("[RECV LEN %d -> %d]\n", (unsigned int) cbRecvLength, 400));
|
||||
DEBUG_SCARD(("SCARD: Truncated %d to %d\n", (unsigned int) cbRecvLength, 448));
|
||||
cbRecvLength = 448;
|
||||
}
|
||||
|
||||
@ -1583,22 +1558,12 @@ TS_SCardTransmit(STREAM in, STREAM out)
|
||||
|
||||
if (rv != SCARD_S_SUCCESS)
|
||||
{
|
||||
DEBUG_SCARD(("<--ERROR SCardTransmit Code=0x%.8x, %s-->\n", (unsigned int) rv,
|
||||
pcsc_stringify_error(rv)));
|
||||
DEBUG_SCARD(("SCARD: -> Failure: %s (0x%08x)\n",
|
||||
pcsc_stringify_error(rv), (unsigned int) rv));
|
||||
}
|
||||
else
|
||||
{
|
||||
#ifdef WITH_DEBUG_SCARD
|
||||
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
|
||||
DEBUG_SCARD(("SCARD: -> Success (%d bytes)\n", (int) cbRecvLength));
|
||||
#if 0
|
||||
if ((pioRecvPci != NULL) && (pioRecvPci->cbPciLength > 0))
|
||||
{
|
||||
@ -1650,10 +1615,7 @@ TS_SCardStatus(STREAM in, STREAM out, RD_BOOL wide)
|
||||
in->p += 0x04;
|
||||
myHCard = scHandleToMyPCSC(hCard);
|
||||
|
||||
DEBUG_SCARD(("[hCard 0x%.8x]\n", (unsigned int) hCard));
|
||||
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));
|
||||
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));
|
||||
|
||||
if (dwReaderLen <= 0 || dwReaderLen == SCARD_AUTOALLOCATE || dwReaderLen > SCARD_MAX_MEM)
|
||||
dwReaderLen = SCARD_MAX_MEM;
|
||||
@ -1681,21 +1643,24 @@ TS_SCardStatus(STREAM in, STREAM out, RD_BOOL wide)
|
||||
|
||||
if (rv != SCARD_S_SUCCESS)
|
||||
{
|
||||
DEBUG_SCARD(("<--ERROR SCardStatus Code=0x%.8x, %s-->\n", (unsigned int) rv,
|
||||
pcsc_stringify_error(rv)));
|
||||
DEBUG_SCARD(("SCARD: -> Failure: %s (0x%08x)\n",
|
||||
pcsc_stringify_error(rv), (unsigned int) rv));
|
||||
return SC_returnCode(rv, &lcHandle, in, out);
|
||||
}
|
||||
else
|
||||
{
|
||||
#ifdef WITH_DEBUG_SCARD
|
||||
DEBUG_SCARD(("<--SUCCESS SCardStatus-->\n"));
|
||||
DEBUG_SCARD(("[dwState 0x%.8x]\n", (unsigned int) dwState));
|
||||
DEBUG_SCARD(("[dwProtocol 0x%.8x]\n", (unsigned int) dwProtocol));
|
||||
DEBUG_SCARD(("[Reader Name]\n"));
|
||||
hexdump((unsigned char *) readerName, dwReaderLen);
|
||||
DEBUG_SCARD(("[Atr]\n"));
|
||||
hexdump(atr, dwAtrLen);
|
||||
#endif
|
||||
int i;
|
||||
|
||||
DEBUG_SCARD(("SCARD: -> Success (state: 0x%08x, proto: 0x%08x)\n",
|
||||
(unsigned) dwState, (unsigned) dwProtocol));
|
||||
DEBUG_SCARD(("SCARD: Reader: \"%s\"\n", readerName ? readerName : "NULL"));
|
||||
DEBUG_SCARD(("SCARD: ATR: "));
|
||||
for (i = 0; i < dwAtrLen; i++)
|
||||
{
|
||||
DEBUG_SCARD(("%02x%c", atr[i], (i == dwAtrLen - 1) ? ' ' : ':'));
|
||||
}
|
||||
DEBUG_SCARD(("\n"));
|
||||
|
||||
if (dwState & (SCARD_SPECIFIC | SCARD_NEGOTIABLE))
|
||||
dwState = 0x00000006;
|
||||
else
|
||||
@ -1765,9 +1730,8 @@ TS_SCardState(STREAM in, STREAM out)
|
||||
in->p += 0x04;
|
||||
myHCard = scHandleToMyPCSC(hCard);
|
||||
|
||||
DEBUG_SCARD(("[hCard 0x%.8x]\n", (unsigned int) hCard));
|
||||
DEBUG_SCARD(("[myHCard 0x%.8x]\n", (unsigned int) myHCard));
|
||||
DEBUG_SCARD(("[dwAtrLen %d]\n", (unsigned int) dwAtrLen));
|
||||
DEBUG_SCARD(("SCARD: SCardState(hcard: 0x%08x [0x%08lx], atr len: %d bytes)\n",
|
||||
(unsigned) hCard, (unsigned long) myHCard, (int) dwAtrLen));
|
||||
|
||||
dwReaderLen = SCARD_MAX_MEM;
|
||||
if (dwAtrLen <= 0 || dwAtrLen == SCARD_AUTOALLOCATE || dwAtrLen > SCARD_MAX_MEM)
|
||||
@ -1793,19 +1757,23 @@ TS_SCardState(STREAM in, STREAM out)
|
||||
|
||||
if (rv != SCARD_S_SUCCESS)
|
||||
{
|
||||
DEBUG_SCARD(("<--ERROR SCardStatus (no ScardState) Code=0x%.8x, %s-->\n",
|
||||
(unsigned int) rv, pcsc_stringify_error(rv)));
|
||||
DEBUG_SCARD(("SCARD: -> Failure: %s (0x%08x)\n",
|
||||
pcsc_stringify_error(rv), (unsigned int) rv));
|
||||
return SC_returnCode(rv, &lcHandle, in, out);
|
||||
}
|
||||
else
|
||||
{
|
||||
#ifdef WITH_DEBUG_SCARD
|
||||
DEBUG_SCARD(("<--SUCCESS SCardStatus (no ScardState)-->\n"));
|
||||
DEBUG_SCARD(("[dwState 0x%.8x]\n", (unsigned int) dwState));
|
||||
DEBUG_SCARD(("[dwProtocol 0x%.8x]\n", (unsigned int) dwProtocol));
|
||||
DEBUG_SCARD(("[Atr]\n"));
|
||||
hexdump(atr, dwAtrLen);
|
||||
#endif
|
||||
int i;
|
||||
|
||||
DEBUG_SCARD(("SCARD: -> Success (state: 0x%08x, proto: 0x%08x)\n",
|
||||
(unsigned) dwState, (unsigned) dwProtocol));
|
||||
DEBUG_SCARD(("SCARD: ATR: "));
|
||||
for (i = 0; i < dwAtrLen; i++)
|
||||
{
|
||||
DEBUG_SCARD(("%02x%c", atr[i], (i == dwAtrLen - 1) ? ' ' : ':'));
|
||||
}
|
||||
DEBUG_SCARD(("\n"));
|
||||
|
||||
if (dwState & (SCARD_SPECIFIC | SCARD_NEGOTIABLE))
|
||||
dwState = 0x00000006;
|
||||
else
|
||||
@ -1859,6 +1827,9 @@ TS_SCardListReaderGroups(STREAM in, STREAM out)
|
||||
in->p += 0x04;
|
||||
in_uint32_le(in, hContext);
|
||||
|
||||
DEBUG_SCARD(("SCARD: SCardListReaderGroups(context: 0x%08x, groups: %d)\n",
|
||||
(unsigned) hContext, (int) dwGroups));
|
||||
|
||||
if (dwGroups <= 0 || dwGroups == SCARD_AUTOALLOCATE || dwGroups > SCARD_MAX_MEM)
|
||||
dwGroups = SCARD_MAX_MEM;
|
||||
|
||||
@ -1872,13 +1843,20 @@ TS_SCardListReaderGroups(STREAM in, STREAM out)
|
||||
|
||||
if (rv)
|
||||
{
|
||||
DEBUG_SCARD(("<--ERROR SCardListReaderGroups Code=0x%.8x, %s-->\n",
|
||||
(unsigned int) rv, pcsc_stringify_error(rv)));
|
||||
DEBUG_SCARD(("SCARD: -> Failure: %s (0x%08x)\n",
|
||||
pcsc_stringify_error(rv), (unsigned int) rv));
|
||||
return SC_returnCode(rv, &lcHandle, in, out);
|
||||
}
|
||||
else
|
||||
{
|
||||
DEBUG_SCARD(("<--SUCCESS SCardListReaderGroups-->\n"));
|
||||
int i;
|
||||
char *cur;
|
||||
|
||||
DEBUG_SCARD(("SCARD: -> Success\n"));
|
||||
for (i = 0, cur = szGroups; i < dwGroups; i++, cur += strlen(cur) + 1)
|
||||
{
|
||||
DEBUG_SCARD(("SCARD: %s\n", cur));
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@ -1915,10 +1893,9 @@ TS_SCardGetAttrib(STREAM in, STREAM out)
|
||||
|
||||
dwAttrId = dwAttrId & 0x0000FFFF;
|
||||
|
||||
DEBUG_SCARD(("[hCard = 0x%.8x]\n", (unsigned int) hCard));
|
||||
DEBUG_SCARD(("[myHCard 0x%.8x]\n", (unsigned int) myHCard));
|
||||
DEBUG_SCARD(("[dwAttrId = 0x%.8x]\n", (unsigned int) dwAttrId));
|
||||
DEBUG_SCARD(("[dwAttrLen = 0x%.8x]\n", (unsigned int) dwAttrLen));
|
||||
DEBUG_SCARD(("SCARD: SCardGetAttrib(hcard: 0x%08x [0x%08lx], attrib: 0x%08x (%d bytes))\n",
|
||||
(unsigned) hCard, (unsigned long) myHCard,
|
||||
(unsigned) dwAttrId, (int) dwAttrLen));
|
||||
|
||||
if (dwAttrLen > MAX_BUFFER_SIZE)
|
||||
dwAttrLen = MAX_BUFFER_SIZE;
|
||||
@ -1944,7 +1921,7 @@ TS_SCardGetAttrib(STREAM in, STREAM out)
|
||||
|
||||
if (dwAttrId == 0x00000100 && rv != SCARD_S_SUCCESS)
|
||||
{
|
||||
DEBUG_SCARD(("Get Attribute ATTR_VENDOR_NAME\n"));
|
||||
DEBUG_SCARD(("SCARD: Faking attribute ATTR_VENDOR_NAME\n"));
|
||||
pthread_mutex_lock(&hcardAccess);
|
||||
PSCHCardRec hcard = hcardFirst;
|
||||
while (hcard)
|
||||
@ -1964,19 +1941,14 @@ TS_SCardGetAttrib(STREAM in, STREAM out)
|
||||
|
||||
if (rv != SCARD_S_SUCCESS)
|
||||
{
|
||||
DEBUG_SCARD(("<--ERROR SCardGetAttrib Code=0x%.8x, %s-->\n", (unsigned int) rv,
|
||||
pcsc_stringify_error(rv)));
|
||||
DEBUG_SCARD(("SCARD: -> Failure: %s (0x%08x)\n",
|
||||
pcsc_stringify_error(rv), (unsigned int) rv));
|
||||
return SC_returnCode(rv, &lcHandle, in, out);
|
||||
}
|
||||
else
|
||||
{
|
||||
#ifdef WITH_DEBUG_SCARD
|
||||
DEBUG_SCARD(("<--SUCCESS SCardGetAttrib-->\n"));
|
||||
DEBUG_SCARD(("[LENGTH %d]\n", (unsigned int) dwAttrLen));
|
||||
DEBUG_SCARD(("+++++++++++++++++++++\n"));
|
||||
hexdump(pbAttr, dwAttrLen);
|
||||
DEBUG_SCARD(("+++++++++++++++++++++\n"));
|
||||
#endif
|
||||
DEBUG_SCARD(("SCARD: -> Success (%d bytes)\n", (int) dwAttrLen));
|
||||
|
||||
out_uint32_le(out, dwAttrLen);
|
||||
out_uint32_le(out, 0x00000200);
|
||||
out_uint32_le(out, dwAttrLen);
|
||||
@ -2016,10 +1988,9 @@ TS_SCardSetAttrib(STREAM in, STREAM out)
|
||||
|
||||
dwAttrId = dwAttrId & 0x0000FFFF;
|
||||
|
||||
DEBUG_SCARD(("[hCard = 0x%.8x]\n", (unsigned int) hCard));
|
||||
DEBUG_SCARD(("[myHCard 0x%.8x]\n", (unsigned int) myHCard));
|
||||
DEBUG_SCARD(("[dwAttrId = 0x%.8x]\n", (unsigned int) dwAttrId));
|
||||
DEBUG_SCARD(("[dwAttrLen = 0x%.8x]\n", (unsigned int) dwAttrLen));
|
||||
DEBUG_SCARD(("SCARD: SCardSetAttrib(hcard: 0x%08x [0x%08lx], attrib: 0x%08x (%d bytes))\n",
|
||||
(unsigned) hCard, (unsigned long) myHCard,
|
||||
(unsigned) dwAttrId, (int) dwAttrLen));
|
||||
|
||||
if (dwAttrLen > MAX_BUFFER_SIZE)
|
||||
dwAttrLen = MAX_BUFFER_SIZE;
|
||||
@ -2031,14 +2002,14 @@ TS_SCardSetAttrib(STREAM in, STREAM out)
|
||||
in_uint8a(in, pbAttr, dwAttrLen);
|
||||
rv = SCardSetAttrib(myHCard, (MYPCSC_DWORD) dwAttrId, pbAttr, (MYPCSC_DWORD) dwAttrLen);
|
||||
|
||||
if (rv)
|
||||
if (rv != SCARD_S_SUCCESS)
|
||||
{
|
||||
DEBUG_SCARD(("<--ERROR SCardSetAttrib Code=0x%.8x, %s-->\n", (unsigned int) rv,
|
||||
pcsc_stringify_error(rv)));
|
||||
DEBUG_SCARD(("SCARD: -> Failure: %s (0x%08x)\n",
|
||||
pcsc_stringify_error(rv), (unsigned int) rv));
|
||||
}
|
||||
else
|
||||
{
|
||||
DEBUG_SCARD(("<--SUCCESS SCardSetAttrib-->\n"));
|
||||
DEBUG_SCARD(("SCARD: -> Success\n"));
|
||||
}
|
||||
|
||||
out_uint32_le(out, 0x00000000);
|
||||
@ -2108,19 +2079,7 @@ TS_SCardControl(STREAM in, STREAM out)
|
||||
if (!pOutBuffer)
|
||||
return SC_returnNoMemoryError(&lcHandle, in, out);
|
||||
|
||||
#ifdef WITH_DEBUG_SCARD
|
||||
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
|
||||
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));
|
||||
|
||||
sc_nBytesReturned = nBytesReturned;
|
||||
myHCard = scHandleToMyPCSC(hCard);
|
||||
@ -2134,21 +2093,15 @@ TS_SCardControl(STREAM in, STREAM out)
|
||||
#endif
|
||||
nBytesReturned = sc_nBytesReturned;
|
||||
|
||||
#ifdef WITH_DEBUG_SCARD
|
||||
if (rv != SCARD_S_SUCCESS)
|
||||
{
|
||||
DEBUG_SCARD(("<--ERROR SCardControl Code=0x%.8x, %s-->\n", (unsigned int) rv,
|
||||
pcsc_stringify_error(rv)));
|
||||
DEBUG_SCARD(("SCARD: -> Failure: %s (0x%08x)\n",
|
||||
pcsc_stringify_error(rv), (unsigned int) rv));
|
||||
}
|
||||
else
|
||||
{
|
||||
DEBUG_SCARD(("<--SUCCESS SCardControl-->\n"));
|
||||
DEBUG_SCARD(("[LENGTH %d]\n", (unsigned int) nBytesReturned));
|
||||
DEBUG_SCARD(("+++++++++++++++++++++\n"));
|
||||
hexdump((unsigned char *) pOutBuffer, nBytesReturned);
|
||||
DEBUG_SCARD(("+++++++++++++++++++++\n"));
|
||||
DEBUG_SCARD(("SCARD: -> Success (out: %d bytes)\n", (int) nBytesReturned));
|
||||
}
|
||||
#endif
|
||||
|
||||
out_uint32_le(out, nBytesReturned);
|
||||
out_uint32_le(out, 0x00000004);
|
||||
@ -2167,6 +2120,7 @@ TS_SCardControl(STREAM in, STREAM out)
|
||||
static MYPCSC_DWORD
|
||||
TS_SCardAccessStartedEvent(STREAM in, STREAM out)
|
||||
{
|
||||
DEBUG_SCARD(("SCARD: SCardAccessStartedEvent()\n"));
|
||||
out_uint8s(out, 8);
|
||||
return SCARD_S_SUCCESS;
|
||||
}
|
||||
@ -2178,15 +2132,7 @@ scard_device_control(RD_NTHANDLE handle, uint32 request, STREAM in, STREAM out)
|
||||
SERVER_DWORD Result = 0x00000000;
|
||||
unsigned char *psize, *pend, *pStatusCode;
|
||||
SERVER_DWORD addToEnd = 0;
|
||||
#ifdef WITH_DEBUG_SCARD
|
||||
unsigned char *pbeg = out->p;
|
||||
|
||||
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
|
||||
/* Processing request */
|
||||
|
||||
out_uint32_le(out, 0x00081001); /* Header lines */
|
||||
@ -2202,21 +2148,18 @@ scard_device_control(RD_NTHANDLE handle, uint32 request, STREAM in, STREAM out)
|
||||
/* SCardEstablishContext */
|
||||
case SC_ESTABLISH_CONTEXT:
|
||||
{
|
||||
DEBUG_SCARD(("<---SCardEstablishContext--->\n"));
|
||||
Result = (SERVER_DWORD) TS_SCardEstablishContext(in, out);
|
||||
break;
|
||||
}
|
||||
/* SCardReleaseContext */
|
||||
case SC_RELEASE_CONTEXT:
|
||||
{
|
||||
DEBUG_SCARD(("<---SCardReleaseContext--->\n"));
|
||||
Result = (SERVER_DWORD) TS_SCardReleaseContext(in, out);
|
||||
break;
|
||||
}
|
||||
/* SCardIsValidContext */
|
||||
case SC_IS_VALID_CONTEXT:
|
||||
{
|
||||
DEBUG_SCARD(("<---SCardIsValidContext--->\n"));
|
||||
Result = (SERVER_DWORD) TS_SCardIsValidContext(in, out);
|
||||
break;
|
||||
}
|
||||
@ -2225,8 +2168,6 @@ scard_device_control(RD_NTHANDLE handle, uint32 request, STREAM in, STREAM out)
|
||||
case SC_LIST_READERS + 4: /* SCardListReadersW */
|
||||
{
|
||||
RD_BOOL wide = request != SC_LIST_READERS;
|
||||
DEBUG_SCARD(("<---SCardListReaders---> (%s)\n",
|
||||
(wide) ? ("WIDE") : ("ASCII")));
|
||||
Result = (SERVER_DWORD) TS_SCardListReaders(in, out, wide);
|
||||
break;
|
||||
}
|
||||
@ -2235,22 +2176,18 @@ scard_device_control(RD_NTHANDLE handle, uint32 request, STREAM in, STREAM out)
|
||||
case SC_CONNECT + 4: /* SCardConnectW */
|
||||
{
|
||||
RD_BOOL wide = request != SC_CONNECT;
|
||||
DEBUG_SCARD(("<---SCardConnect---> (%s)\n",
|
||||
(wide) ? ("WIDE") : ("ASCII")));
|
||||
Result = (SERVER_DWORD) TS_SCardConnect(in, out, wide);
|
||||
break;
|
||||
}
|
||||
/* ScardReconnect */
|
||||
case SC_RECONNECT:
|
||||
{
|
||||
DEBUG_SCARD(("<---SCardReconnect--->\n"));
|
||||
Result = (SERVER_DWORD) TS_SCardReconnect(in, out);
|
||||
break;
|
||||
}
|
||||
/* ScardDisconnect */
|
||||
case SC_DISCONNECT:
|
||||
{
|
||||
DEBUG_SCARD(("<---SCardDisconnect--->\n"));
|
||||
Result = (SERVER_DWORD) TS_SCardDisconnect(in, out);
|
||||
break;
|
||||
}
|
||||
@ -2259,15 +2196,12 @@ scard_device_control(RD_NTHANDLE handle, uint32 request, STREAM in, STREAM out)
|
||||
case SC_GET_STATUS_CHANGE + 4: /* SCardGetStatusChangeW */
|
||||
{
|
||||
RD_BOOL wide = request != SC_GET_STATUS_CHANGE;
|
||||
DEBUG_SCARD(("<---SCardGetStatusChange---> (%s)\n",
|
||||
(wide) ? ("WIDE") : ("ASCII")));
|
||||
Result = (SERVER_DWORD) TS_SCardGetStatusChange(in, out, wide);
|
||||
break;
|
||||
}
|
||||
/* SCardCancel */
|
||||
case SC_CANCEL:
|
||||
{
|
||||
DEBUG_SCARD(("<---SCardCancel--->\n"));
|
||||
Result = (SERVER_DWORD) TS_SCardCancel(in, out);
|
||||
break;
|
||||
}
|
||||
@ -2276,36 +2210,30 @@ scard_device_control(RD_NTHANDLE handle, uint32 request, STREAM in, STREAM out)
|
||||
case SC_LOCATE_CARDS_BY_ATR + 4: /* SCardLocateCardsByATRW */
|
||||
{
|
||||
RD_BOOL wide = request != SC_LOCATE_CARDS_BY_ATR;
|
||||
DEBUG_SCARD(("<---SCardLocateCardsByATR---> (%s)\n",
|
||||
(wide) ? ("WIDE") : ("ASCII")));
|
||||
Result = (SERVER_DWORD) TS_SCardLocateCardsByATR(in, out, wide);
|
||||
break;
|
||||
}
|
||||
/* SCardBeginTransaction */
|
||||
case SC_BEGIN_TRANSACTION:
|
||||
{
|
||||
DEBUG_SCARD(("<---SCardBeginTransaction--->\n"));
|
||||
Result = (SERVER_DWORD) TS_SCardBeginTransaction(in, out);
|
||||
break;
|
||||
}
|
||||
/* SCardBeginTransaction */
|
||||
case SC_END_TRANSACTION:
|
||||
{
|
||||
DEBUG_SCARD(("<---SCardEndTransaction--->\n"));
|
||||
Result = (SERVER_DWORD) TS_SCardEndTransaction(in, out);
|
||||
break;
|
||||
}
|
||||
/* ScardTransmit */
|
||||
case SC_TRANSMIT:
|
||||
{
|
||||
DEBUG_SCARD(("<---SCardTransmit--->\n"));
|
||||
Result = (SERVER_DWORD) TS_SCardTransmit(in, out);
|
||||
break;
|
||||
}
|
||||
/* SCardControl */
|
||||
case SC_CONTROL:
|
||||
{
|
||||
DEBUG_SCARD(("<---SCardControl--->\n"));
|
||||
Result = (SERVER_DWORD) TS_SCardControl(in, out);
|
||||
break;
|
||||
}
|
||||
@ -2313,14 +2241,12 @@ scard_device_control(RD_NTHANDLE handle, uint32 request, STREAM in, STREAM out)
|
||||
#ifndef WITH_PCSC120
|
||||
case SC_GETATTRIB:
|
||||
{
|
||||
DEBUG_SCARD(("<---SCardGetAttrib--->\n"));
|
||||
Result = (SERVER_DWORD) TS_SCardGetAttrib(in, out);
|
||||
break;
|
||||
}
|
||||
#endif
|
||||
case SC_ACCESS_STARTED_EVENT:
|
||||
{
|
||||
DEBUG_SCARD(("<---SCardAccessStartedEvent-->\n"));
|
||||
Result = (SERVER_DWORD) TS_SCardAccessStartedEvent(in, out);
|
||||
break;
|
||||
}
|
||||
@ -2328,20 +2254,17 @@ scard_device_control(RD_NTHANDLE handle, uint32 request, STREAM in, STREAM out)
|
||||
case SC_STATUS + 4: /* SCardStatusW */
|
||||
{
|
||||
RD_BOOL wide = request != SC_STATUS;
|
||||
DEBUG_SCARD(("<---SCardStatus---> (%s)\n",
|
||||
(wide) ? ("WIDE") : ("ASCII")));
|
||||
Result = (SERVER_DWORD) TS_SCardStatus(in, out, wide);
|
||||
break;
|
||||
}
|
||||
case SC_STATE: /* SCardState */
|
||||
{
|
||||
DEBUG_SCARD(("<---SCardState--->"));
|
||||
Result = (SERVER_DWORD) TS_SCardState(in, out);
|
||||
break;
|
||||
}
|
||||
default:
|
||||
{
|
||||
DEBUG_SCARD(("<---UNSUPPORTED-FUNC--->\n"));
|
||||
warning("SCARD: Unknown function %d\n", (int) request);
|
||||
Result = 0x80100014;
|
||||
out_uint8s(out, 256);
|
||||
break;
|
||||
@ -2368,11 +2291,6 @@ scard_device_control(RD_NTHANDLE handle, uint32 request, STREAM in, STREAM out)
|
||||
out_uint8s(out, addToEnd);
|
||||
}
|
||||
|
||||
#ifdef WITH_DEBUG_SCARD
|
||||
DEBUG_SCARD(("[OUTPUT DUMP]-------------------\n"));
|
||||
hexdump(pbeg, (size_t) (out->p) - (size_t) pbeg);
|
||||
DEBUG_SCARD(("--------------------------------\n"));
|
||||
#endif
|
||||
return RD_STATUS_SUCCESS;
|
||||
}
|
||||
|
||||
@ -2516,20 +2434,13 @@ SC_deviceControl(PSCThreadData data)
|
||||
static void *
|
||||
thread_function(PThreadListElement listElement)
|
||||
{
|
||||
#ifdef WITH_DEBUG_SCARD
|
||||
long sTime = 0;
|
||||
#endif
|
||||
if ((listElement != NULL) && (listElement->data != NULL))
|
||||
{
|
||||
while (1)
|
||||
{
|
||||
#ifdef WITH_DEBUG_SCARD
|
||||
sTime = time(NULL);
|
||||
#endif
|
||||
pthread_mutex_lock(&listElement->nodata);
|
||||
SC_deviceControl(listElement->data);
|
||||
listElement->data = NULL;
|
||||
DEBUG_SCARD(("[HANDLING TIME %d]\n", (int) (time(NULL) - sTime)));
|
||||
pthread_mutex_unlock(&listElement->busy);
|
||||
}
|
||||
}
|
||||
@ -2543,8 +2454,6 @@ SC_handleRequest(PSCThreadData data)
|
||||
int Result = 0;
|
||||
PThreadListElement cur = threadList, last = threadList;
|
||||
|
||||
DEBUG_SCARD(("[THREAD COUNT %d]\n", threadCount));
|
||||
|
||||
while (cur)
|
||||
{
|
||||
if (0 == pthread_mutex_trylock(&cur->busy))
|
||||
|
Loading…
Reference in New Issue
Block a user