conpty: fall back to conhost if OpenConsole is missing (#7741)
This commit is in support of WTU. I initially added support for a new flag, `PSEUDOCONSOLE_UNDOCKED_PREFER_INBOX_CONHOST`, which I liked because it was more explicit. We chose not to go that route. ### Automatic fallback #### Pros * It's easier on the consumer * We can eventually expand it to support `$ARCH/openconsole.exe` #### Cons * Packaging the project wrong will result in a working-but-somewhat-broken experience (old conhost) * We ameliorated this by checking it in the packaging script. * Implicit behavior may be bad
This commit is contained in:
parent
5662cc1710
commit
e996fadbb6
|
@ -106,6 +106,10 @@ Try {
|
|||
Throw "Failed to find wt.exe/wtd.exe -- check the WAP packaging project"
|
||||
}
|
||||
|
||||
If ($null -eq (Get-Item "$AppxPackageRootPath\OpenConsole.exe" -EA:Ignore)) {
|
||||
Throw "Failed to find OpenConsole.exe -- check the WAP packaging project"
|
||||
}
|
||||
|
||||
} Finally {
|
||||
Remove-Item -Recurse -Force $AppxPackageRootPath
|
||||
}
|
||||
|
|
|
@ -22,23 +22,34 @@
|
|||
#pragma warning(disable : 4273) // inconsistent dll linkage (we are exporting things kernel32 also exports)
|
||||
#pragma warning(disable : 26485) // array-to-pointer decay is virtually impossible to avoid when we can't use STL.
|
||||
|
||||
// Function Description:
|
||||
// - Returns the path to conhost.exe as a process heap string.
|
||||
static wil::unique_process_heap_string _InboxConsoleHostPath()
|
||||
{
|
||||
wil::unique_process_heap_string systemDirectory;
|
||||
wil::GetSystemDirectoryW<wil::unique_process_heap_string>(systemDirectory);
|
||||
return wil::str_concat_failfast<wil::unique_process_heap_string>(L"\\\\?\\", systemDirectory, L"\\conhost.exe");
|
||||
}
|
||||
|
||||
// Function Description:
|
||||
// - Returns the path to either conhost.exe or the side-by-side OpenConsole, depending on whether this
|
||||
// module is building with Windows.
|
||||
// module is building with Windows and OpenConsole could be found.
|
||||
// Return Value:
|
||||
// - A pointer to permanent storage containing the path to the console host.
|
||||
static wchar_t* _ConsoleHostPath()
|
||||
{
|
||||
// Use the magic of magic statics to only calculate this once.
|
||||
static wil::unique_process_heap_string consoleHostPath = []() {
|
||||
#ifdef __INSIDE_WINDOWS
|
||||
wil::unique_process_heap_string systemDirectory;
|
||||
wil::GetSystemDirectoryW<wil::unique_process_heap_string>(systemDirectory);
|
||||
return wil::str_concat_failfast<wil::unique_process_heap_string>(L"\\\\?\\", systemDirectory, L"\\conhost.exe");
|
||||
#if defined(__INSIDE_WINDOWS)
|
||||
return _InboxConsoleHostPath();
|
||||
#else
|
||||
// Use the STL only if we're not building in Windows.
|
||||
std::filesystem::path modulePath{ wil::GetModuleFileNameW<std::wstring>(wil::GetModuleInstanceHandle()) };
|
||||
modulePath.replace_filename(L"OpenConsole.exe");
|
||||
if (!std::filesystem::exists(modulePath))
|
||||
{
|
||||
return _InboxConsoleHostPath();
|
||||
}
|
||||
auto modulePathAsString{ modulePath.wstring() };
|
||||
return wil::make_process_heap_string_nothrow(modulePathAsString.data(), modulePathAsString.size());
|
||||
#endif // __INSIDE_WINDOWS
|
||||
|
|
Loading…
Reference in a new issue