/*********************************************************/ /* ptycon: a pty-console bridge */ /* Copyright (C) 2016--2017 SysDeer Technologies, LLC */ /* Released under GPLv2 and GPLv3; see COPYING.PTYCON. */ /*********************************************************/ #include #include #include #include #include #include "ptycon_driver_impl.h" int __stdcall ptyc_dbg_raw(struct ptyc_driver_ctx_impl * ictx) { 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,(uint32_t)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); }