60 |
extern DEVICE_FNS printer_fns; |
extern DEVICE_FNS printer_fns; |
61 |
extern DEVICE_FNS parallel_fns; |
extern DEVICE_FNS parallel_fns; |
62 |
extern DEVICE_FNS disk_fns; |
extern DEVICE_FNS disk_fns; |
63 |
|
#ifdef WITH_SCARD |
64 |
|
extern DEVICE_FNS scard_fns; |
65 |
|
#endif |
66 |
extern FILEINFO g_fileinfo[]; |
extern FILEINFO g_fileinfo[]; |
67 |
extern BOOL g_notify_stamp; |
extern BOOL g_notify_stamp; |
68 |
|
|
312 |
channel_send(s, rdpdr_channel); |
channel_send(s, rdpdr_channel); |
313 |
} |
} |
314 |
|
|
315 |
static void |
void |
316 |
rdpdr_send_completion(uint32 device, uint32 id, uint32 status, uint32 result, uint8 * buffer, |
rdpdr_send_completion(uint32 device, uint32 id, uint32 status, uint32 result, uint8 * buffer, |
317 |
uint32 length) |
uint32 length) |
318 |
{ |
{ |
398 |
break; |
break; |
399 |
|
|
400 |
case DEVICE_TYPE_SCARD: |
case DEVICE_TYPE_SCARD: |
401 |
|
#ifdef WITH_SCARD |
402 |
|
fns = &scard_fns; |
403 |
|
rw_blocking = False; |
404 |
|
break; |
405 |
|
#endif |
406 |
default: |
default: |
407 |
|
|
408 |
error("IRP for bad device %ld\n", device); |
error("IRP for bad device %ld\n", device); |
679 |
|
|
680 |
out.data = out.p = buffer; |
out.data = out.p = buffer; |
681 |
out.size = sizeof(buffer); |
out.size = sizeof(buffer); |
682 |
|
#ifdef WITH_SCARD_DEBUG |
683 |
|
printf("[SMART-CARD TRACE]\n"); |
684 |
|
printf("device 0x%.8x\n", device); |
685 |
|
printf("file 0x%.8x\n", file); |
686 |
|
printf("id 0x%.8x\n", id); |
687 |
|
#endif |
688 |
|
#ifdef WITH_SCARD |
689 |
|
scardSetInfo(device, id, bytes_out + 0x14); |
690 |
|
#endif |
691 |
status = fns->device_control(file, request, s, &out); |
status = fns->device_control(file, request, s, &out); |
692 |
result = buffer_len = out.p - out.data; |
result = buffer_len = out.p - out.data; |
693 |
|
#ifdef WITH_SCARD_DEBUG |
694 |
|
printf("[SMART-CARD TRACE] OUT 0x%.8x\n", status); |
695 |
|
#endif |
696 |
/* Serial SERIAL_WAIT_ON_MASK */ |
/* Serial SERIAL_WAIT_ON_MASK */ |
697 |
if (status == STATUS_PENDING) |
if (status == STATUS_PENDING) |
698 |
{ |
{ |
703 |
break; |
break; |
704 |
} |
} |
705 |
} |
} |
706 |
|
#ifdef WITH_SCARD |
707 |
|
else if (status == (STATUS_PENDING | 0xC0000000)) |
708 |
|
status = STATUS_PENDING; |
709 |
|
#endif |
710 |
break; |
break; |
711 |
|
|
712 |
|
|