152
155
* Command must be found
154
157
MSGFunctionDemarshall(&msgStruct, dwContextIndex);
155
rv = SHMMessageSend(&msgStruct, psContext[dwContextIndex].dwClientID,
156
PCSCLITE_SERVER_ATTEMPTS);
159
/* the SCARD_TRANSMIT_EXTENDED anwser is already sent by
160
* MSGFunctionDemarshall */
161
if (msgStruct.command != SCARD_TRANSMIT_EXTENDED)
162
rv = SHMMessageSend(&msgStruct, sizeof(msgStruct),
163
psContext[dwContextIndex].dwClientID,
164
PCSCLITE_SERVER_ATTEMPTS);
159
167
/* pcsc-lite client/server protocol version */
363
371
gsStr->pbAttr, gsStr->cbAttrLen);
374
case SCARD_TRANSMIT_EXTENDED:
376
transmit_struct_extended *treStr;
377
unsigned char pbSendBuffer[MAX_BUFFER_SIZE_EXTENDED];
378
unsigned char pbRecvBuffer[MAX_BUFFER_SIZE_EXTENDED];
380
treStr = ((transmit_struct_extended *) msgStruct->data);
381
rv = MSGCheckHandleAssociation(treStr->hCard, dwContextIndex);
382
if (rv != 0) return rv;
384
/* on more block to read? */
385
if (treStr->size > PCSCLITE_MAX_MESSAGE_SIZE)
387
/* copy the first APDU part */
388
memcpy(pbSendBuffer, treStr->data,
389
PCSCLITE_MAX_MESSAGE_SIZE-sizeof(*treStr));
391
/* receive the second block */
392
rv = SHMMessageReceive(
393
pbSendBuffer+PCSCLITE_MAX_MESSAGE_SIZE-sizeof(*treStr),
394
treStr->size - PCSCLITE_MAX_MESSAGE_SIZE,
395
psContext[dwContextIndex].dwClientID,
396
PCSCLITE_SERVER_ATTEMPTS);
398
Log1(PCSC_LOG_CRITICAL, "reception failed");
401
memcpy(pbSendBuffer, treStr->data, treStr->cbSendLength);
403
treStr->rv = SCardTransmit(treStr->hCard, &treStr->pioSendPci,
404
pbSendBuffer, treStr->cbSendLength,
405
&treStr->pioRecvPci, pbRecvBuffer,
406
&treStr->pcbRecvLength);
408
treStr->size = sizeof(*treStr) + treStr->pcbRecvLength;
409
if (treStr->size > PCSCLITE_MAX_MESSAGE_SIZE)
412
memcpy(treStr->data, pbRecvBuffer, PCSCLITE_MAX_MESSAGE_SIZE
415
rv = SHMMessageSend(msgStruct, sizeof(*msgStruct),
416
psContext[dwContextIndex].dwClientID,
417
PCSCLITE_SERVER_ATTEMPTS);
419
Log1(PCSC_LOG_CRITICAL, "transmission failed");
421
rv = SHMMessageSend(pbRecvBuffer + PCSCLITE_MAX_MESSAGE_SIZE
423
treStr->size - PCSCLITE_MAX_MESSAGE_SIZE,
424
psContext[dwContextIndex].dwClientID,
425
PCSCLITE_SERVER_ATTEMPTS);
427
Log1(PCSC_LOG_CRITICAL, "transmission failed");
432
memcpy(treStr->data, pbRecvBuffer, treStr->pcbRecvLength);
434
rv = SHMMessageSend(msgStruct, sizeof(*msgStruct),
435
psContext[dwContextIndex].dwClientID,
436
PCSCLITE_SERVER_ATTEMPTS);
438
Log1(PCSC_LOG_CRITICAL, "transmission failed");
444
Log2(PCSC_LOG_CRITICAL, "Unknown command: %d", msgStruct->command);