Blob Blame History Raw
/*********************************************************/
/*  ptycon: a pty-console bridge                         */
/*  Copyright (C) 2016--2017  SysDeer Technologies, LLC  */
/*  Released under GPLv2 and GPLv3; see COPYING.PTYCON.  */
/*********************************************************/

#include <psxtypes/psxtypes.h>
#include <ntcon/ntcon.h>
#include <ntapi/ntapi.h>
#include <gdi/gdi.h>

#include <ptycon/ptycon.h>
#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);
}