diff options
Diffstat (limited to 'src/debug')
-rw-r--r-- | src/debug/ptyc_dbg_oven.c | 56 |
1 files changed, 54 insertions, 2 deletions
diff --git a/src/debug/ptyc_dbg_oven.c b/src/debug/ptyc_dbg_oven.c index 7357f57..4adc5f8 100644 --- a/src/debug/ptyc_dbg_oven.c +++ b/src/debug/ptyc_dbg_oven.c @@ -14,6 +14,58 @@ int __stdcall ptyc_dbg_oven(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 nread; + uintptr_t buffer[4196/sizeof(uintptr_t)]; + + 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, + buffer,sizeof(buffer), + 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 = (char *)buffer; + nread = iosb.info; + + for ( ; nread; ) { + status = ntapi->pty_write( + ictx->cctx.hpts, + hwait,0,0, + &iosb, + ch,nread, + 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; + nread -= iosb.info; + } + } while (1); } |