Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
48 changes: 29 additions & 19 deletions UserConfig.cmake.sample
Original file line number Diff line number Diff line change
Expand Up @@ -2,26 +2,36 @@

message(STATUS "Loading user configuration")

# # Uncomment to enable development packages (smaller, faster to install)
# # Note: system.vhd fails to mount if symlink / hardlink, so COPY is needed.
# Uncomment to enable development packages (smaller, faster to install)
# # Note: .vhd files fail to mount via symlink / hardlink, so COPY is needed.
# set(WSL_DEV_BINARY_PATH "C:/wsldev")
# file(MAKE_DIRECTORY ${WSL_DEV_BINARY_PATH})
# file(CREATE_LINK "${KERNEL_SOURCE_DIR}/bin/${TARGET_PLATFORM}/kernel" "${WSL_DEV_BINARY_PATH}/kernel" SYMBOLIC)
# file(COPY_FILE "${WSLG_SOURCE_DIR}/${TARGET_PLATFORM}/system.vhd" "${WSL_DEV_BINARY_PATH}/system.vhd" ONLY_IF_DIFFERENT)
# file(COPY_FILE "${KERNEL_SOURCE_DIR}/bin/${TARGET_PLATFORM}/modules.vhd" "${WSL_DEV_BINARY_PATH}/modules.vhd" ONLY_IF_DIFFERENT)
# file(CREATE_LINK "${MSRDC_SOURCE_DIR}/${TARGET_PLATFORM}/msrdc.exe" "${WSL_DEV_BINARY_PATH}/msrdc.exe" SYMBOLIC)
# file(CREATE_LINK "${WSLG_SOURCE_DIR}/wslg.rdp" "${WSL_DEV_BINARY_PATH}/wslg.rdp" SYMBOLIC)
# file(CREATE_LINK "${WSLG_SOURCE_DIR}/wslg_desktop.rdp" "${WSL_DEV_BINARY_PATH}/wslg_desktop.rdp" SYMBOLIC)
# file(CREATE_LINK "${MSRDC_SOURCE_DIR}/${TARGET_PLATFORM}/rdclientax.dll" "${WSL_DEV_BINARY_PATH}/rdclientax.dll" SYMBOLIC)
# file(CREATE_LINK "${MSRDC_SOURCE_DIR}/${TARGET_PLATFORM}/rdpnanoTransport.dll" "${WSL_DEV_BINARY_PATH}/rdpnanoTransport.dll" SYMBOLIC)
# file(CREATE_LINK "${MSRDC_SOURCE_DIR}/${TARGET_PLATFORM}/RdpWinStlHelper.dll" "${WSL_DEV_BINARY_PATH}/RdpWinStlHelper.dll" SYMBOLIC)
# file(CREATE_LINK "${MSAL_SOURCE_DIR}/${TARGET_PLATFORM}/msal.wsl.proxy.exe" "${WSL_DEV_BINARY_PATH}/msal.wsl.proxy.exe" SYMBOLIC)
# file(CREATE_LINK "${BIN}/wsldevicehost.dll" "${WSL_DEV_BINARY_PATH}/wsldevicehost.dll" SYMBOLIC)
# file(CREATE_LINK "${DIRECT3D_SOURCE_DIR}/lib/${TARGET_PLATFORM}" "${WSL_DEV_BINARY_PATH}/lib" SYMBOLIC)

# foreach(LANG ${SUPPORTED_LANGS})
# file(CREATE_LINK "${MSRDC_SOURCE_DIR}/${TARGET_PLATFORM}/${LANG}" "${WSL_DEV_BINARY_PATH}/${LANG}" SYMBOLIC)
# endforeach()

if(WSL_DEV_BINARY_PATH)
file(MAKE_DIRECTORY ${WSL_DEV_BINARY_PATH})
file(CREATE_LINK "${KERNEL_SOURCE_DIR}/bin/${TARGET_PLATFORM}/kernel" "${WSL_DEV_BINARY_PATH}/kernel" SYMBOLIC)
file(COPY_FILE "${WSLG_SOURCE_DIR}/${TARGET_PLATFORM}/system.vhd" "${WSL_DEV_BINARY_PATH}/system.vhd" ONLY_IF_DIFFERENT)
file(COPY_FILE "${KERNEL_SOURCE_DIR}/bin/${TARGET_PLATFORM}/modules.vhd" "${WSL_DEV_BINARY_PATH}/modules.vhd" ONLY_IF_DIFFERENT)

# read-only VHDs need to be world readable to mount successfully.
execute_process(
COMMAND icacls.exe "${WSL_DEV_BINARY_PATH}/system.vhd" "/grant:r" "Everyone:(R)" /Q
COMMAND icacls.exe "${WSL_DEV_BINARY_PATH}/modules.vhd" "/grant:r" "Everyone:(R)" /Q
WORKING_DIRECTORY ${CMAKE_CURRENT_LIST_DIR}
COMMAND_ERROR_IS_FATAL ANY)

