906edf7002
- Implements the default application behavior and handoff mechanisms between console and terminal. The inbox portion is done already. This adds the ability for our OpenConsole.exe to accept the incoming server connection from the Windows OS, stand up a PTY session, start the Windows Terminal as a listener for an incoming connection, and then send it the incoming PTY connection for it to launch a tab. - The tab is launched with default settings at the moment. - You must configure the default application using the `conhost.exe` propsheet or with the registry keys. Finishing the setting inside Windows Terminal will be a todo after this is complete. The OS Settings panel work to surface this setting is a dependency delivered by another team and you will not see it here. ## Validation Steps Performed - [x] Manual adjust of registry keys to the delegation conhost/terminal behavior - [x] Adjustment of the delegation options with the propsheet - [x] Launching things from the run box manually and watching them show in Terminal - [x] Launching things from shortcuts and watching them show in the Terminal Documentation on how it works will be a TODO post completion in #9462 References #7414 - Default Terminal spec Closes #492
63 lines
2.8 KiB
C++
63 lines
2.8 KiB
C++
// Copyright (c) Microsoft Corporation.
|
|
// Licensed under the MIT license.
|
|
|
|
#include "precomp.h"
|
|
|
|
#include "CConsoleHandoff.h"
|
|
|
|
#include "srvinit.h"
|
|
|
|
// Routine Description:
|
|
// - Helper to duplicate a handle to ourselves so we can keep holding onto it
|
|
// after the caller frees the original one.
|
|
// Arguments:
|
|
// - in - Handle to duplicate
|
|
// - out - Where to place the duplicated value
|
|
// Return Value:
|
|
// - S_OK or Win32 error from `::DuplicateHandle`
|
|
static HRESULT _duplicateHandle(const HANDLE in, HANDLE& out)
|
|
{
|
|
RETURN_IF_WIN32_BOOL_FALSE(DuplicateHandle(GetCurrentProcess(), in, GetCurrentProcess(), &out, 0, FALSE, DUPLICATE_SAME_ACCESS));
|
|
return S_OK;
|
|
}
|
|
|
|
// Routine Description:
|
|
// - Takes the incoming information from COM and and prepares a console hosting session in this process.
|
|
// Arguments:
|
|
// - server - Console driver server handle
|
|
// - inputEvent - Event already established that we signal when new input data is available in case the driver is waiting on us
|
|
// - msg - Portable attach message containing just enough descriptor payload to get us started in servicing it
|
|
HRESULT CConsoleHandoff::EstablishHandoff(HANDLE server,
|
|
HANDLE inputEvent,
|
|
PCCONSOLE_PORTABLE_ATTACH_MSG msg)
|
|
try
|
|
{
|
|
// Fill the descriptor portion of a fresh api message with the received data.
|
|
// The descriptor portion is the "received" packet from the last ask of the driver.
|
|
// The other portions are unnecessary as they track the other buffer state, error codes,
|
|
// and the return portion of the api message.
|
|
// We will re-retrieve the connect information (title, window state, etc.) when the
|
|
// new console session begins servicing this.
|
|
CONSOLE_API_MSG apiMsg{};
|
|
apiMsg.Descriptor.Identifier.HighPart = msg->IdHighPart;
|
|
apiMsg.Descriptor.Identifier.LowPart = msg->IdLowPart;
|
|
apiMsg.Descriptor.Process = static_cast<decltype(apiMsg.Descriptor.Process)>(msg->Process);
|
|
apiMsg.Descriptor.Object = static_cast<decltype(apiMsg.Descriptor.Object)>(msg->Object);
|
|
apiMsg.Descriptor.Function = msg->Function;
|
|
apiMsg.Descriptor.InputSize = msg->InputSize;
|
|
apiMsg.Descriptor.OutputSize = msg->OutputSize;
|
|
|
|
// Duplicate the handles from what we received.
|
|
// The contract with COM specifies that any HANDLEs we receive from the caller belong
|
|
// to the caller and will be freed when we leave the scope of this method.
|
|
// Making our own duplicate copy ensures they hang around in our lifetime.
|
|
RETURN_IF_FAILED(_duplicateHandle(server, server));
|
|
RETURN_IF_FAILED(_duplicateHandle(inputEvent, inputEvent));
|
|
|
|
// Now perform the handoff.
|
|
RETURN_IF_FAILED(ConsoleEstablishHandoff(server, inputEvent, &apiMsg));
|
|
|
|
return S_OK;
|
|
}
|
|
CATCH_RETURN();
|