From 11483c8f8afb089c39acabb2055f1a7167a9f531 Mon Sep 17 00:00:00 2001 From: midipix Date: Wed, 13 Jul 2016 04:50:51 -0400 Subject: debug: ptyc_dbg_raw(): initial implementation. --- src/debug/ptyc_dbg_raw.c | 58 ++++++++++++++++++++++++++++++++++++++++++++++-- 1 file changed, 56 insertions(+), 2 deletions(-) (limited to 'src') diff --git a/src/debug/ptyc_dbg_raw.c b/src/debug/ptyc_dbg_raw.c index 0e5814f..8d30d3e 100644 --- a/src/debug/ptyc_dbg_raw.c +++ b/src/debug/ptyc_dbg_raw.c @@ -14,6 +14,60 @@ int __stdcall ptyc_dbg_raw(struct ptyc_driver_ctx_impl * ictx) { - (void)ictx; - return ntapi->tt_wait_for_dummy_event(); + int32_t status; + void * hwait; + char * ch; + nt_iosb iosb; + size_t nbytes; + unsigned char uch; + unsigned int keyval; + char xch[6] = {0,0,0,0,0,0}; + + if ((status = ntapi->tt_create_private_event( + &hwait, + NT_NOTIFICATION_EVENT, + NT_EVENT_NOT_SIGNALED))) + return status; + + do { + status = ntapi->pty_read( + ictx->cctx.hpts, + hwait,0,0, + &iosb, + &uch,1, + 0,0); + + if (status == NT_STATUS_PENDING) + status = ntapi->zw_wait_for_single_object( + hwait,NT_SYNC_ALERTABLE,0); + + if (status || iosb.status) { + ntapi->zw_close(hwait); + return status ? status : iosb.status; + } + + ntapi->sprintf(xch,"0x%02x ",(keyval = uch)); + nbytes = sizeof(xch) - 1; + + for (ch=xch; nbytes; ) { + status = ntapi->pty_write( + ictx->cctx.hpts, + hwait,0,0, + &iosb, + ch,nbytes, + 0,0); + + if (status == NT_STATUS_PENDING) + status = ntapi->zw_wait_for_single_object( + hwait,NT_SYNC_ALERTABLE,0); + + if (status || iosb.status) { + ntapi->zw_close(hwait); + return status ? status : iosb.status; + } + + ch += iosb.info; + nbytes -= iosb.info; + } + } while (1); } -- cgit v1.2.3