From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received-SPF: Pass (sender SPF authorized) identity=mailfrom; client-ip=192.55.52.115; helo=mga14.intel.com; envelope-from=ruiyu.ni@intel.com; receiver=edk2-devel@lists.01.org Received: from mga14.intel.com (mga14.intel.com [192.55.52.115]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by ml01.01.org (Postfix) with ESMTPS id A8F602194D3B3 for ; Thu, 23 Aug 2018 02:51:38 -0700 (PDT) X-Amp-Result: SKIPPED(no attachment in message) X-Amp-File-Uploaded: False Received: from orsmga002.jf.intel.com ([10.7.209.21]) by fmsmga103.fm.intel.com with ESMTP/TLS/DHE-RSA-AES256-GCM-SHA384; 23 Aug 2018 02:51:38 -0700 X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="5.53,278,1531810800"; d="scan'208";a="85740729" Received: from ray-dev.ccr.corp.intel.com ([10.239.9.8]) by orsmga002.jf.intel.com with ESMTP; 23 Aug 2018 02:51:37 -0700 From: Ruiyu Ni To: edk2-devel@lists.01.org Cc: Hao A Wu , Andrew Fish Date: Thu, 23 Aug 2018 17:52:07 +0800 Message-Id: <20180823095215.274248-5-ruiyu.ni@intel.com> X-Mailer: git-send-email 2.16.1.windows.1 In-Reply-To: <20180823095215.274248-1-ruiyu.ni@intel.com> References: <20180823095215.274248-1-ruiyu.ni@intel.com> Subject: [PATCH 04/12] EmulatorPkg/Win: Enable native OS console as firmware console X-BeenThere: edk2-devel@lists.01.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: EDK II Development List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Thu, 23 Aug 2018 09:51:38 -0000 The patch implements Stdin/Stdout/Stderr access so that the native OS console (cmd.exe) can be used as the firmware console and debug message can also be routed to it. Contributed-under: TianoCore Contribution Agreement 1.1 Signed-off-by: Ruiyu Ni Cc: Hao A Wu Cc: Andrew Fish --- EmulatorPkg/Win/Host/WinThunk.c | 109 ++++++++++++++++++++++++++++++++++++++-- 1 file changed, 105 insertions(+), 4 deletions(-) diff --git a/EmulatorPkg/Win/Host/WinThunk.c b/EmulatorPkg/Win/Host/WinThunk.c index 5ec5d439d4..69a61258f3 100644 --- a/EmulatorPkg/Win/Host/WinThunk.c +++ b/EmulatorPkg/Win/Host/WinThunk.c @@ -42,7 +42,19 @@ SecWriteStdErr ( IN UINTN NumberOfBytes ) { - return 0; + BOOL Success; + DWORD CharCount; + + CharCount = (DWORD)NumberOfBytes; + Success = WriteFile ( + GetStdHandle (STD_ERROR_HANDLE), + Buffer, + CharCount, + &CharCount, + NULL + ); + + return Success ? CharCount : 0; } @@ -51,7 +63,32 @@ SecConfigStdIn ( VOID ) { - return EFI_SUCCESS; + BOOL Success; + DWORD Mode; + + Success = GetConsoleMode (GetStdHandle (STD_INPUT_HANDLE), &Mode); + if (Success) { + // + // Disable buffer (line input), echo, mouse, window + // + Success = SetConsoleMode ( + GetStdHandle (STD_INPUT_HANDLE), + Mode | ENABLE_VIRTUAL_TERMINAL_INPUT & ~(ENABLE_LINE_INPUT | ENABLE_ECHO_INPUT | ENABLE_MOUSE_INPUT | ENABLE_WINDOW_INPUT) + ); + } + if (Success) { + // + // Enable terminal mode + // + Success = GetConsoleMode (GetStdHandle (STD_OUTPUT_HANDLE), &Mode); + if (Success) { + Success = SetConsoleMode ( + GetStdHandle (STD_OUTPUT_HANDLE), + Mode | ENABLE_VIRTUAL_TERMINAL_PROCESSING | DISABLE_NEWLINE_AUTO_RETURN + ); + } + } + return Success ? EFI_SUCCESS : EFI_DEVICE_ERROR; } UINTN @@ -60,7 +97,19 @@ SecWriteStdOut ( IN UINTN NumberOfBytes ) { - return 0; + BOOL Success; + DWORD CharCount; + + CharCount = (DWORD)NumberOfBytes; + Success = WriteFile ( + GetStdHandle (STD_OUTPUT_HANDLE), + Buffer, + CharCount, + &CharCount, + NULL + ); + + return Success ? CharCount : 0; } BOOLEAN @@ -68,6 +117,38 @@ SecPollStdIn ( VOID ) { + BOOL Success; + INPUT_RECORD Record; + DWORD RecordNum; + + do { + Success = GetNumberOfConsoleInputEvents (GetStdHandle (STD_INPUT_HANDLE), &RecordNum); + if (!Success || (RecordNum == 0)) { + break; + } + Success = PeekConsoleInput ( + GetStdHandle (STD_INPUT_HANDLE), + &Record, + 1, + &RecordNum + ); + if (Success && (RecordNum == 1)) { + if (Record.EventType == KEY_EVENT && Record.Event.KeyEvent.bKeyDown) { + return TRUE; + } else { + // + // Consume the non-key event. + // + Success = ReadConsoleInput ( + GetStdHandle (STD_INPUT_HANDLE), + &Record, + 1, + &RecordNum + ); + } + } + } while (Success); + return FALSE; } @@ -77,7 +158,27 @@ SecReadStdIn ( IN UINTN NumberOfBytes ) { - return 0; + BOOL Success; + INPUT_RECORD Record; + DWORD RecordNum; + UINTN BytesReturn; + + if (!SecPollStdIn ()) { + return 0; + } + Success = ReadConsoleInput ( + GetStdHandle (STD_INPUT_HANDLE), + &Record, + 1, + &RecordNum + ); + ASSERT (Success && (RecordNum == 1) && (Record.EventType == KEY_EVENT) && (Record.Event.KeyEvent.bKeyDown)); + NumberOfBytes = MIN (Record.Event.KeyEvent.wRepeatCount, NumberOfBytes); + BytesReturn = NumberOfBytes; + while (NumberOfBytes-- != 0) { + Buffer[NumberOfBytes] = Record.Event.KeyEvent.uChar.AsciiChar; + } + return BytesReturn; } -- 2.16.1.windows.1