file(CREATE_LINK "${MSRDC_SOURCE_DIR}/${TARGET_PLATFORM}/msrdc.exe" "${WSL_DEV_BINARY_PATH}/msrdc.exe" SYMBOLIC)
file(CREATE_LINK "${WSLG_SOURCE_DIR}/wslg.rdp" "${WSL_DEV_BINARY_PATH}/wslg.rdp" SYMBOLIC)
file(CREATE_LINK "${WSLG_SOURCE_DIR}/wslg_desktop.rdp" "${WSL_DEV_BINARY_PATH}/wslg_desktop.rdp" SYMBOLIC)
file(CREATE_LINK "${MSRDC_SOURCE_DIR}/${TARGET_PLATFORM}/rdclientax.dll" "${WSL_DEV_BINARY_PATH}/rdclientax.dll" SYMBOLIC)
file(CREATE_LINK "${MSRDC_SOURCE_DIR}/${TARGET_PLATFORM}/rdpnanoTransport.dll" "${WSL_DEV_BINARY_PATH}/rdpnanoTransport.dll" SYMBOLIC)
file(CREATE_LINK "${MSRDC_SOURCE_DIR}/${TARGET_PLATFORM}/RdpWinStlHelper.dll" "${WSL_DEV_BINARY_PATH}/RdpWinStlHelper.dll" SYMBOLIC)
file(CREATE_LINK "${MSAL_SOURCE_DIR}/${TARGET_PLATFORM}/msal.wsl.proxy.exe" "${WSL_DEV_BINARY_PATH}/msal.wsl.proxy.exe" SYMBOLIC)
file(CREATE_LINK "${DIRECT3D_SOURCE_DIR}/lib/${TARGET_PLATFORM}" "${WSL_DEV_BINARY_PATH}/lib" SYMBOLIC)

foreach(LANG ${SUPPORTED_LANGS})
file(CREATE_LINK "${MSRDC_SOURCE_DIR}/${TARGET_PLATFORM}/${LANG}" "${WSL_DEV_BINARY_PATH}/${LANG}" SYMBOLIC)
endforeach()
endif()

# # Uncomment to skip building, packaging and installing wslsettings
# set(WSL_BUILD_WSL_SETTINGS false)
Expand Down
2 changes: 1 addition & 1 deletion packages.config
Original file line number Diff line number Diff line change
Expand Up @@ -22,7 +22,7 @@
<package id="Microsoft.WSL.Kernel" version="6.6.114.1-1" targetFramework="native" />
<package id="Microsoft.WSL.LinuxSdk" version="1.20.0" targetFramework="native" />
<package id="Microsoft.WSL.TestDistro" version="2.5.7-47" />
<package id="Microsoft.WSLg" version="1.0.72" />
<package id="Microsoft.WSLg" version="1.0.73" />
<package id="Microsoft.Xaml.Behaviors.WinUI.Managed" version="3.0.0" />
<package id="StrawberryPerl" version="5.32.1.1" />
<package id="vswhere" version="3.1.7" />
Expand Down
2 changes: 1 addition & 1 deletion src/shared/configfile/windows/CMakeLists.txt
Original file line number Diff line number Diff line change
@@ -1,3 +1,3 @@
add_library(configfile STATIC ${SOURCES} ${HEADERS})
add_dependencies(configfile wslserviceidl localization common)
add_dependencies(configfile wslserviceidl localization)
set_target_properties(configfile PROPERTIES FOLDER common)
57 changes: 19 additions & 38 deletions src/windows/common/svccommio.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -72,22 +72,9 @@ CATCH_LOG()

