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 |
{ |
{ |
319 |
uint8 magic[4] = "rDCI"; |
uint8 magic[4] = "rDCI"; |
320 |
STREAM s; |
STREAM s; |
321 |
|
|
322 |
|
#ifdef WITH_SCARD |
323 |
|
scard_lock(SCARD_LOCK_RDPDR); |
324 |
|
#endif |
325 |
s = channel_init(rdpdr_channel, 20 + length); |
s = channel_init(rdpdr_channel, 20 + length); |
326 |
out_uint8a(s, magic, 4); |
out_uint8a(s, magic, 4); |
327 |
out_uint32_le(s, device); |
out_uint32_le(s, device); |
336 |
/* hexdump(s->channel_hdr + 8, s->end - s->channel_hdr - 8); */ |
/* hexdump(s->channel_hdr + 8, s->end - s->channel_hdr - 8); */ |
337 |
#endif |
#endif |
338 |
channel_send(s, rdpdr_channel); |
channel_send(s, rdpdr_channel); |
339 |
|
#ifdef WITH_SCARD |
340 |
|
scard_unlock(SCARD_LOCK_RDPDR); |
341 |
|
#endif |
342 |
} |
} |
343 |
|
|
344 |
static void |
static void |
404 |
break; |
break; |
405 |
|
|
406 |
case DEVICE_TYPE_SCARD: |
case DEVICE_TYPE_SCARD: |
407 |
|
#ifdef WITH_SCARD |
408 |
|
fns = &scard_fns; |
409 |
|
rw_blocking = False; |
410 |
|
break; |
411 |
|
#endif |
412 |
default: |
default: |
413 |
|
|
414 |
error("IRP for bad device %ld\n", device); |
error("IRP for bad device %ld\n", device); |
685 |
|
|
686 |
out.data = out.p = buffer; |
out.data = out.p = buffer; |
687 |
out.size = sizeof(buffer); |
out.size = sizeof(buffer); |
688 |
|
|
689 |
|
DEBUG_SCARD(("[SMART-CARD TRACE]\n")); |
690 |
|
DEBUG_SCARD(("device 0x%.8x\n", device)); |
691 |
|
DEBUG_SCARD(("file 0x%.8x\n", file)); |
692 |
|
DEBUG_SCARD(("id 0x%.8x\n", id)); |
693 |
|
#ifdef WITH_SCARD |
694 |
|
scardSetInfo(device, id, bytes_out + 0x14); |
695 |
|
#endif |
696 |
status = fns->device_control(file, request, s, &out); |
status = fns->device_control(file, request, s, &out); |
697 |
result = buffer_len = out.p - out.data; |
result = buffer_len = out.p - out.data; |
698 |
|
|
699 |
|
DEBUG_SCARD(("[SMART-CARD TRACE] OUT 0x%.8x\n", status)); |
700 |
|
|
701 |
/* Serial SERIAL_WAIT_ON_MASK */ |
/* Serial SERIAL_WAIT_ON_MASK */ |
702 |
if (status == STATUS_PENDING) |
if (status == STATUS_PENDING) |
703 |
{ |
{ |
708 |
break; |
break; |
709 |
} |
} |
710 |
} |
} |
711 |
|
#ifdef WITH_SCARD |
712 |
|
else if (status == (STATUS_PENDING | 0xC0000000)) |
713 |
|
status = STATUS_PENDING; |
714 |
|
#endif |
715 |
break; |
break; |
716 |
|
|
717 |
|
|