From a94e508010184a30e0cd24e4d17fca6ed9ef2842 Mon Sep 17 00:00:00 2001 From: Dustin Howett Date: Wed, 10 Aug 2022 21:14:52 +0000 Subject: [PATCH 1/4] Merged PR 7705187: [Git2Git] Merged PR 7693103: Reintroduce OneCore redirects for MapVKeyW/VkKeyScanW/GetKeyState This pull request reintroduces aliases for `VkKeyScanW`, `MapVirtualKeyW` and `GetKeyState` that redirect through ConIoSrv on OneCore devices. We made an assertion in PR !7096375 that those APIs were hosted in an extension APIset that was present on all OneCore devices. It turned out that this was _incorrect_: that APIset extension is only hosted on OneCoreUAP and above. This would not be a problem save for NanoServer. NanoServer is built on top of OneCore. As Nano is a container host OS, it is primarily interfaced vith via ConPTY... which exercises the VkKeyScanW/MapVirtualKeyW codepaths quite a bit. Those APIs started returning invalid data, which caused us to convert all incoming keyboard events into numpad events. This didn't prove to be an issue for CMD or PowerShell (weirdly,) but it did prove to be an issue for Redis. Unfortunately, Redis is exactly the sort of thing you might want to run in a container. Reintroducing these aliases was complicated because we took the opportunity to remove all of IInputServices (!7105348), which was a wrapper around some code that would choose Win32 or OneCore depending on the runtime environment. I made the choice (with the help of Leonard Hecker) to reimplement these functions in a different way: always call the delay-loaded version, and then on OneCore editions check the return value and error code to ssee if we hit a delay load failure. It incurs a minor cost, but all of the delay loads are in-proc and do not require us to make a syscall, so that cost is negligible. Part of this new implementation requires us to change _all conhost internal callers_ to use "OneCoreSafe" versions of those APIs. We can't redirect the user32 versions out of the way and usurp their import symbols, so this commit also introduces some warning defines. If you use VkKeyScanW (and friends), you _should_ get a linker error. Assuming HostAndPropsheetIncludes has been included. It very well may not have been included. Fixes MSFT-40435912 Retrieved from https://microsoft.visualstudio.com os.2020 OS official/rs_wdx_dxp_windev 949e8dfc07f122520c6a74412329a6f7e77d19c5 --- src/host/input.cpp | 16 +-- src/host/selectionInput.cpp | 6 +- src/host/stream.cpp | 2 +- src/host/ut_host/ClipboardTests.cpp | 18 +-- src/inc/HostAndPropsheetIncludes.h | 8 ++ src/interactivity/base/EventSynthesis.cpp | 7 +- src/interactivity/base/VtApiRedirection.cpp | 75 +++++++++++ .../base/lib/InteractivityBase.vcxproj | 2 + .../lib/InteractivityBase.vcxproj.filters | 5 +- src/interactivity/base/sources.inc | 3 +- src/interactivity/inc/VtApiRedirection.hpp | 33 +++++ src/interactivity/onecore/ConIoSrvComm.cpp | 116 ++++++++++++++++++ src/interactivity/onecore/ConIoSrvComm.hpp | 7 ++ src/interactivity/win32/Clipboard.cpp | 2 +- src/interactivity/win32/consoleKeyInfo.cpp | 2 +- src/interactivity/win32/windowio.cpp | 24 ++-- src/project.inc | 2 +- src/propsheet/ColorsPage.cpp | 7 ++ src/terminal/adapter/sources.inc | 2 +- .../ut_adapter/Adapter.UnitTests.vcxproj | 21 ++++ src/terminal/adapter/ut_adapter/inputTest.cpp | 24 ++-- src/terminal/input/mouseInput.cpp | 1 + src/terminal/input/sources.inc | 2 +- src/terminal/input/terminalInput.cpp | 13 +- .../parser/InputStateMachineEngine.cpp | 19 +-- src/terminal/parser/sources.inc | 2 +- .../parser/ut_parser/InputEngineTest.cpp | 42 ++++--- src/terminal/parser/ut_parser/sources | 99 ++++++++++++++- src/types/sources.inc | 2 +- 29 files changed, 468 insertions(+), 94 deletions(-) create mode 100644 src/interactivity/base/VtApiRedirection.cpp create mode 100644 src/interactivity/inc/VtApiRedirection.hpp diff --git a/src/host/input.cpp b/src/host/input.cpp index e49dee1a8be..35e3a41fcca 100644 --- a/src/host/input.cpp +++ b/src/host/input.cpp @@ -52,35 +52,35 @@ ULONG GetControlKeyState(const LPARAM lParam) { ULONG ControlKeyState = 0; - if (GetKeyState(VK_LMENU) & KEY_PRESSED) + if (OneCoreSafeGetKeyState(VK_LMENU) & KEY_PRESSED) { ControlKeyState |= LEFT_ALT_PRESSED; } - if (GetKeyState(VK_RMENU) & KEY_PRESSED) + if (OneCoreSafeGetKeyState(VK_RMENU) & KEY_PRESSED) { ControlKeyState |= RIGHT_ALT_PRESSED; } - if (GetKeyState(VK_LCONTROL) & KEY_PRESSED) + if (OneCoreSafeGetKeyState(VK_LCONTROL) & KEY_PRESSED) { ControlKeyState |= LEFT_CTRL_PRESSED; } - if (GetKeyState(VK_RCONTROL) & KEY_PRESSED) + if (OneCoreSafeGetKeyState(VK_RCONTROL) & KEY_PRESSED) { ControlKeyState |= RIGHT_CTRL_PRESSED; } - if (GetKeyState(VK_SHIFT) & KEY_PRESSED) + if (OneCoreSafeGetKeyState(VK_SHIFT) & KEY_PRESSED) { ControlKeyState |= SHIFT_PRESSED; } - if (GetKeyState(VK_NUMLOCK) & KEY_TOGGLED) + if (OneCoreSafeGetKeyState(VK_NUMLOCK) & KEY_TOGGLED) { ControlKeyState |= NUMLOCK_ON; } - if (GetKeyState(VK_SCROLL) & KEY_TOGGLED) + if (OneCoreSafeGetKeyState(VK_SCROLL) & KEY_TOGGLED) { ControlKeyState |= SCROLLLOCK_ON; } - if (GetKeyState(VK_CAPITAL) & KEY_TOGGLED) + if (OneCoreSafeGetKeyState(VK_CAPITAL) & KEY_TOGGLED) { ControlKeyState |= CAPSLOCK_ON; } diff --git a/src/host/selectionInput.cpp b/src/host/selectionInput.cpp index 115911eb84d..895855f70cb 100644 --- a/src/host/selectionInput.cpp +++ b/src/host/selectionInput.cpp @@ -25,7 +25,7 @@ Selection::KeySelectionEventResult Selection::HandleKeySelectionEvent(const INPU FAIL_FAST_IF(!IsInSelectingState()); const auto wVirtualKeyCode = pInputKeyInfo->GetVirtualKey(); - const auto ctrlPressed = WI_IsFlagSet(GetKeyState(VK_CONTROL), KEY_PRESSED); + const auto ctrlPressed = WI_IsFlagSet(OneCoreSafeGetKeyState(VK_CONTROL), KEY_PRESSED); // if escape or ctrl-c, cancel selection if (!IsMouseButtonDown()) @@ -611,7 +611,7 @@ bool Selection::HandleKeyboardLineSelectionEvent(const INPUT_KEY_INFO* const pIn // - void Selection::CheckAndSetAlternateSelection() { - _fUseAlternateSelection = !!(GetKeyState(VK_MENU) & KEY_PRESSED); + _fUseAlternateSelection = !!(OneCoreSafeGetKeyState(VK_MENU) & KEY_PRESSED); } // Routine Description: @@ -904,7 +904,7 @@ bool Selection::_HandleMarkModeSelectionNav(const INPUT_KEY_INFO* const pInputKe } // see if shift is down. if so, we're extending the selection. otherwise, we're resetting the anchor - if (GetKeyState(VK_SHIFT) & KEY_PRESSED) + if (OneCoreSafeGetKeyState(VK_SHIFT) & KEY_PRESSED) { // if we're just starting to "extend" our selection from moving around as a cursor // then attempt to set the alternate selection state based on the ALT key right now diff --git a/src/host/stream.cpp b/src/host/stream.cpp index 3091c7a1fd4..23dd8002719 100644 --- a/src/host/stream.cpp +++ b/src/host/stream.cpp @@ -153,7 +153,7 @@ using Microsoft::Console::Interactivity::ServiceLocator; } else { - const auto zeroVkeyData = VkKeyScanW(0); + const auto zeroVkeyData = OneCoreSafeVkKeyScanW(0); const auto zeroVKey = LOBYTE(zeroVkeyData); const auto zeroControlKeyState = HIBYTE(zeroVkeyData); diff --git a/src/host/ut_host/ClipboardTests.cpp b/src/host/ut_host/ClipboardTests.cpp index 21314875279..a8766454ef0 100644 --- a/src/host/ut_host/ClipboardTests.cpp +++ b/src/host/ut_host/ClipboardTests.cpp @@ -15,6 +15,8 @@ #include +#include "../../interactivity/inc/VtApiRedirection.hpp" + #include "../../inc/consoletaeftemplates.hpp" using namespace WEX::Common; @@ -167,9 +169,9 @@ class ClipboardTests keyEvent.reset(static_cast(events.front().release())); events.pop_front(); - const auto keyState = VkKeyScanW(wch); + const auto keyState = OneCoreSafeVkKeyScanW(wch); VERIFY_ARE_NOT_EQUAL(-1, keyState); - const auto virtualScanCode = static_cast(MapVirtualKeyW(LOBYTE(keyState), MAPVK_VK_TO_VSC)); + const auto virtualScanCode = static_cast(OneCoreSafeMapVirtualKeyW(LOBYTE(keyState), MAPVK_VK_TO_VSC)); VERIFY_ARE_EQUAL(wch, keyEvent->GetCharData()); VERIFY_ARE_EQUAL(isKeyDown, keyEvent->IsKeyDown()); @@ -206,9 +208,9 @@ class ClipboardTests events.pop_front(); const short keyScanError = -1; - const auto keyState = VkKeyScanW(wch); + const auto keyState = OneCoreSafeVkKeyScanW(wch); VERIFY_ARE_NOT_EQUAL(keyScanError, keyState); - const auto virtualScanCode = static_cast(MapVirtualKeyW(LOBYTE(keyState), MAPVK_VK_TO_VSC)); + const auto virtualScanCode = static_cast(OneCoreSafeMapVirtualKeyW(LOBYTE(keyState), MAPVK_VK_TO_VSC)); if (std::isupper(wch)) { @@ -222,9 +224,9 @@ class ClipboardTests keyEvent2.reset(static_cast(events.front().release())); events.pop_front(); - const auto keyState2 = VkKeyScanW(wch); + const auto keyState2 = OneCoreSafeVkKeyScanW(wch); VERIFY_ARE_NOT_EQUAL(keyScanError, keyState2); - const auto virtualScanCode2 = static_cast(MapVirtualKeyW(LOBYTE(keyState2), MAPVK_VK_TO_VSC)); + const auto virtualScanCode2 = static_cast(OneCoreSafeMapVirtualKeyW(LOBYTE(keyState2), MAPVK_VK_TO_VSC)); if (isKeyDown) { @@ -258,9 +260,9 @@ class ClipboardTests { const std::wstring wstr = L"\x20ac"; // € char U+20AC - const auto keyState = VkKeyScanW(wstr[0]); + const auto keyState = OneCoreSafeVkKeyScanW(wstr[0]); const WORD virtualKeyCode = LOBYTE(keyState); - const auto virtualScanCode = static_cast(MapVirtualKeyW(virtualKeyCode, MAPVK_VK_TO_VSC)); + const auto virtualScanCode = static_cast(OneCoreSafeMapVirtualKeyW(virtualKeyCode, MAPVK_VK_TO_VSC)); if (keyState == -1 || HIBYTE(keyState) == 0 /* no modifiers required */) { diff --git a/src/inc/HostAndPropsheetIncludes.h b/src/inc/HostAndPropsheetIncludes.h index d0ede2a3a38..1f273119137 100644 --- a/src/inc/HostAndPropsheetIncludes.h +++ b/src/inc/HostAndPropsheetIncludes.h @@ -39,6 +39,14 @@ typedef NTSTATUS *PNTSTATUS; #include +#define VkKeyScanW DO_NOT_USE_VkKeyScanW_USE_OneCoreSafeVkKeyScanW +#define MapVirtualKeyW DO_NOT_USE_MapVirtualKeyW_USE_OneCoreSafeMapVirtualKeyW +#define GetKeyState DO_NOT_USE_GetKeyState_USE_OneCoreSafeGetKeyState + +// This header contains some overrides for win32 APIs +// that cannot exist on OneCore +#include "../interactivity/inc/VtApiRedirection.hpp" + #include // Only remaining item from w32gdip.h. There's probably a better way to do this as well. diff --git a/src/interactivity/base/EventSynthesis.cpp b/src/interactivity/base/EventSynthesis.cpp index e9b3a390c39..398b72730c2 100644 --- a/src/interactivity/base/EventSynthesis.cpp +++ b/src/interactivity/base/EventSynthesis.cpp @@ -4,6 +4,7 @@ #include "precomp.h" #include "../inc/EventSynthesis.hpp" #include "../../types/inc/convert.hpp" +#include "../inc/VtApiRedirection.hpp" #pragma hdrstop @@ -44,7 +45,7 @@ std::deque> Microsoft::Console::Interactivity::CharToK const unsigned int codepage) { const short invalidKey = -1; - auto keyState = VkKeyScanW(wch); + auto keyState = OneCoreSafeVkKeyScanW(wch); if (keyState == invalidKey) { @@ -110,7 +111,7 @@ std::deque> Microsoft::Console::Interactivity::Synthes } const auto vk = LOBYTE(keyState); - const auto virtualScanCode = gsl::narrow(MapVirtualKeyW(vk, MAPVK_VK_TO_VSC)); + const auto virtualScanCode = gsl::narrow(OneCoreSafeMapVirtualKeyW(vk, MAPVK_VK_TO_VSC)); KeyEvent keyEvent{ true, 1, LOBYTE(keyState), virtualScanCode, wch, 0 }; // add modifier flags if necessary @@ -200,7 +201,7 @@ std::deque> Microsoft::Console::Interactivity::Synthes break; } const WORD virtualKey = ch - '0' + VK_NUMPAD0; - const auto virtualScanCode = gsl::narrow(MapVirtualKeyW(virtualKey, MAPVK_VK_TO_VSC)); + const auto virtualScanCode = gsl::narrow(OneCoreSafeMapVirtualKeyW(virtualKey, MAPVK_VK_TO_VSC)); keyEvents.push_back(std::make_unique(true, 1ui16, diff --git a/src/interactivity/base/VtApiRedirection.cpp b/src/interactivity/base/VtApiRedirection.cpp new file mode 100644 index 00000000000..41630c99aac --- /dev/null +++ b/src/interactivity/base/VtApiRedirection.cpp @@ -0,0 +1,75 @@ +// Copyright (c) Microsoft Corporation +// Licensed under the MIT license. + +#include "precomp.h" +#include "../inc/VtApiRedirection.hpp" +#include "../onecore/ConIoSrvComm.hpp" +#pragma hdrstop + +// The project include file defines these to be invalid symbols +// to clue in developers across the project not to use them. +// +// We have to use them here. +#undef VkKeyScanW +#undef MapVirtualKeyW +#undef GetKeyState + +UINT OneCoreSafeMapVirtualKeyW(_In_ UINT uCode, _In_ UINT uMapType) +{ + auto ret{ MapVirtualKeyW(uCode, uMapType) }; +#ifdef BUILD_ONECORE_INTERACTIVITY + if (ret == 0) + { + const auto lastError{ GetLastError() }; + if (lastError == ERROR_PROC_NOT_FOUND || lastError == ERROR_DELAY_LOAD_FAILED) + { + if (auto conIoSrvComm{ Microsoft::Console::Interactivity::OneCore::ConIoSrvComm::GetConIoSrvComm() }) + { + SetLastError(0); + ret = conIoSrvComm->ConIoMapVirtualKeyW(uCode, uMapType); + } + } + } +#endif + return ret; +} + +SHORT OneCoreSafeVkKeyScanW(_In_ WCHAR ch) +{ + auto ret{ VkKeyScanW(ch) }; +#ifdef BUILD_ONECORE_INTERACTIVITY + if (ret == -1) + { + const auto lastError{ GetLastError() }; + if (lastError == ERROR_PROC_NOT_FOUND || lastError == ERROR_DELAY_LOAD_FAILED) + { + if (auto conIoSrvComm{ Microsoft::Console::Interactivity::OneCore::ConIoSrvComm::GetConIoSrvComm() }) + { + SetLastError(0); + ret = conIoSrvComm->ConIoVkKeyScanW(ch); + } + } + } +#endif + return ret; +} + +SHORT OneCoreSafeGetKeyState(_In_ int nVirtKey) +{ + auto ret{ GetKeyState(nVirtKey) }; +#ifdef BUILD_ONECORE_INTERACTIVITY + if (ret == 0) + { + const auto lastError{ GetLastError() }; + if (lastError == ERROR_PROC_NOT_FOUND || lastError == ERROR_DELAY_LOAD_FAILED) + { + if (auto conIoSrvComm{ Microsoft::Console::Interactivity::OneCore::ConIoSrvComm::GetConIoSrvComm() }) + { + SetLastError(0); + ret = conIoSrvComm->ConIoGetKeyState(nVirtKey); + } + } + } +#endif + return ret; +} diff --git a/src/interactivity/base/lib/InteractivityBase.vcxproj b/src/interactivity/base/lib/InteractivityBase.vcxproj index 0af5193c7e2..aefa245f24c 100644 --- a/src/interactivity/base/lib/InteractivityBase.vcxproj +++ b/src/interactivity/base/lib/InteractivityBase.vcxproj @@ -30,6 +30,7 @@ + @@ -41,6 +42,7 @@ + diff --git a/src/interactivity/base/lib/InteractivityBase.vcxproj.filters b/src/interactivity/base/lib/InteractivityBase.vcxproj.filters index 5b833a07127..d761db55b44 100644 --- a/src/interactivity/base/lib/InteractivityBase.vcxproj.filters +++ b/src/interactivity/base/lib/InteractivityBase.vcxproj.filters @@ -74,6 +74,9 @@ Header Files + + Header Files + Header Files @@ -90,4 +93,4 @@ - + \ No newline at end of file diff --git a/src/interactivity/base/sources.inc b/src/interactivity/base/sources.inc index 69e423131c2..5d77a022b0b 100644 --- a/src/interactivity/base/sources.inc +++ b/src/interactivity/base/sources.inc @@ -13,7 +13,7 @@ # Preprocessor Settings # ------------------------------------- -C_DEFINES = $(C_DEFINES) -DBUILD_ONECORE_INTERACTIVITY +C_DEFINES = $(C_DEFINES) # ------------------------------------- # Compiler Settings @@ -39,6 +39,7 @@ SOURCES = \ ..\ApiDetector.cpp \ ..\InteractivityFactory.cpp \ ..\ServiceLocator.cpp \ + ..\VtApiRedirection.cpp \ ..\EventSynthesis.cpp \ ..\RemoteConsoleControl.cpp \ ..\HostSignalInputThread.cpp \ diff --git a/src/interactivity/inc/VtApiRedirection.hpp b/src/interactivity/inc/VtApiRedirection.hpp new file mode 100644 index 00000000000..14ee5ce1f7b --- /dev/null +++ b/src/interactivity/inc/VtApiRedirection.hpp @@ -0,0 +1,33 @@ +/*++ +Copyright (c) Microsoft Corporation +Licensed under the MIT license. + +Module Name: +- VtApiRedirection.h + +Abstract: +- Redefines several input-related API's that are not available on OneCore such + that they be redirected through the ServiceLocator via the IInputServices + interface. +- This ensures that all calls to these API's are executed as normal when the + console is running on big Windows, but that they are also redirected to the + Console IO Server when it is running on a OneCore system, where the OneCore + implementations live. + +Author: +- HeGatta Apr.25.2017 +--*/ + +#pragma once + +#ifdef __cplusplus +extern "C" { +#endif + +UINT OneCoreSafeMapVirtualKeyW(_In_ UINT uCode, _In_ UINT uMapType); +SHORT OneCoreSafeVkKeyScanW(_In_ WCHAR ch); +SHORT OneCoreSafeGetKeyState(_In_ int nVirtKey); + +#ifdef __cplusplus +} +#endif diff --git a/src/interactivity/onecore/ConIoSrvComm.cpp b/src/interactivity/onecore/ConIoSrvComm.cpp index aaa74e697d9..4107ad24a2d 100644 --- a/src/interactivity/onecore/ConIoSrvComm.cpp +++ b/src/interactivity/onecore/ConIoSrvComm.cpp @@ -518,6 +518,70 @@ VOID ConIoSrvComm::CleanupForHeadless(const NTSTATUS status) return Status; } +[[nodiscard]] NTSTATUS ConIoSrvComm::RequestMapVirtualKey(_In_ UINT uCode, _In_ UINT uMapType, _Out_ UINT* puReturnValue) +{ + NTSTATUS Status; + + Status = EnsureConnection(); + if (NT_SUCCESS(Status)) + { + CIS_MSG Message = { 0 }; + Message.Type = CIS_MSG_TYPE_MAPVIRTUALKEY; + Message.MapVirtualKeyParams.Code = uCode; + Message.MapVirtualKeyParams.MapType = uMapType; + + Status = SendRequestReceiveReply(&Message); + if (NT_SUCCESS(Status)) + { + *puReturnValue = Message.MapVirtualKeyParams.ReturnValue; + } + } + + return Status; +} + +[[nodiscard]] NTSTATUS ConIoSrvComm::RequestVkKeyScan(_In_ WCHAR wCharacter, _Out_ SHORT* psReturnValue) +{ + NTSTATUS Status; + + Status = EnsureConnection(); + if (NT_SUCCESS(Status)) + { + CIS_MSG Message = { 0 }; + Message.Type = CIS_MSG_TYPE_VKKEYSCAN; + Message.VkKeyScanParams.Character = wCharacter; + + Status = SendRequestReceiveReply(&Message); + if (NT_SUCCESS(Status)) + { + *psReturnValue = Message.VkKeyScanParams.ReturnValue; + } + } + + return Status; +} + +[[nodiscard]] NTSTATUS ConIoSrvComm::RequestGetKeyState(_In_ int iVirtualKey, _Out_ SHORT* psReturnValue) +{ + NTSTATUS Status; + + Status = EnsureConnection(); + if (NT_SUCCESS(Status)) + { + CIS_MSG Message = { 0 }; + Message.Type = CIS_MSG_TYPE_GETKEYSTATE; + Message.GetKeyStateParams.VirtualKey = iVirtualKey; + + Status = SendRequestReceiveReply(&Message); + if (NT_SUCCESS(Status)) + { + *psReturnValue = Message.GetKeyStateParams.ReturnValue; + } + } + + return Status; +} + [[nodiscard]] USHORT ConIoSrvComm::GetDisplayMode() const noexcept { return _displayMode; @@ -530,6 +594,58 @@ PVOID ConIoSrvComm::GetSharedViewBase() const noexcept #pragma endregion +#pragma region IInputServices Members + +UINT ConIoSrvComm::ConIoMapVirtualKeyW(UINT uCode, UINT uMapType) +{ + NTSTATUS Status = STATUS_SUCCESS; + + UINT ReturnValue; + Status = RequestMapVirtualKey(uCode, uMapType, &ReturnValue); + + if (!NT_SUCCESS(Status)) + { + ReturnValue = 0; + SetLastError(ERROR_PROC_NOT_FOUND); + } + + return ReturnValue; +} + +SHORT ConIoSrvComm::ConIoVkKeyScanW(WCHAR ch) +{ + NTSTATUS Status = STATUS_SUCCESS; + + SHORT ReturnValue; + Status = RequestVkKeyScan(ch, &ReturnValue); + + if (!NT_SUCCESS(Status)) + { + ReturnValue = 0; + SetLastError(ERROR_PROC_NOT_FOUND); + } + + return ReturnValue; +} + +SHORT ConIoSrvComm::ConIoGetKeyState(int nVirtKey) +{ + NTSTATUS Status = STATUS_SUCCESS; + + SHORT ReturnValue; + Status = RequestGetKeyState(nVirtKey, &ReturnValue); + + if (!NT_SUCCESS(Status)) + { + ReturnValue = 0; + SetLastError(ERROR_PROC_NOT_FOUND); + } + + return ReturnValue; +} + +#pragma endregion + [[nodiscard]] NTSTATUS ConIoSrvComm::InitializeBgfx() { const auto& globals = ServiceLocator::LocateGlobals(); diff --git a/src/interactivity/onecore/ConIoSrvComm.hpp b/src/interactivity/onecore/ConIoSrvComm.hpp index ba1e7b5441d..879b631638b 100644 --- a/src/interactivity/onecore/ConIoSrvComm.hpp +++ b/src/interactivity/onecore/ConIoSrvComm.hpp @@ -41,12 +41,19 @@ namespace Microsoft::Console::Interactivity::OneCore [[nodiscard]] NTSTATUS RequestSetCursor(_In_ const CD_IO_CURSOR_INFORMATION* const pCdCursorInformation) const; [[nodiscard]] NTSTATUS RequestUpdateDisplay(_In_ til::CoordType RowIndex) const; + [[nodiscard]] NTSTATUS RequestMapVirtualKey(_In_ UINT uCode, _In_ UINT uMapType, _Out_ UINT* puReturnValue); + [[nodiscard]] NTSTATUS RequestVkKeyScan(_In_ WCHAR wCharacter, _Out_ SHORT* psReturnValue); + [[nodiscard]] NTSTATUS RequestGetKeyState(_In_ int iVirtualKey, _Out_ SHORT* psReturnValue); [[nodiscard]] USHORT GetDisplayMode() const noexcept; PVOID GetSharedViewBase() const noexcept; VOID CleanupForHeadless(const NTSTATUS status); + UINT ConIoMapVirtualKeyW(UINT uCode, UINT uMapType); + SHORT ConIoVkKeyScanW(WCHAR ch); + SHORT ConIoGetKeyState(int nVirtKey); + [[nodiscard]] NTSTATUS InitializeBgfx(); [[nodiscard]] NTSTATUS InitializeWddmCon(); diff --git a/src/interactivity/win32/Clipboard.cpp b/src/interactivity/win32/Clipboard.cpp index 6d7d1e22ded..1f9eacc90f1 100644 --- a/src/interactivity/win32/Clipboard.cpp +++ b/src/interactivity/win32/Clipboard.cpp @@ -214,7 +214,7 @@ void Clipboard::StoreSelectionToClipboard(const bool copyFormatting) }; bool includeCRLF, trimTrailingWhitespace; - if (WI_IsFlagSet(GetKeyState(VK_SHIFT), KEY_PRESSED)) + if (WI_IsFlagSet(OneCoreSafeGetKeyState(VK_SHIFT), KEY_PRESSED)) { // When shift is held, put everything in one line includeCRLF = trimTrailingWhitespace = false; diff --git a/src/interactivity/win32/consoleKeyInfo.cpp b/src/interactivity/win32/consoleKeyInfo.cpp index 603ca6aefad..5aa0f18a85a 100644 --- a/src/interactivity/win32/consoleKeyInfo.cpp +++ b/src/interactivity/win32/consoleKeyInfo.cpp @@ -69,7 +69,7 @@ void RetrieveKeyInfo(_In_ HWND hWnd, _Out_ PWORD pwVirtualKeyCode, _Inout_ PWORD } else { - *pwVirtualKeyCode = (WORD)MapVirtualKeyW(*pwVirtualScanCode, 3); + *pwVirtualKeyCode = (WORD)OneCoreSafeMapVirtualKeyW(*pwVirtualScanCode, 3); } } diff --git a/src/interactivity/win32/windowio.cpp b/src/interactivity/win32/windowio.cpp index c0f9902e82e..a7248780206 100644 --- a/src/interactivity/win32/windowio.cpp +++ b/src/interactivity/win32/windowio.cpp @@ -129,9 +129,9 @@ bool HandleTerminalMouseEvent(const til::point cMousePosition, if (IsInVirtualTerminalInputMode()) { const TerminalInput::MouseButtonState state{ - WI_IsFlagSet(GetKeyState(VK_LBUTTON), KeyPressed), - WI_IsFlagSet(GetKeyState(VK_MBUTTON), KeyPressed), - WI_IsFlagSet(GetKeyState(VK_RBUTTON), KeyPressed) + WI_IsFlagSet(OneCoreSafeGetKeyState(VK_LBUTTON), KeyPressed), + WI_IsFlagSet(OneCoreSafeGetKeyState(VK_MBUTTON), KeyPressed), + WI_IsFlagSet(OneCoreSafeGetKeyState(VK_RBUTTON), KeyPressed) }; // GH#6401: VT applications should be able to receive mouse events from outside the @@ -394,7 +394,7 @@ void HandleKeyEvent(const HWND hWnd, if (handlingResult == Selection::KeySelectionEventResult::CopyToClipboard) { // If the ALT key is held, also select HTML as well as plain text. - const auto fAlsoSelectHtml = WI_IsFlagSet(GetKeyState(VK_MENU), KEY_PRESSED); + const auto fAlsoSelectHtml = WI_IsFlagSet(OneCoreSafeGetKeyState(VK_MENU), KEY_PRESSED); Clipboard::Instance().Copy(fAlsoSelectHtml); return; } @@ -476,7 +476,7 @@ BOOL HandleSysKeyEvent(const HWND hWnd, const UINT Message, const WPARAM wParam, if (Message == WM_SYSCHAR || Message == WM_SYSDEADCHAR) { - VirtualKeyCode = (WORD)MapVirtualKeyW(LOBYTE(HIWORD(lParam)), MAPVK_VSC_TO_VK_EX); + VirtualKeyCode = (WORD)OneCoreSafeMapVirtualKeyW(LOBYTE(HIWORD(lParam)), MAPVK_VSC_TO_VK_EX); } else { @@ -487,16 +487,16 @@ BOOL HandleSysKeyEvent(const HWND hWnd, const UINT Message, const WPARAM wParam, Telemetry::Instance().SetUserInteractive(); // check for ctrl-esc - const auto bCtrlDown = GetKeyState(VK_CONTROL) & KEY_PRESSED; + const auto bCtrlDown = OneCoreSafeGetKeyState(VK_CONTROL) & KEY_PRESSED; if (VirtualKeyCode == VK_ESCAPE && - bCtrlDown && !(GetKeyState(VK_MENU) & KEY_PRESSED) && !(GetKeyState(VK_SHIFT) & KEY_PRESSED)) + bCtrlDown && !(OneCoreSafeGetKeyState(VK_MENU) & KEY_PRESSED) && !(OneCoreSafeGetKeyState(VK_SHIFT) & KEY_PRESSED)) { return TRUE; // call DefWindowProc } // check for alt-f4 - if (VirtualKeyCode == VK_F4 && (GetKeyState(VK_MENU) & KEY_PRESSED) && IsInProcessedInputMode() && gci.IsAltF4CloseAllowed()) + if (VirtualKeyCode == VK_F4 && (OneCoreSafeGetKeyState(VK_MENU) & KEY_PRESSED) && IsInProcessedInputMode() && gci.IsAltF4CloseAllowed()) { return TRUE; // let DefWindowProc generate WM_CLOSE } @@ -527,7 +527,7 @@ BOOL HandleSysKeyEvent(const HWND hWnd, const UINT Message, const WPARAM wParam, } // make sure alt-space gets translated so that the system menu is displayed. - if (!(GetKeyState(VK_CONTROL) & KEY_PRESSED)) + if (!(OneCoreSafeGetKeyState(VK_CONTROL) & KEY_PRESSED)) { if (VirtualKeyCode == VK_SPACE) { @@ -633,7 +633,7 @@ BOOL HandleMouseEvent(const SCREEN_INFORMATION& ScreenInfo, MousePosition.X /= ScreenFontSize.X; MousePosition.Y /= ScreenFontSize.Y; - const auto fShiftPressed = WI_IsFlagSet(GetKeyState(VK_SHIFT), KEY_PRESSED); + const auto fShiftPressed = WI_IsFlagSet(OneCoreSafeGetKeyState(VK_SHIFT), KEY_PRESSED); // We need to try and have the virtual terminal handle the mouse's position in viewport coordinates, // not in screen buffer coordinates. It expects the top left to always be 0,0 @@ -731,7 +731,7 @@ BOOL HandleMouseEvent(const SCREEN_INFORMATION& ScreenInfo, if (Message == WM_LBUTTONDOWN) { // make sure message matches button state - if (!(GetKeyState(VK_LBUTTON) & KEY_PRESSED)) + if (!(OneCoreSafeGetKeyState(VK_LBUTTON) & KEY_PRESSED)) { return FALSE; } @@ -828,7 +828,7 @@ BOOL HandleMouseEvent(const SCREEN_INFORMATION& ScreenInfo, Telemetry::Instance().LogQuickEditCopyRawUsed(); } // If the ALT key is held, also select HTML as well as plain text. - const auto fAlsoCopyFormatting = WI_IsFlagSet(GetKeyState(VK_MENU), KEY_PRESSED); + const auto fAlsoCopyFormatting = WI_IsFlagSet(OneCoreSafeGetKeyState(VK_MENU), KEY_PRESSED); Clipboard::Instance().Copy(fAlsoCopyFormatting); } else if (gci.Flags & CONSOLE_QUICK_EDIT_MODE) diff --git a/src/project.inc b/src/project.inc index 605e71e59db..f6524606217 100644 --- a/src/project.inc +++ b/src/project.inc @@ -10,7 +10,7 @@ # ------------------------------------- UNICODE = 1 -C_DEFINES = $(C_DEFINES) -DUNICODE -D_UNICODE -DFMT_HEADER_ONLY -D__INSIDE_WINDOWS +C_DEFINES = $(C_DEFINES) -DUNICODE -D_UNICODE -DFMT_HEADER_ONLY -D__INSIDE_WINDOWS -DBUILD_ONECORE_INTERACTIVITY # ------------------------------------- # CRT Configuration diff --git a/src/propsheet/ColorsPage.cpp b/src/propsheet/ColorsPage.cpp index ec372caab52..775fb3f95ff 100644 --- a/src/propsheet/ColorsPage.cpp +++ b/src/propsheet/ColorsPage.cpp @@ -5,6 +5,13 @@ #include "ColorsPage.h" #include "ColorControl.h" +// The property sheet will never load on OneCore, so we do +// not need to redirect users to the OneCore safe versionf +// of these functions. +#undef VkKeyScanW +#undef MapVirtualKeyW +#undef GetKeyState + static BYTE ColorArray[4]; static int iColor; diff --git a/src/terminal/adapter/sources.inc b/src/terminal/adapter/sources.inc index 42639276dfd..87c5507685a 100644 --- a/src/terminal/adapter/sources.inc +++ b/src/terminal/adapter/sources.inc @@ -14,7 +14,7 @@ # Preprocessor Settings # ------------------------------------- -C_DEFINES = $(C_DEFINES) -DBUILD_ONECORE_INTERACTIVITY +C_DEFINES = $(C_DEFINES) # ------------------------------------- # Build System Settings diff --git a/src/terminal/adapter/ut_adapter/Adapter.UnitTests.vcxproj b/src/terminal/adapter/ut_adapter/Adapter.UnitTests.vcxproj index 2d4b31d28c0..9f624095192 100644 --- a/src/terminal/adapter/ut_adapter/Adapter.UnitTests.vcxproj +++ b/src/terminal/adapter/ut_adapter/Adapter.UnitTests.vcxproj @@ -25,12 +25,30 @@ {0cf235bd-2da0-407e-90ee-c467e8bbc714} + + {06ec74cb-9a12-429c-b551-8562ec954746} + {06ec74cb-9a12-429c-b551-8562ec964846} + + {06ec74cb-9a12-429c-b551-8532ec964726} + + + {345fd5a4-b32b-4f29-bd1c-b033bd2c35cc} + {af0a096a-8b3a-4949-81ef-7df8f0fee91f} + + {1c959542-bac2-4e55-9a6d-13251914cbb9} + + + {18d09a24-8240-42d6-8cb6-236eee820262} + + + {2fd12fbb-1ddb-46d8-b818-1023c624caca} + {18d09a24-8240-42d6-8cb6-236eee820263} @@ -40,6 +58,9 @@ {dcf55140-ef6a-4736-a403-957e4f7430bb} + + {0cf235bd-2da0-407e-90ee-c467e8bbc714} + diff --git a/src/terminal/adapter/ut_adapter/inputTest.cpp b/src/terminal/adapter/ut_adapter/inputTest.cpp index ace7de68019..e825f9b54fe 100644 --- a/src/terminal/adapter/ut_adapter/inputTest.cpp +++ b/src/terminal/adapter/ut_adapter/inputTest.cpp @@ -9,6 +9,8 @@ #include "../../input/terminalInput.hpp" +#include "../../../interactivity/inc/VtApiRedirection.hpp" + using namespace WEX::Common; using namespace WEX::Logging; using namespace WEX::TestExecution; @@ -109,7 +111,7 @@ void InputTest::s_TerminalInputTestNullCallback(_In_ std::deque C-_ -> 0x1f uiKeystate = LEFT_CTRL_PRESSED; - vkey = LOBYTE(VkKeyScan(L'/')); + vkey = LOBYTE(OneCoreSafeVkKeyScanW(L'/')); s_expectedInput = L"\x1f"; TestKey(pInput, uiKeystate, vkey, L'/'); uiKeystate = RIGHT_CTRL_PRESSED; @@ -707,7 +709,7 @@ void InputTest::DifferentModifiersTest() // M-/ -> ESC / uiKeystate = LEFT_ALT_PRESSED; - vkey = LOBYTE(VkKeyScan(L'/')); + vkey = LOBYTE(OneCoreSafeVkKeyScanW(L'/')); s_expectedInput = L"\x1b/"; TestKey(pInput, uiKeystate, vkey, L'/'); uiKeystate = RIGHT_ALT_PRESSED; @@ -717,7 +719,7 @@ void InputTest::DifferentModifiersTest() // C-? -> DEL -> 0x7f Log::Comment(NoThrowString().Format(L"Checking C-?")); // Use SHIFT_PRESSED to force us into differentiating between '/' and '?' - vkey = LOBYTE(VkKeyScan(L'?')); + vkey = LOBYTE(OneCoreSafeVkKeyScanW(L'?')); s_expectedInput = L"\x7f"; TestKey(pInput, SHIFT_PRESSED | LEFT_CTRL_PRESSED, vkey, L'?'); TestKey(pInput, SHIFT_PRESSED | RIGHT_CTRL_PRESSED, vkey, L'?'); @@ -725,7 +727,7 @@ void InputTest::DifferentModifiersTest() // C-M-/ -> 0x1b0x1f Log::Comment(NoThrowString().Format(L"Checking C-M-/")); uiKeystate = LEFT_CTRL_PRESSED | LEFT_ALT_PRESSED; - vkey = LOBYTE(VkKeyScan(L'/')); + vkey = LOBYTE(OneCoreSafeVkKeyScanW(L'/')); s_expectedInput = L"\x1b\x1f"; TestKey(pInput, LEFT_CTRL_PRESSED | LEFT_ALT_PRESSED, vkey, L'/'); TestKey(pInput, RIGHT_CTRL_PRESSED | LEFT_ALT_PRESSED, vkey, L'/'); @@ -735,7 +737,7 @@ void InputTest::DifferentModifiersTest() // C-M-? -> 0x1b0x7f Log::Comment(NoThrowString().Format(L"Checking C-M-?")); uiKeystate = LEFT_CTRL_PRESSED | LEFT_ALT_PRESSED; - vkey = LOBYTE(VkKeyScan(L'?')); + vkey = LOBYTE(OneCoreSafeVkKeyScanW(L'?')); s_expectedInput = L"\x1b\x7f"; TestKey(pInput, SHIFT_PRESSED | LEFT_CTRL_PRESSED | LEFT_ALT_PRESSED, vkey, L'?'); TestKey(pInput, SHIFT_PRESSED | RIGHT_CTRL_PRESSED | LEFT_ALT_PRESSED, vkey, L'?'); diff --git a/src/terminal/input/mouseInput.cpp b/src/terminal/input/mouseInput.cpp index 023755a874e..b72a0d97148 100644 --- a/src/terminal/input/mouseInput.cpp +++ b/src/terminal/input/mouseInput.cpp @@ -5,6 +5,7 @@ #include #include "terminalInput.hpp" #include "../types/inc/utils.hpp" +#include "../../interactivity/inc/VtApiRedirection.hpp" using namespace Microsoft::Console::VirtualTerminal; diff --git a/src/terminal/input/sources.inc b/src/terminal/input/sources.inc index 8956b25c52e..8ba6af0433e 100644 --- a/src/terminal/input/sources.inc +++ b/src/terminal/input/sources.inc @@ -12,7 +12,7 @@ # Preprocessor Settings # ------------------------------------- -C_DEFINES = $(C_DEFINES) -DBUILD_ONECORE_INTERACTIVITY +C_DEFINES = $(C_DEFINES) # ------------------------------------- # Build System Settings diff --git a/src/terminal/input/terminalInput.cpp b/src/terminal/input/terminalInput.cpp index 79b5ef74f5f..76de96bc671 100644 --- a/src/terminal/input/terminalInput.cpp +++ b/src/terminal/input/terminalInput.cpp @@ -10,6 +10,7 @@ #define WIL_SUPPORT_BITOPERATION_PASCAL_NAMES #include +#include "../../interactivity/inc/VtApiRedirection.hpp" #include "../../inc/unicode.hpp" #include "../../types/inc/Utf16Parser.hpp" @@ -428,8 +429,8 @@ static bool _searchWithModifier(const KeyEvent& keyEvent, InputSender sender) // VkKeyScan will give us both the Vkey of the key needed for this // character, and the modifiers the user might need to press to get // this character. - const auto slashKeyScan = VkKeyScan(L'/'); // On USASCII: 0x00bf - const auto questionMarkKeyScan = VkKeyScan(L'?'); //On USASCII: 0x01bf + const auto slashKeyScan = OneCoreSafeVkKeyScanW(L'/'); // On USASCII: 0x00bf + const auto questionMarkKeyScan = OneCoreSafeVkKeyScanW(L'?'); //On USASCII: 0x01bf const auto slashVkey = LOBYTE(slashKeyScan); const auto questionMarkVkey = LOBYTE(questionMarkKeyScan); @@ -606,7 +607,7 @@ bool TerminalInput::HandleKey(const IInputEvent* const pInEvent) // Currently, when we're called with Alt+Ctrl+@, ch will be 0, since Ctrl+@ equals a null byte. // VkKeyScanW(0) in turn returns the vkey for the null character (ASCII @). // -> Use the vkey to determine if Ctrl+@ is being pressed and produce ^[^@. - if (ch == UNICODE_NULL && vkey == LOBYTE(VkKeyScanW(0))) + if (ch == UNICODE_NULL && vkey == LOBYTE(OneCoreSafeVkKeyScanW(0))) { _SendEscapedInputSequence(L'\0'); return true; @@ -647,7 +648,7 @@ bool TerminalInput::HandleKey(const IInputEvent* const pInEvent) // Currently, when we're called with Ctrl+@, ch will be 0, since Ctrl+@ equals a null byte. // VkKeyScanW(0) in turn returns the vkey for the null character (ASCII @). // -> Use the vkey to alternatively determine if Ctrl+@ is being pressed. - if (ch == UNICODE_SPACE || (ch == UNICODE_NULL && vkey == LOBYTE(VkKeyScanW(0)))) + if (ch == UNICODE_SPACE || (ch == UNICODE_NULL && vkey == LOBYTE(OneCoreSafeVkKeyScanW(0)))) { _SendNullInputSequence(keyEvent.GetActiveModifierKeys()); return true; @@ -659,7 +660,7 @@ bool TerminalInput::HandleKey(const IInputEvent* const pInEvent) if (ch == UNICODE_NULL) { // -> Try to infer the character from the vkey. - auto mappedChar = LOWORD(MapVirtualKeyW(keyEvent.GetVirtualKeyCode(), MAPVK_VK_TO_CHAR)); + auto mappedChar = LOWORD(OneCoreSafeMapVirtualKeyW(keyEvent.GetVirtualKeyCode(), MAPVK_VK_TO_CHAR)); if (mappedChar) { // Pressing the control key causes all bits but the 5 least @@ -760,7 +761,7 @@ void TerminalInput::_SendNullInputSequence(const DWORD controlKeyState) const std::deque> inputEvents; inputEvents.push_back(std::make_unique(true, 1ui16, - LOBYTE(VkKeyScanW(0)), + LOBYTE(OneCoreSafeVkKeyScanW(0)), 0ui16, L'\x0', controlKeyState)); diff --git a/src/terminal/parser/InputStateMachineEngine.cpp b/src/terminal/parser/InputStateMachineEngine.cpp index 3b381aa5073..ab5492ed6d1 100644 --- a/src/terminal/parser/InputStateMachineEngine.cpp +++ b/src/terminal/parser/InputStateMachineEngine.cpp @@ -8,6 +8,7 @@ #include "../../inc/unicode.hpp" #include "ascii.hpp" +#include "../../interactivity/inc/VtApiRedirection.hpp" using namespace Microsoft::Console::VirtualTerminal; @@ -581,7 +582,7 @@ void InputStateMachineEngine::_GenerateWrappedSequence(const wchar_t wch, next.Event.KeyEvent.dwControlKeyState = currentModifiers; next.Event.KeyEvent.wRepeatCount = 1; next.Event.KeyEvent.wVirtualKeyCode = VK_SHIFT; - next.Event.KeyEvent.wVirtualScanCode = gsl::narrow_cast(MapVirtualKey(VK_SHIFT, MAPVK_VK_TO_VSC)); + next.Event.KeyEvent.wVirtualScanCode = gsl::narrow_cast(OneCoreSafeMapVirtualKeyW(VK_SHIFT, MAPVK_VK_TO_VSC)); next.Event.KeyEvent.uChar.UnicodeChar = 0x0; input.push_back(next); } @@ -593,7 +594,7 @@ void InputStateMachineEngine::_GenerateWrappedSequence(const wchar_t wch, next.Event.KeyEvent.dwControlKeyState = currentModifiers; next.Event.KeyEvent.wRepeatCount = 1; next.Event.KeyEvent.wVirtualKeyCode = VK_MENU; - next.Event.KeyEvent.wVirtualScanCode = gsl::narrow_cast(MapVirtualKey(VK_MENU, MAPVK_VK_TO_VSC)); + next.Event.KeyEvent.wVirtualScanCode = gsl::narrow_cast(OneCoreSafeMapVirtualKeyW(VK_MENU, MAPVK_VK_TO_VSC)); next.Event.KeyEvent.uChar.UnicodeChar = 0x0; input.push_back(next); } @@ -605,7 +606,7 @@ void InputStateMachineEngine::_GenerateWrappedSequence(const wchar_t wch, next.Event.KeyEvent.dwControlKeyState = currentModifiers; next.Event.KeyEvent.wRepeatCount = 1; next.Event.KeyEvent.wVirtualKeyCode = VK_CONTROL; - next.Event.KeyEvent.wVirtualScanCode = gsl::narrow_cast(MapVirtualKey(VK_CONTROL, MAPVK_VK_TO_VSC)); + next.Event.KeyEvent.wVirtualScanCode = gsl::narrow_cast(OneCoreSafeMapVirtualKeyW(VK_CONTROL, MAPVK_VK_TO_VSC)); next.Event.KeyEvent.uChar.UnicodeChar = 0x0; input.push_back(next); } @@ -623,7 +624,7 @@ void InputStateMachineEngine::_GenerateWrappedSequence(const wchar_t wch, next.Event.KeyEvent.dwControlKeyState = currentModifiers; next.Event.KeyEvent.wRepeatCount = 1; next.Event.KeyEvent.wVirtualKeyCode = VK_CONTROL; - next.Event.KeyEvent.wVirtualScanCode = gsl::narrow_cast(MapVirtualKey(VK_CONTROL, MAPVK_VK_TO_VSC)); + next.Event.KeyEvent.wVirtualScanCode = gsl::narrow_cast(OneCoreSafeMapVirtualKeyW(VK_CONTROL, MAPVK_VK_TO_VSC)); next.Event.KeyEvent.uChar.UnicodeChar = 0x0; input.push_back(next); } @@ -635,7 +636,7 @@ void InputStateMachineEngine::_GenerateWrappedSequence(const wchar_t wch, next.Event.KeyEvent.dwControlKeyState = currentModifiers; next.Event.KeyEvent.wRepeatCount = 1; next.Event.KeyEvent.wVirtualKeyCode = VK_MENU; - next.Event.KeyEvent.wVirtualScanCode = gsl::narrow_cast(MapVirtualKey(VK_MENU, MAPVK_VK_TO_VSC)); + next.Event.KeyEvent.wVirtualScanCode = gsl::narrow_cast(OneCoreSafeMapVirtualKeyW(VK_MENU, MAPVK_VK_TO_VSC)); next.Event.KeyEvent.uChar.UnicodeChar = 0x0; input.push_back(next); } @@ -647,7 +648,7 @@ void InputStateMachineEngine::_GenerateWrappedSequence(const wchar_t wch, next.Event.KeyEvent.dwControlKeyState = currentModifiers; next.Event.KeyEvent.wRepeatCount = 1; next.Event.KeyEvent.wVirtualKeyCode = VK_SHIFT; - next.Event.KeyEvent.wVirtualScanCode = gsl::narrow_cast(MapVirtualKey(VK_SHIFT, MAPVK_VK_TO_VSC)); + next.Event.KeyEvent.wVirtualScanCode = gsl::narrow_cast(OneCoreSafeMapVirtualKeyW(VK_SHIFT, MAPVK_VK_TO_VSC)); next.Event.KeyEvent.uChar.UnicodeChar = 0x0; input.push_back(next); } @@ -678,7 +679,7 @@ void InputStateMachineEngine::_GetSingleKeypress(const wchar_t wch, rec.Event.KeyEvent.dwControlKeyState = modifierState; rec.Event.KeyEvent.wRepeatCount = 1; rec.Event.KeyEvent.wVirtualKeyCode = vkey; - rec.Event.KeyEvent.wVirtualScanCode = gsl::narrow_cast(MapVirtualKey(vkey, MAPVK_VK_TO_VSC)); + rec.Event.KeyEvent.wVirtualScanCode = gsl::narrow_cast(OneCoreSafeMapVirtualKeyW(vkey, MAPVK_VK_TO_VSC)); rec.Event.KeyEvent.uChar.UnicodeChar = wch; input.push_back(rec); @@ -717,7 +718,7 @@ bool InputStateMachineEngine::_WriteSingleKey(const wchar_t wch, const short vke // - true iff we successfully wrote the keypress to the input callback. bool InputStateMachineEngine::_WriteSingleKey(const short vkey, const DWORD modifierState) { - const auto wch = gsl::narrow_cast(MapVirtualKey(vkey, MAPVK_VK_TO_CHAR)); + const auto wch = gsl::narrow_cast(OneCoreSafeMapVirtualKeyW(vkey, MAPVK_VK_TO_CHAR)); return _WriteSingleKey(wch, vkey, modifierState); } @@ -1045,7 +1046,7 @@ bool InputStateMachineEngine::_GenerateKeyFromChar(const wchar_t wch, DWORD& modifierState) noexcept { // Low order byte is key, high order is modifiers - const auto keyscan = VkKeyScanW(wch); + const auto keyscan = OneCoreSafeVkKeyScanW(wch); short key = LOBYTE(keyscan); diff --git a/src/terminal/parser/sources.inc b/src/terminal/parser/sources.inc index fbc49025354..5e05cc566f7 100644 --- a/src/terminal/parser/sources.inc +++ b/src/terminal/parser/sources.inc @@ -14,7 +14,7 @@ # Preprocessor Settings # ------------------------------------- -C_DEFINES = $(C_DEFINES) -DBUILD_ONECORE_INTERACTIVITY +C_DEFINES = $(C_DEFINES) # ------------------------------------- # Build System Settings diff --git a/src/terminal/parser/ut_parser/InputEngineTest.cpp b/src/terminal/parser/ut_parser/InputEngineTest.cpp index f895d6581f4..80a1a92f92b 100644 --- a/src/terminal/parser/ut_parser/InputEngineTest.cpp +++ b/src/terminal/parser/ut_parser/InputEngineTest.cpp @@ -18,6 +18,8 @@ #include #include +#include "../../../interactivity/inc/VtApiRedirection.hpp" + using namespace WEX::Common; using namespace WEX::Logging; using namespace WEX::TestExecution; @@ -443,10 +445,10 @@ void InputEngineTest::C0Test() break; } - auto keyscan = VkKeyScanW(expectedWch); + auto keyscan = OneCoreSafeVkKeyScanW(expectedWch); short vkey = keyscan & 0xff; short keyscanModifiers = (keyscan >> 8) & 0xff; - auto scanCode = (WORD)MapVirtualKeyW(vkey, MAPVK_VK_TO_VSC); + auto scanCode = (WORD)OneCoreSafeMapVirtualKeyW(vkey, MAPVK_VK_TO_VSC); DWORD dwModifierState = 0; if (writeCtrl) @@ -521,9 +523,9 @@ void InputEngineTest::AlphanumericTest() { auto inputSeq = std::wstring(&wch, 1); - auto keyscan = VkKeyScanW(wch); + auto keyscan = OneCoreSafeVkKeyScanW(wch); short vkey = keyscan & 0xff; - WORD scanCode = (wchar_t)MapVirtualKeyW(vkey, MAPVK_VK_TO_VSC); + WORD scanCode = (wchar_t)OneCoreSafeMapVirtualKeyW(vkey, MAPVK_VK_TO_VSC); short keyscanModifiers = (keyscan >> 8) & 0xff; // Because of course, these are not the same flags. @@ -574,8 +576,8 @@ void InputEngineTest::RoundTripTest() for (BYTE vkey = 0; vkey < BYTE_MAX; vkey++) { - wchar_t wch = (wchar_t)MapVirtualKeyW(vkey, MAPVK_VK_TO_CHAR); - WORD scanCode = (wchar_t)MapVirtualKeyW(vkey, MAPVK_VK_TO_VSC); + wchar_t wch = (wchar_t)OneCoreSafeMapVirtualKeyW(vkey, MAPVK_VK_TO_CHAR); + WORD scanCode = (wchar_t)OneCoreSafeMapVirtualKeyW(vkey, MAPVK_VK_TO_VSC); unsigned int uiActualKeystate = 0; @@ -761,7 +763,7 @@ void InputEngineTest::CursorPositioningTest() inputRec.Event.KeyEvent.dwControlKeyState = LEFT_ALT_PRESSED | SHIFT_PRESSED; inputRec.Event.KeyEvent.wRepeatCount = 1; inputRec.Event.KeyEvent.wVirtualKeyCode = VK_F3; - inputRec.Event.KeyEvent.wVirtualScanCode = static_cast(MapVirtualKey(VK_F3, MAPVK_VK_TO_VSC)); + inputRec.Event.KeyEvent.wVirtualScanCode = static_cast(OneCoreSafeMapVirtualKeyW(VK_F3, MAPVK_VK_TO_VSC)); inputRec.Event.KeyEvent.uChar.UnicodeChar = L'\0'; testState.vExpectedInput.push_back(inputRec); @@ -787,7 +789,7 @@ void InputEngineTest::CSICursorBackTabTest() inputRec.Event.KeyEvent.dwControlKeyState = SHIFT_PRESSED; inputRec.Event.KeyEvent.wRepeatCount = 1; inputRec.Event.KeyEvent.wVirtualKeyCode = VK_TAB; - inputRec.Event.KeyEvent.wVirtualScanCode = static_cast(MapVirtualKeyW(VK_TAB, MAPVK_VK_TO_VSC)); + inputRec.Event.KeyEvent.wVirtualScanCode = static_cast(OneCoreSafeMapVirtualKeyW(VK_TAB, MAPVK_VK_TO_VSC)); inputRec.Event.KeyEvent.uChar.UnicodeChar = L'\t'; testState.vExpectedInput.push_back(inputRec); @@ -829,8 +831,8 @@ void InputEngineTest::EnhancedKeysTest() { INPUT_RECORD inputRec; - const auto wch = (wchar_t)MapVirtualKeyW(vkey, MAPVK_VK_TO_CHAR); - const auto scanCode = (WORD)MapVirtualKeyW(vkey, MAPVK_VK_TO_VSC); + const auto wch = (wchar_t)OneCoreSafeMapVirtualKeyW(vkey, MAPVK_VK_TO_CHAR); + const auto scanCode = (WORD)OneCoreSafeMapVirtualKeyW(vkey, MAPVK_VK_TO_VSC); inputRec.EventType = KEY_EVENT; inputRec.Event.KeyEvent.bKeyDown = TRUE; @@ -873,8 +875,8 @@ void InputEngineTest::SS3CursorKeyTest() { INPUT_RECORD inputRec; - const auto wch = (wchar_t)MapVirtualKeyW(vkey, MAPVK_VK_TO_CHAR); - const auto scanCode = (WORD)MapVirtualKeyW(vkey, MAPVK_VK_TO_VSC); + const auto wch = (wchar_t)OneCoreSafeMapVirtualKeyW(vkey, MAPVK_VK_TO_CHAR); + const auto scanCode = (WORD)OneCoreSafeMapVirtualKeyW(vkey, MAPVK_VK_TO_VSC); inputRec.EventType = KEY_EVENT; inputRec.Event.KeyEvent.bKeyDown = TRUE; @@ -909,7 +911,7 @@ void InputEngineTest::AltBackspaceTest() inputRec.Event.KeyEvent.dwControlKeyState = LEFT_ALT_PRESSED; inputRec.Event.KeyEvent.wRepeatCount = 1; inputRec.Event.KeyEvent.wVirtualKeyCode = VK_BACK; - inputRec.Event.KeyEvent.wVirtualScanCode = static_cast(MapVirtualKeyW(VK_BACK, MAPVK_VK_TO_VSC)); + inputRec.Event.KeyEvent.wVirtualScanCode = static_cast(OneCoreSafeMapVirtualKeyW(VK_BACK, MAPVK_VK_TO_VSC)); inputRec.Event.KeyEvent.uChar.UnicodeChar = L'\x08'; testState.vExpectedInput.push_back(inputRec); @@ -937,7 +939,7 @@ void InputEngineTest::AltCtrlDTest() inputRec.Event.KeyEvent.dwControlKeyState = LEFT_ALT_PRESSED | LEFT_CTRL_PRESSED; inputRec.Event.KeyEvent.wRepeatCount = 1; inputRec.Event.KeyEvent.wVirtualKeyCode = 0x44; // D key - inputRec.Event.KeyEvent.wVirtualScanCode = static_cast(MapVirtualKeyW(0x44, MAPVK_VK_TO_VSC)); + inputRec.Event.KeyEvent.wVirtualScanCode = static_cast(OneCoreSafeMapVirtualKeyW(0x44, MAPVK_VK_TO_VSC)); inputRec.Event.KeyEvent.uChar.UnicodeChar = L'\x04'; testState.vExpectedInput.push_back(inputRec); @@ -1032,7 +1034,7 @@ void InputEngineTest::AltBackspaceEnterTest() inputRec.Event.KeyEvent.dwControlKeyState = LEFT_ALT_PRESSED; inputRec.Event.KeyEvent.wRepeatCount = 1; inputRec.Event.KeyEvent.wVirtualKeyCode = VK_BACK; - inputRec.Event.KeyEvent.wVirtualScanCode = static_cast(MapVirtualKeyW(VK_BACK, MAPVK_VK_TO_VSC)); + inputRec.Event.KeyEvent.wVirtualScanCode = static_cast(OneCoreSafeMapVirtualKeyW(VK_BACK, MAPVK_VK_TO_VSC)); inputRec.Event.KeyEvent.uChar.UnicodeChar = L'\x08'; // First, expect a alt+backspace. @@ -1047,7 +1049,7 @@ void InputEngineTest::AltBackspaceEnterTest() inputRec.Event.KeyEvent.wVirtualKeyCode = VK_RETURN; inputRec.Event.KeyEvent.dwControlKeyState = 0; - inputRec.Event.KeyEvent.wVirtualScanCode = static_cast(MapVirtualKeyW(VK_RETURN, MAPVK_VK_TO_VSC)); + inputRec.Event.KeyEvent.wVirtualScanCode = static_cast(OneCoreSafeMapVirtualKeyW(VK_RETURN, MAPVK_VK_TO_VSC)); inputRec.Event.KeyEvent.uChar.UnicodeChar = L'\x0d'; //maybe \xa // Then, expect a enter @@ -1350,9 +1352,9 @@ void InputEngineTest::CtrlAltZCtrlAltXTest() auto inputSeq = L"\x1b\x1a"; // ^[^Z auto expectedWch = L'Z'; - auto keyscan = VkKeyScanW(expectedWch); + auto keyscan = OneCoreSafeVkKeyScanW(expectedWch); short vkey = keyscan & 0xff; - auto scanCode = (WORD)MapVirtualKeyW(vkey, MAPVK_VK_TO_VSC); + auto scanCode = (WORD)OneCoreSafeMapVirtualKeyW(vkey, MAPVK_VK_TO_VSC); INPUT_RECORD inputRec; @@ -1372,9 +1374,9 @@ void InputEngineTest::CtrlAltZCtrlAltXTest() auto inputSeq = L"\x1b\x18"; // ^[^X auto expectedWch = L'X'; - auto keyscan = VkKeyScanW(expectedWch); + auto keyscan = OneCoreSafeVkKeyScanW(expectedWch); short vkey = keyscan & 0xff; - auto scanCode = (WORD)MapVirtualKeyW(vkey, MAPVK_VK_TO_VSC); + auto scanCode = (WORD)OneCoreSafeMapVirtualKeyW(vkey, MAPVK_VK_TO_VSC); INPUT_RECORD inputRec; diff --git a/src/terminal/parser/ut_parser/sources b/src/terminal/parser/ut_parser/sources index 54846ecf1dc..1c63146466f 100644 --- a/src/terminal/parser/ut_parser/sources +++ b/src/terminal/parser/ut_parser/sources @@ -13,7 +13,7 @@ DLLDEF = # Preprocessor Settings # ------------------------------------- -C_DEFINES = $(C_DEFINES) -DBUILD_ONECORE_INTERACTIVITY +C_DEFINES = $(C_DEFINES) # ------------------------------------- # Sources, Headers, and Libraries @@ -31,16 +31,107 @@ TARGETLIBS = \ $(ONECORE_INTERNAL_SDK_LIB_PATH)\onecoreuuid.lib \ $(ONECOREUAP_INTERNAL_SDK_LIB_PATH)\onecoreuapuuid.lib \ $(ONECORE_INTERNAL_PRIV_SDK_LIB_VPATH_L)\onecore_internal.lib \ - $(MINCORE_INTERNAL_PRIV_SDK_LIB_VPATH_L)\ext-ms-win-rtcore-ntuser-mouse-l1.lib \ - $(CONSOLE_OBJ_PATH)\terminal\parser\lib\$(O)\ConTermParser.lib \ + $(ONECOREUAP_EXTERNAL_SDK_LIB_PATH)\propsys.lib \ + $(ONECOREUAP_EXTERNAL_SDK_LIB_PATH)\d2d1.lib \ + $(ONECOREUAP_EXTERNAL_SDK_LIB_PATH)\dwrite.lib \ + $(ONECOREUAP_EXTERNAL_SDK_LIB_PATH)\dxgi.lib \ + $(ONECOREUAP_EXTERNAL_SDK_LIB_PATH)\d3d11.lib \ + $(ONECOREUAP_EXTERNAL_SDK_LIB_PATH)\d3dcompiler.lib \ + $(MODERNCORE_INTERNAL_PRIV_SDK_LIB_VPATH_L)\api-ms-win-mm-playsound-l1.lib \ + $(ONECORE_INTERNAL_PRIV_SDK_LIB_VPATH_L)\ext-ms-win-dwmapi-ext-l1.lib \ + $(MINCORE_INTERNAL_PRIV_SDK_LIB_VPATH_L)\ext-ms-win-edputil-policy-l1.lib \ + $(MINCORE_INTERNAL_PRIV_SDK_LIB_VPATH_L)\ext-ms-win-gdi-dc-l1.lib \ + $(MINCORE_INTERNAL_PRIV_SDK_LIB_VPATH_L)\ext-ms-win-gdi-dc-create-l1.lib \ + $(MINCORE_INTERNAL_PRIV_SDK_LIB_VPATH_L)\ext-ms-win-gdi-draw-l1.lib \ + $(MINCORE_INTERNAL_PRIV_SDK_LIB_VPATH_L)\ext-ms-win-gdi-font-l1.lib \ + $(ONECOREWINDOWS_INTERNAL_LIB_PATH_L)\ext-ms-win-gdi-internal-desktop-l1-1-0.lib \ + $(MINCORE_INTERNAL_PRIV_SDK_LIB_VPATH_L)\ext-ms-win-ntuser-caret-l1.lib \ + $(MINCORE_INTERNAL_PRIV_SDK_LIB_VPATH_L)\ext-ms-win-ntuser-dialogbox-l1.lib \ + $(MINCORE_INTERNAL_PRIV_SDK_LIB_VPATH_L)\ext-ms-win-ntuser-draw-l1.lib \ + $(MINCORE_INTERNAL_PRIV_SDK_LIB_VPATH_L)\ext-ms-win-ntuser-gui-l1.lib \ + $(MINCORE_INTERNAL_PRIV_SDK_LIB_VPATH_L)\ext-ms-win-ntuser-menu-l1.lib \ + $(MINCORE_INTERNAL_PRIV_SDK_LIB_VPATH_L)\ext-ms-win-ntuser-misc-l1.lib \ + $(MINCORE_INTERNAL_PRIV_SDK_LIB_VPATH_L)\ext-ms-win-ntuser-mouse-l1.lib \ + $(MINCORE_INTERNAL_PRIV_SDK_LIB_VPATH_L)\ext-ms-win-ntuser-rectangle-ext-l1.lib \ + $(MINCORE_INTERNAL_PRIV_SDK_LIB_VPATH_L)\ext-ms-win-ntuser-server-l1.lib \ + $(MINCORE_INTERNAL_PRIV_SDK_LIB_VPATH_L)\ext-ms-win-ntuser-window-l1.lib \ + $(MINCORE_INTERNAL_PRIV_SDK_LIB_VPATH_L)\ext-ms-win-rtcore-gdi-object-l1.lib \ + $(MINCORE_INTERNAL_PRIV_SDK_LIB_VPATH_L)\ext-ms-win-rtcore-gdi-rgn-l1.lib \ + $(MINCORE_INTERNAL_PRIV_SDK_LIB_VPATH_L)\ext-ms-win-rtcore-ntuser-cursor-l1.lib \ + $(MINCORE_INTERNAL_PRIV_SDK_LIB_VPATH_L)\ext-ms-win-rtcore-ntuser-dc-access-l1.lib \ + $(MINCORE_INTERNAL_PRIV_SDK_LIB_VPATH_L)\ext-ms-win-rtcore-ntuser-rawinput-l1.lib \ + $(MINCORE_INTERNAL_PRIV_SDK_LIB_VPATH_L)\ext-ms-win-rtcore-ntuser-sysparams-l1.lib \ + $(MINCORE_INTERNAL_PRIV_SDK_LIB_VPATH_L)\ext-ms-win-rtcore-ntuser-window-ext-l1.lib \ + $(MINCORE_INTERNAL_PRIV_SDK_LIB_VPATH_L)\ext-ms-win-rtcore-ntuser-winstamin-l1.lib \ + $(MINCORE_INTERNAL_PRIV_SDK_LIB_VPATH_L)\ext-ms-win-shell-shell32-l1.lib \ + $(MINCORE_INTERNAL_PRIV_SDK_LIB_VPATH_L)\ext-ms-win-uxtheme-themes-l1.lib \ + $(ONECORESHELL_INTERNAL_LIB_VPATH_L)\api-ms-win-shell-dataobject-l1.lib \ + $(ONECORESHELL_INTERNAL_LIB_VPATH_L)\api-ms-win-shell-namespace-l1.lib \ + $(MODERNCORE_INTERNAL_PRIV_SDK_LIB_VPATH_L)\ext-ms-win-uiacore-l1.lib \ + $(MODERNCORE_INTERNAL_PRIV_SDK_LIB_VPATH_L)\ext-ms-win-usp10-l1.lib \ + $(WINCORE_OBJ_PATH)\console\conint\$(O)\conint.lib \ + $(CONSOLE_OBJ_PATH)\buffer\out\lib\$(O)\conbufferout.lib \ + $(CONSOLE_OBJ_PATH)\host\lib\$(O)\conhostv2.lib \ + $(CONSOLE_OBJ_PATH)\tsf\$(O)\contsf.lib \ + $(CONSOLE_OBJ_PATH)\propslib\$(O)\conprops.lib \ $(CONSOLE_OBJ_PATH)\terminal\input\lib\$(O)\ConTermInput.lib \ + $(CONSOLE_OBJ_PATH)\terminal\adapter\lib\$(O)\ConTermAdapter.lib \ + $(CONSOLE_OBJ_PATH)\terminal\parser\lib\$(O)\ConTermParser.lib \ + $(CONSOLE_OBJ_PATH)\renderer\base\lib\$(O)\ConRenderBase.lib \ + $(CONSOLE_OBJ_PATH)\renderer\gdi\lib\$(O)\ConRenderGdi.lib \ + $(CONSOLE_OBJ_PATH)\renderer\wddmcon\lib\$(O)\ConRenderWddmCon.lib \ + $(CONSOLE_OBJ_PATH)\renderer\vt\lib\$(O)\ConRenderVt.lib \ + $(CONSOLE_OBJ_PATH)\audio\midi\lib\$(O)\ConAudioMidi.lib \ + $(CONSOLE_OBJ_PATH)\server\lib\$(O)\ConServer.lib \ $(CONSOLE_OBJ_PATH)\interactivity\base\lib\$(O)\ConInteractivityBaseLib.lib \ + $(CONSOLE_OBJ_PATH)\interactivity\win32\lib\$(O)\ConInteractivityWin32Lib.lib \ + $(CONSOLE_OBJ_PATH)\interactivity\onecore\lib\$(O)\ConInteractivityOneCoreLib.lib \ $(CONSOLE_OBJ_PATH)\types\lib\$(O)\ConTypes.lib \ DELAYLOAD = \ + PROPSYS.dll; \ + D2D1.dll; \ + DWrite.dll; \ + DXGI.dll; \ + D3D11.dll; \ + OLEAUT32.dll; \ + api-ms-win-mm-playsound-l1.dll; \ + api-ms-win-shcore-scaling-l1.dll; \ + api-ms-win-shell-dataobject-l1.dll; \ + api-ms-win-shell-namespace-l1.dll; \ + ext-ms-win-dwmapi-ext-l1.dll; \ + ext-ms-win-edputil-policy-l1.dll; \ + ext-ms-win-gdi-dc-l1.dll; \ + ext-ms-win-gdi-dc-create-l1.dll; \ + ext-ms-win-gdi-draw-l1.dll; \ + ext-ms-win-gdi-font-l1.dll; \ + ext-ms-win-gdi-internal-desktop-l1.dll; \ + ext-ms-win-ntuser-caret-l1.dll; \ + ext-ms-win-ntuser-dialogbox-l1.dll; \ + ext-ms-win-ntuser-draw-l1.dll; \ ext-ms-win-ntuser-keyboard-l1.dll; \ - ext-ms-win-rtcore-ntuser-mouse-l1.dll; \ + ext-ms-win-ntuser-gui-l1.dll; \ + ext-ms-win-ntuser-menu-l1.dll; \ + ext-ms-win-ntuser-message-l1.dll; \ + ext-ms-win-ntuser-misc-l1.dll; \ + ext-ms-win-ntuser-mouse-l1.dll; \ + ext-ms-win-ntuser-rectangle-ext-l1.dll; \ + ext-ms-win-ntuser-server-l1.dll; \ + ext-ms-win-ntuser-sysparams-ext-l1.dll; \ + ext-ms-win-ntuser-window-l1.dll; \ + ext-ms-win-rtcore-gdi-object-l1.dll; \ + ext-ms-win-rtcore-gdi-rgn-l1.dll; \ + ext-ms-win-rtcore-ntuser-cursor-l1.dll; \ + ext-ms-win-rtcore-ntuser-dc-access-l1.dll; \ + ext-ms-win-rtcore-ntuser-rawinput-l1.dll; \ + ext-ms-win-rtcore-ntuser-sysparams-l1.dll; \ + ext-ms-win-rtcore-ntuser-window-ext-l1.dll; \ + ext-ms-win-rtcore-ntuser-winstamin-l1.dll; \ + ext-ms-win-shell-shell32-l1.dll; \ + ext-ms-win-uiacore-l1.dll; \ + ext-ms-win-usp10-l1.dll; \ + ext-ms-win-uxtheme-themes-l1.dll; \ DLOAD_ERROR_HANDLER = kernelbase diff --git a/src/types/sources.inc b/src/types/sources.inc index 701bc9861b9..d8863d731aa 100644 --- a/src/types/sources.inc +++ b/src/types/sources.inc @@ -12,7 +12,7 @@ # Preprocessor Settings # ------------------------------------- -C_DEFINES = $(C_DEFINES) -DBUILD_ONECORE_INTERACTIVITY +C_DEFINES = $(C_DEFINES) # ------------------------------------- # Build System Settings From 0973aeab152146b45ac016c21e94d3e079908ad0 Mon Sep 17 00:00:00 2001 From: Dustin Howett Date: Wed, 10 Aug 2022 23:18:27 +0000 Subject: [PATCH 2/4] Merged PR 7705347: Add stubs to Terminal for OneCoreSafe*, fix the ConIoSrv header This is required for us to build out of the Terminal repo. Related work items: MSFT-40435912 --- dep/Console/ConIoSrv.h | 20 ++++++++++++++++++++ src/cascadia/TerminalCore/Terminal.cpp | 20 ++++++++++++++++++++ 2 files changed, 40 insertions(+) diff --git a/dep/Console/ConIoSrv.h b/dep/Console/ConIoSrv.h index 17fdd9976ab..1c8528a7b8f 100644 --- a/dep/Console/ConIoSrv.h +++ b/dep/Console/ConIoSrv.h @@ -13,6 +13,10 @@ Licensed under the MIT license. #define CIS_EVENT_TYPE_FOCUS (1) #define CIS_EVENT_TYPE_FOCUS_ACK (2) +#define CIS_MSG_TYPE_MAPVIRTUALKEY (0) +#define CIS_MSG_TYPE_VKKEYSCAN (1) +#define CIS_MSG_TYPE_GETKEYSTATE (2) + #define CIS_MSG_TYPE_GETDISPLAYSIZE (3) #define CIS_MSG_TYPE_GETFONTSIZE (4) #define CIS_MSG_TYPE_SETCURSOR (5) @@ -31,6 +35,22 @@ typedef struct { UCHAR Type; union { + struct { + UINT Code; + UINT MapType; + UINT ReturnValue; + } MapVirtualKeyParams; + + struct { + WCHAR Character; + SHORT ReturnValue; + } VkKeyScanParams; + + struct { + int VirtualKey; + SHORT ReturnValue; + } GetKeyStateParams; + struct { CD_IO_DISPLAY_SIZE DisplaySize; diff --git a/src/cascadia/TerminalCore/Terminal.cpp b/src/cascadia/TerminalCore/Terminal.cpp index fe63670a6a5..a366c614c84 100644 --- a/src/cascadia/TerminalCore/Terminal.cpp +++ b/src/cascadia/TerminalCore/Terminal.cpp @@ -1613,3 +1613,23 @@ til::color Terminal::GetColorForMark(const Microsoft::Console::VirtualTerminal:: } } } + +// These functions are used by TerminalInput, which must build in conhost +// against OneCore compatible signatures. See the definitions in +// VtApiRedirection.hpp (which we cannot include cross-project.) +// Since we do nto run on OneCore, we can dispense with the compatibility +// shims. +extern "C" UINT OneCoreSafeMapVirtualKeyW(_In_ UINT uCode, _In_ UINT uMapType) +{ + return MapVirtualKeyW(uCode, uMapType); +} + +extern "C" SHORT OneCoreSafeVkKeyScanW(_In_ WCHAR ch) +{ + return VkKeyScanW(ch); +} + +extern "C" SHORT OneCoreSafeGetKeyState(_In_ int nVirtKey) +{ + return GetKeyState(nVirtKey); +} From d21036d313ab5bda7c93451b14245338cd229b72 Mon Sep 17 00:00:00 2001 From: Dustin Howett Date: Wed, 14 Sep 2022 18:03:49 +0000 Subject: [PATCH 3/4] Merged PR 7847415: [Git2Git] Migrate all GSL Golden Path references to use VCPkg Retrieved from https://microsoft.visualstudio.com os.2020 OS official/rs_we_adept_e4d2 7ea9457533db712ee8e8a5a11e1fbbdfc9430027 Related work items: MSFT:40841395 --- src/audio/midi/lib/sources.dep | 3 +++ src/buffer/out/lib/sources.dep | 3 +++ src/buffer/out/ut_textbuffer/sources.dep | 3 +++ src/host/exe/sources.dep | 3 +++ src/host/ft_host/sources.dep | 3 +++ src/host/lib/sources.dep | 3 +++ src/host/ut_host/sources.dep | 3 +++ src/host/ut_lib/sources.dep | 3 +++ src/interactivity/base/lib/sources.dep | 3 +++ src/interactivity/onecore/lib/sources.dep | 3 +++ src/interactivity/win32/lib/sources.dep | 3 +++ src/interactivity/win32/ut_interactivity_win32/sources.dep | 3 +++ src/project.inc | 2 +- src/propsheet/sources.dep | 3 +++ src/propslib/sources.dep | 3 +++ src/renderer/base/lib/sources.dep | 3 +++ src/renderer/gdi/lib/sources.dep | 3 +++ src/renderer/vt/lib/sources.dep | 3 +++ src/renderer/vt/ut_lib/sources.dep | 3 +++ src/renderer/wddmcon/lib/sources.dep | 3 +++ src/server/lib/sources.dep | 3 +++ src/terminal/adapter/lib/sources.dep | 3 +++ src/terminal/adapter/ut_adapter/sources.dep | 3 +++ src/terminal/input/lib/sources.dep | 3 +++ src/terminal/parser/ft_fuzzer/sources | 2 +- src/terminal/parser/ft_fuzzer/sources.dep | 3 +++ src/terminal/parser/ft_fuzzwrapper/sources.dep | 3 +++ src/terminal/parser/lib/sources.dep | 3 +++ src/terminal/parser/ut_parser/sources.dep | 3 +++ src/til/ut_til/sources.dep | 3 +++ src/tsf/sources.dep | 3 +++ src/types/lib/sources.dep | 3 +++ src/types/ut_types/sources.dep | 3 +++ 33 files changed, 95 insertions(+), 2 deletions(-) create mode 100644 src/audio/midi/lib/sources.dep create mode 100644 src/buffer/out/lib/sources.dep create mode 100644 src/buffer/out/ut_textbuffer/sources.dep create mode 100644 src/host/exe/sources.dep create mode 100644 src/host/lib/sources.dep create mode 100644 src/host/ut_host/sources.dep create mode 100644 src/host/ut_lib/sources.dep create mode 100644 src/interactivity/base/lib/sources.dep create mode 100644 src/interactivity/onecore/lib/sources.dep create mode 100644 src/interactivity/win32/lib/sources.dep create mode 100644 src/interactivity/win32/ut_interactivity_win32/sources.dep create mode 100644 src/propsheet/sources.dep create mode 100644 src/propslib/sources.dep create mode 100644 src/renderer/base/lib/sources.dep create mode 100644 src/renderer/gdi/lib/sources.dep create mode 100644 src/renderer/vt/lib/sources.dep create mode 100644 src/renderer/vt/ut_lib/sources.dep create mode 100644 src/renderer/wddmcon/lib/sources.dep create mode 100644 src/server/lib/sources.dep create mode 100644 src/terminal/adapter/lib/sources.dep create mode 100644 src/terminal/adapter/ut_adapter/sources.dep create mode 100644 src/terminal/input/lib/sources.dep create mode 100644 src/terminal/parser/ft_fuzzer/sources.dep create mode 100644 src/terminal/parser/ft_fuzzwrapper/sources.dep create mode 100644 src/terminal/parser/lib/sources.dep create mode 100644 src/terminal/parser/ut_parser/sources.dep create mode 100644 src/til/ut_til/sources.dep create mode 100644 src/tsf/sources.dep create mode 100644 src/types/lib/sources.dep create mode 100644 src/types/ut_types/sources.dep diff --git a/src/audio/midi/lib/sources.dep b/src/audio/midi/lib/sources.dep new file mode 100644 index 00000000000..bc61c95c6b0 --- /dev/null +++ b/src/audio/midi/lib/sources.dep @@ -0,0 +1,3 @@ +BUILD_PASS1_CONSUMES= \ + onecore\windows\vcpkg|PASS1 \ + diff --git a/src/buffer/out/lib/sources.dep b/src/buffer/out/lib/sources.dep new file mode 100644 index 00000000000..bc61c95c6b0 --- /dev/null +++ b/src/buffer/out/lib/sources.dep @@ -0,0 +1,3 @@ +BUILD_PASS1_CONSUMES= \ + onecore\windows\vcpkg|PASS1 \ + diff --git a/src/buffer/out/ut_textbuffer/sources.dep b/src/buffer/out/ut_textbuffer/sources.dep new file mode 100644 index 00000000000..bc61c95c6b0 --- /dev/null +++ b/src/buffer/out/ut_textbuffer/sources.dep @@ -0,0 +1,3 @@ +BUILD_PASS1_CONSUMES= \ + onecore\windows\vcpkg|PASS1 \ + diff --git a/src/host/exe/sources.dep b/src/host/exe/sources.dep new file mode 100644 index 00000000000..bc61c95c6b0 --- /dev/null +++ b/src/host/exe/sources.dep @@ -0,0 +1,3 @@ +BUILD_PASS1_CONSUMES= \ + onecore\windows\vcpkg|PASS1 \ + diff --git a/src/host/ft_host/sources.dep b/src/host/ft_host/sources.dep index 4803f8d6bcb..11b0599b179 100644 --- a/src/host/ft_host/sources.dep +++ b/src/host/ft_host/sources.dep @@ -1,3 +1,6 @@ +BUILD_PASS1_CONSUMES= \ + onecore\windows\vcpkg|PASS1 \ + BUILD_PASS2_CONSUMES= \ onecore\windows\core\console\open\src\tools\nihilist|PASS2 \ diff --git a/src/host/lib/sources.dep b/src/host/lib/sources.dep new file mode 100644 index 00000000000..bc61c95c6b0 --- /dev/null +++ b/src/host/lib/sources.dep @@ -0,0 +1,3 @@ +BUILD_PASS1_CONSUMES= \ + onecore\windows\vcpkg|PASS1 \ + diff --git a/src/host/ut_host/sources.dep b/src/host/ut_host/sources.dep new file mode 100644 index 00000000000..bc61c95c6b0 --- /dev/null +++ b/src/host/ut_host/sources.dep @@ -0,0 +1,3 @@ +BUILD_PASS1_CONSUMES= \ + onecore\windows\vcpkg|PASS1 \ + diff --git a/src/host/ut_lib/sources.dep b/src/host/ut_lib/sources.dep new file mode 100644 index 00000000000..bc61c95c6b0 --- /dev/null +++ b/src/host/ut_lib/sources.dep @@ -0,0 +1,3 @@ +BUILD_PASS1_CONSUMES= \ + onecore\windows\vcpkg|PASS1 \ + diff --git a/src/interactivity/base/lib/sources.dep b/src/interactivity/base/lib/sources.dep new file mode 100644 index 00000000000..bc61c95c6b0 --- /dev/null +++ b/src/interactivity/base/lib/sources.dep @@ -0,0 +1,3 @@ +BUILD_PASS1_CONSUMES= \ + onecore\windows\vcpkg|PASS1 \ + diff --git a/src/interactivity/onecore/lib/sources.dep b/src/interactivity/onecore/lib/sources.dep new file mode 100644 index 00000000000..bc61c95c6b0 --- /dev/null +++ b/src/interactivity/onecore/lib/sources.dep @@ -0,0 +1,3 @@ +BUILD_PASS1_CONSUMES= \ + onecore\windows\vcpkg|PASS1 \ + diff --git a/src/interactivity/win32/lib/sources.dep b/src/interactivity/win32/lib/sources.dep new file mode 100644 index 00000000000..bc61c95c6b0 --- /dev/null +++ b/src/interactivity/win32/lib/sources.dep @@ -0,0 +1,3 @@ +BUILD_PASS1_CONSUMES= \ + onecore\windows\vcpkg|PASS1 \ + diff --git a/src/interactivity/win32/ut_interactivity_win32/sources.dep b/src/interactivity/win32/ut_interactivity_win32/sources.dep new file mode 100644 index 00000000000..bc61c95c6b0 --- /dev/null +++ b/src/interactivity/win32/ut_interactivity_win32/sources.dep @@ -0,0 +1,3 @@ +BUILD_PASS1_CONSUMES= \ + onecore\windows\vcpkg|PASS1 \ + diff --git a/src/project.inc b/src/project.inc index c1093144ef8..eb6de8821ca 100644 --- a/src/project.inc +++ b/src/project.inc @@ -3,7 +3,7 @@ # - Common Project Configuration # ------------------------------------- -!include $(OSDEPENDSROOT)\OSS\gsl\3.1.0\consume.inc +!include $(PROJECT_ROOT)\vcpkg\consume.inc # ------------------------------------- # Preprocessor Settings diff --git a/src/propsheet/sources.dep b/src/propsheet/sources.dep new file mode 100644 index 00000000000..bc61c95c6b0 --- /dev/null +++ b/src/propsheet/sources.dep @@ -0,0 +1,3 @@ +BUILD_PASS1_CONSUMES= \ + onecore\windows\vcpkg|PASS1 \ + diff --git a/src/propslib/sources.dep b/src/propslib/sources.dep new file mode 100644 index 00000000000..bc61c95c6b0 --- /dev/null +++ b/src/propslib/sources.dep @@ -0,0 +1,3 @@ +BUILD_PASS1_CONSUMES= \ + onecore\windows\vcpkg|PASS1 \ + diff --git a/src/renderer/base/lib/sources.dep b/src/renderer/base/lib/sources.dep new file mode 100644 index 00000000000..bc61c95c6b0 --- /dev/null +++ b/src/renderer/base/lib/sources.dep @@ -0,0 +1,3 @@ +BUILD_PASS1_CONSUMES= \ + onecore\windows\vcpkg|PASS1 \ + diff --git a/src/renderer/gdi/lib/sources.dep b/src/renderer/gdi/lib/sources.dep new file mode 100644 index 00000000000..bc61c95c6b0 --- /dev/null +++ b/src/renderer/gdi/lib/sources.dep @@ -0,0 +1,3 @@ +BUILD_PASS1_CONSUMES= \ + onecore\windows\vcpkg|PASS1 \ + diff --git a/src/renderer/vt/lib/sources.dep b/src/renderer/vt/lib/sources.dep new file mode 100644 index 00000000000..bc61c95c6b0 --- /dev/null +++ b/src/renderer/vt/lib/sources.dep @@ -0,0 +1,3 @@ +BUILD_PASS1_CONSUMES= \ + onecore\windows\vcpkg|PASS1 \ + diff --git a/src/renderer/vt/ut_lib/sources.dep b/src/renderer/vt/ut_lib/sources.dep new file mode 100644 index 00000000000..bc61c95c6b0 --- /dev/null +++ b/src/renderer/vt/ut_lib/sources.dep @@ -0,0 +1,3 @@ +BUILD_PASS1_CONSUMES= \ + onecore\windows\vcpkg|PASS1 \ + diff --git a/src/renderer/wddmcon/lib/sources.dep b/src/renderer/wddmcon/lib/sources.dep new file mode 100644 index 00000000000..bc61c95c6b0 --- /dev/null +++ b/src/renderer/wddmcon/lib/sources.dep @@ -0,0 +1,3 @@ +BUILD_PASS1_CONSUMES= \ + onecore\windows\vcpkg|PASS1 \ + diff --git a/src/server/lib/sources.dep b/src/server/lib/sources.dep new file mode 100644 index 00000000000..bc61c95c6b0 --- /dev/null +++ b/src/server/lib/sources.dep @@ -0,0 +1,3 @@ +BUILD_PASS1_CONSUMES= \ + onecore\windows\vcpkg|PASS1 \ + diff --git a/src/terminal/adapter/lib/sources.dep b/src/terminal/adapter/lib/sources.dep new file mode 100644 index 00000000000..bc61c95c6b0 --- /dev/null +++ b/src/terminal/adapter/lib/sources.dep @@ -0,0 +1,3 @@ +BUILD_PASS1_CONSUMES= \ + onecore\windows\vcpkg|PASS1 \ + diff --git a/src/terminal/adapter/ut_adapter/sources.dep b/src/terminal/adapter/ut_adapter/sources.dep new file mode 100644 index 00000000000..bc61c95c6b0 --- /dev/null +++ b/src/terminal/adapter/ut_adapter/sources.dep @@ -0,0 +1,3 @@ +BUILD_PASS1_CONSUMES= \ + onecore\windows\vcpkg|PASS1 \ + diff --git a/src/terminal/input/lib/sources.dep b/src/terminal/input/lib/sources.dep new file mode 100644 index 00000000000..bc61c95c6b0 --- /dev/null +++ b/src/terminal/input/lib/sources.dep @@ -0,0 +1,3 @@ +BUILD_PASS1_CONSUMES= \ + onecore\windows\vcpkg|PASS1 \ + diff --git a/src/terminal/parser/ft_fuzzer/sources b/src/terminal/parser/ft_fuzzer/sources index 2909ddc83f7..7058734d00b 100644 --- a/src/terminal/parser/ft_fuzzer/sources +++ b/src/terminal/parser/ft_fuzzer/sources @@ -3,7 +3,7 @@ # - Console Virtual Terminal Parser Fuzzer # ------------------------------------- -!include $(OSDEPENDSROOT)\OSS\gsl\3.1.0\consume.inc +!include $(PROJECT_ROOT)\vcpkg\consume.inc # This program will generate fuzz input for the parsing engine # and is to be used in conjunction with the fuzz wrapper tool. diff --git a/src/terminal/parser/ft_fuzzer/sources.dep b/src/terminal/parser/ft_fuzzer/sources.dep new file mode 100644 index 00000000000..bc61c95c6b0 --- /dev/null +++ b/src/terminal/parser/ft_fuzzer/sources.dep @@ -0,0 +1,3 @@ +BUILD_PASS1_CONSUMES= \ + onecore\windows\vcpkg|PASS1 \ + diff --git a/src/terminal/parser/ft_fuzzwrapper/sources.dep b/src/terminal/parser/ft_fuzzwrapper/sources.dep new file mode 100644 index 00000000000..bc61c95c6b0 --- /dev/null +++ b/src/terminal/parser/ft_fuzzwrapper/sources.dep @@ -0,0 +1,3 @@ +BUILD_PASS1_CONSUMES= \ + onecore\windows\vcpkg|PASS1 \ + diff --git a/src/terminal/parser/lib/sources.dep b/src/terminal/parser/lib/sources.dep new file mode 100644 index 00000000000..bc61c95c6b0 --- /dev/null +++ b/src/terminal/parser/lib/sources.dep @@ -0,0 +1,3 @@ +BUILD_PASS1_CONSUMES= \ + onecore\windows\vcpkg|PASS1 \ + diff --git a/src/terminal/parser/ut_parser/sources.dep b/src/terminal/parser/ut_parser/sources.dep new file mode 100644 index 00000000000..bc61c95c6b0 --- /dev/null +++ b/src/terminal/parser/ut_parser/sources.dep @@ -0,0 +1,3 @@ +BUILD_PASS1_CONSUMES= \ + onecore\windows\vcpkg|PASS1 \ + diff --git a/src/til/ut_til/sources.dep b/src/til/ut_til/sources.dep new file mode 100644 index 00000000000..bc61c95c6b0 --- /dev/null +++ b/src/til/ut_til/sources.dep @@ -0,0 +1,3 @@ +BUILD_PASS1_CONSUMES= \ + onecore\windows\vcpkg|PASS1 \ + diff --git a/src/tsf/sources.dep b/src/tsf/sources.dep new file mode 100644 index 00000000000..bc61c95c6b0 --- /dev/null +++ b/src/tsf/sources.dep @@ -0,0 +1,3 @@ +BUILD_PASS1_CONSUMES= \ + onecore\windows\vcpkg|PASS1 \ + diff --git a/src/types/lib/sources.dep b/src/types/lib/sources.dep new file mode 100644 index 00000000000..bc61c95c6b0 --- /dev/null +++ b/src/types/lib/sources.dep @@ -0,0 +1,3 @@ +BUILD_PASS1_CONSUMES= \ + onecore\windows\vcpkg|PASS1 \ + diff --git a/src/types/ut_types/sources.dep b/src/types/ut_types/sources.dep new file mode 100644 index 00000000000..bc61c95c6b0 --- /dev/null +++ b/src/types/ut_types/sources.dep @@ -0,0 +1,3 @@ +BUILD_PASS1_CONSUMES= \ + onecore\windows\vcpkg|PASS1 \ + From fba4e227f0c72ea9779682ce432836950179c8f2 Mon Sep 17 00:00:00 2001 From: Dustin Howett Date: Wed, 14 Sep 2022 21:53:13 +0000 Subject: [PATCH 4/4] Merged PR 7854069: [Git2Git] Build fixes on top of 704458ee0 Retrieved from https://microsoft.visualstudio.com os.2020 OS official/rs_we_adept_e4d2 4024b6933d446a359a35136053da8b4a8f598d9d Related work items: MSFT-41327033 --- src/audio/midi/MidiAudio.cpp | 12 ++++++++---- src/audio/midi/MidiAudio.hpp | 1 + .../win32/ut_interactivity_win32/sources | 6 ++++++ src/interactivity/win32/window.cpp | 2 +- src/terminal/parser/ft_fuzzer/sources | 1 + src/terminal/parser/ft_fuzzwrapper/sources | 6 ++++++ 6 files changed, 23 insertions(+), 5 deletions(-) diff --git a/src/audio/midi/MidiAudio.cpp b/src/audio/midi/MidiAudio.cpp index a351d3273b1..9bab5bc716f 100644 --- a/src/audio/midi/MidiAudio.cpp +++ b/src/audio/midi/MidiAudio.cpp @@ -8,7 +8,6 @@ #include #pragma comment(lib, "dxguid.lib") -#pragma comment(lib, "dsound.lib") using Microsoft::WRL::ComPtr; using namespace std::chrono_literals; @@ -20,11 +19,16 @@ constexpr auto WAVE_DATA = std::array{ 128, 159, 191, 223, 255, MidiAudio::MidiAudio(HWND windowHandle) { - if (SUCCEEDED(DirectSoundCreate8(nullptr, &_directSound, nullptr))) + _directSoundModule.reset(LoadLibraryExW(L"dsound.dll", nullptr, LOAD_LIBRARY_SEARCH_SYSTEM32)); + if (_directSoundModule) { - if (SUCCEEDED(_directSound->SetCooperativeLevel(windowHandle, DSSCL_NORMAL))) + auto createFunction = GetProcAddressByFunctionDeclaration(_directSoundModule.get(), DirectSoundCreate8); + if (SUCCEEDED(createFunction(nullptr, &_directSound, nullptr))) { - _createBuffers(); + if (SUCCEEDED(_directSound->SetCooperativeLevel(windowHandle, DSSCL_NORMAL))) + { + _createBuffers(); + } } } } diff --git a/src/audio/midi/MidiAudio.hpp b/src/audio/midi/MidiAudio.hpp index c29d38d1999..ad44bdc16e9 100644 --- a/src/audio/midi/MidiAudio.hpp +++ b/src/audio/midi/MidiAudio.hpp @@ -36,6 +36,7 @@ class MidiAudio private: void _createBuffers() noexcept; + wil::unique_hmodule _directSoundModule; Microsoft::WRL::ComPtr _directSound; std::array, 2> _buffers; size_t _activeBufferIndex = 0; diff --git a/src/interactivity/win32/ut_interactivity_win32/sources b/src/interactivity/win32/ut_interactivity_win32/sources index f65b767cd80..4b988d16720 100644 --- a/src/interactivity/win32/ut_interactivity_win32/sources +++ b/src/interactivity/win32/ut_interactivity_win32/sources @@ -12,6 +12,12 @@ DLLDEF = UNIVERSAL_TEST = 1 TEST_CODE = 1 +# ------------------------------------- +# Compiler Settings +# ------------------------------------- + +USE_STD_CPP20 = 1 + # ------------------------------------- # Preprocessor Settings # ------------------------------------- diff --git a/src/interactivity/win32/window.cpp b/src/interactivity/win32/window.cpp index ca2300e4ced..f8274b6fbd4 100644 --- a/src/interactivity/win32/window.cpp +++ b/src/interactivity/win32/window.cpp @@ -350,8 +350,8 @@ void Window::_UpdateSystemMetrics() const status = NTSTATUS_FROM_WIN32(HRESULT_CODE((pAtlasEngine->SetHwnd(hWnd)))); } else - { #endif + { status = NTSTATUS_FROM_WIN32(HRESULT_CODE((pGdiEngine->SetHwnd(hWnd)))); } diff --git a/src/terminal/parser/ft_fuzzer/sources b/src/terminal/parser/ft_fuzzer/sources index 7058734d00b..6eb7f42ce10 100644 --- a/src/terminal/parser/ft_fuzzer/sources +++ b/src/terminal/parser/ft_fuzzer/sources @@ -45,6 +45,7 @@ C_DEFINES = $(C_DEFINES) -DUNICODE -D_UNICODE # Compiler Settings # ------------------------------------- +USE_STD_CPP20 = 1 MSC_WARNING_LEVEL = /W4 /WX # ------------------------------------- diff --git a/src/terminal/parser/ft_fuzzwrapper/sources b/src/terminal/parser/ft_fuzzwrapper/sources index 30818948e52..1753a400e31 100644 --- a/src/terminal/parser/ft_fuzzwrapper/sources +++ b/src/terminal/parser/ft_fuzzwrapper/sources @@ -37,6 +37,12 @@ C_DEFINES = $(C_DEFINES) -DINLINE_TEST_METHOD_MARKUP -DUNIT_TESTIN # Code in the OneCore depot automatically excludes default Win32 libraries. +# ------------------------------------- +# Compiler Settings +# ------------------------------------- + +USE_STD_CPP20 = 1 + # ------------------------------------- # Sources, Headers, and Libraries # -------------------------------------