namespace wsl::windows::common {

std::optional<ConsoleInput> ConsoleInput::Create(HANDLE Handle)
ConsoleInput::ConsoleInput(HANDLE Handle, DWORD SavedMode) :
m_Handle(Handle), m_SavedMode(SavedMode), m_SavedCodePage(GetConsoleCP())
{
DWORD Mode;
if (GetFileType(Handle) == FILE_TYPE_CHAR && GetConsoleMode(Handle, &Mode))
{
return ConsoleInput(Handle, Mode);
}

return std::nullopt;
}

ConsoleInput::ConsoleInput(HANDLE Handle, DWORD SavedMode) : m_Handle(Handle), m_SavedMode(SavedMode)
{
// Save code page.
m_SavedCodePage = GetConsoleCP();

// Configure for raw input with VT support.
DWORD NewMode = m_SavedMode;
WI_SetAllFlags(NewMode, ENABLE_WINDOW_INPUT | ENABLE_VIRTUAL_TERMINAL_INPUT);
Expand All @@ -104,29 +91,9 @@ ConsoleInput::~ConsoleInput()
LOG_IF_WIN32_BOOL_FALSE(SetConsoleCP(m_SavedCodePage));
}

std::optional<ConsoleOutput> ConsoleOutput::Create()
{
wil::unique_hfile ConsoleHandle(
CreateFileW(L"CONOUT$", GENERIC_READ | GENERIC_WRITE, FILE_SHARE_READ | FILE_SHARE_WRITE, nullptr, OPEN_EXISTING, 0, nullptr));

if (ConsoleHandle)
{
DWORD Mode;
if (GetConsoleMode(ConsoleHandle.get(), &Mode))
{
return ConsoleOutput(std::move(ConsoleHandle), Mode);
}
}

return std::nullopt;
}

ConsoleOutput::ConsoleOutput(wil::unique_hfile&& ConsoleHandle, DWORD SavedMode) :
m_ConsoleHandle(std::move(ConsoleHandle)), m_SavedMode(SavedMode)
m_ConsoleHandle(std::move(ConsoleHandle)), m_SavedMode(SavedMode), m_SavedCodePage(GetConsoleOutputCP())
{
// Save code page.
m_SavedCodePage = GetConsoleOutputCP();

// Configure for VT output.
DWORD NewMode = m_SavedMode;
WI_SetAllFlags(NewMode, ENABLE_PROCESSED_OUTPUT | ENABLE_VIRTUAL_TERMINAL_PROCESSING | DISABLE_NEWLINE_AUTO_RETURN);
Expand All @@ -149,10 +116,24 @@ SvcCommIo::SvcCommIo()
const HANDLE ErrorHandle = GetStdHandle(STD_ERROR_HANDLE);

// Configure input console
m_ConsoleInput = ConsoleInput::Create(InputHandle);
DWORD InputMode;
if (GetFileType(InputHandle) == FILE_TYPE_CHAR && GetConsoleMode(InputHandle, &InputMode))
{
m_ConsoleInput.emplace(InputHandle, InputMode);
}

// Configure output console
m_ConsoleOutput = ConsoleOutput::Create();
wil::unique_hfile ConsoleHandle(
CreateFileW(L"CONOUT$", GENERIC_READ | GENERIC_WRITE, FILE_SHARE_READ | FILE_SHARE_WRITE, nullptr, OPEN_EXISTING, 0, nullptr));

if (ConsoleHandle)
{
DWORD OutputMode;
if (GetConsoleMode(ConsoleHandle.get(), &OutputMode))
{
m_ConsoleOutput.emplace(std::move(ConsoleHandle), OutputMode);
}
}

// Initialize the standard handles structure
const bool IsConsoleInput = m_ConsoleInput.has_value();
Expand Down
26 changes: 11 additions & 15 deletions src/windows/common/svccommio.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -25,38 +25,34 @@ namespace wsl::windows::common {
class ConsoleInput
{
public:
static std::optional<ConsoleInput> Create(HANDLE Handle);
ConsoleInput(HANDLE Handle, DWORD SavedMode);
~ConsoleInput();
ConsoleInput(const ConsoleInput&) = delete;
ConsoleInput& operator=(const ConsoleInput&) = delete;
ConsoleInput(ConsoleInput&&) = default;
ConsoleInput& operator=(ConsoleInput&&) = default;
ConsoleInput(ConsoleInput&&) = delete;
ConsoleInput& operator=(ConsoleInput&&) = delete;

private:
ConsoleInput(HANDLE Handle, DWORD SavedMode);

HANDLE m_Handle = nullptr;
DWORD m_SavedMode = 0;
UINT m_SavedCodePage = 0;
HANDLE m_Handle{};
DWORD m_SavedMode{};
UINT m_SavedCodePage{};
};

// RAII wrapper for console output configuration and restoration
class ConsoleOutput
{
public:
static std::optional<ConsoleOutput> Create();
ConsoleOutput(wil::unique_hfile&& ConsoleHandle, DWORD SavedMode);
~ConsoleOutput();
ConsoleOutput(const ConsoleOutput&) = delete;
ConsoleOutput& operator=(const ConsoleOutput&) = delete;
ConsoleOutput(ConsoleOutput&&) = default;
ConsoleOutput& operator=(ConsoleOutput&&) = default;
ConsoleOutput(ConsoleOutput&&) = delete;
ConsoleOutput& operator=(ConsoleOutput&&) = delete;

private:
ConsoleOutput(wil::unique_hfile&& ConsoleHandle, DWORD SavedMode);

wil::unique_hfile m_ConsoleHandle;
DWORD m_SavedMode = 0;
UINT m_SavedCodePage = 0;
DWORD m_SavedMode{};
UINT m_SavedCodePage{};
};

class SvcCommIo
Expand Down