summaryrefslogtreecommitdiffhomepage
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/debug/ptyc_dbg_raw.c58
1 files changed, 56 insertions, 2 deletions
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);
}