master
hpp 214 lines 5.91 KB
Raw
1 /*++
2
3 Copyright (c) Microsoft. All rights reserved.
4
5 Module Name:
6
7 helpers.hpp
8
9 Abstract:
10
11 This file contains helper function declarations.
12
13 --*/
14
15 #pragma once
16
17 #include <winsock2.h>
18 #include <string_view>
19 #include <unordered_set>
20 #include <unordered_map>
21 #include <lxcoreapi.h>
22 #include <gsl/gsl>
23 #include <wil/com.h>
24 #include <wil/filesystem.h>
25 #include <wil/result.h>
26 #include <winternl.h>
27 #include "lxinitshared.h"
28
29 #define _1KB ((UINT64)(1024))
30 #define _1MB (_1KB * _1KB)
31 #define _1GB (_1KB * _1MB)
32
33 #define LXSS_LAUNCH_FLAG_ENABLE_INTEROP 0x1
34 #define LXSS_LAUNCH_FLAG_TRANSLATE_ENVIRONMENT 0x2
35 #define LXSS_LAUNCH_FLAG_USE_SYSTEM_DISTRO 0x4
36 #define LXSS_LAUNCH_FLAG_SHELL_LOGIN 0x8
37
38 #define LXSS_IS_WHITESPACE(_Char) (((_Char) == L' ') || ((_Char) == L'\t'))
39
40 #define LXSS_ROOTFS_DIRECTORY L"rootfs"
41 #define LXSS_TEMP_DIRECTORY L"temp"
42
43 #define CONTINUE_IF_FAILED(x) \
44 { \
45 if (FAILED_LOG((x))) \
46 { \
47 continue; \
48 } \
49 }
50
51 #define CONTINUE_IF_FAILED_WIN32(x) \
52 { \
53 if (FAILED_WIN32_LOG((x))) \
54 { \
55 continue; \
56 } \
57 }
58
59 namespace wsl::windows::common::helpers {
60
61 enum class LaunchWslRelayFlags
62 {
63 None = 0,
64 DisableTelemetry = 1,
65 HideWindow = 2,
66 ConnectPipe = 4
67 };
68
69 DEFINE_ENUM_FLAG_OPERATORS(LaunchWslRelayFlags);
70
71 enum WindowsBuildNumbers : ULONG
72 {
73 Vibranium = 19041,
74 Vibranium_20H2 = 19042,
75 Vibranium_21H1 = 19043,
76 Vibranium_21H2 = 19044,
77 Vibranium_22H2 = 19045,
78 Iron = 20348,
79 Cobalt = 22000,
80 Nickel = 22621,
81 Nickel_23H2 = 22631,
82 Zinc = 25398,
83 Germanium = 26100,
84 };
85
86 struct GuidLess
87 {
88 bool operator()(REFGUID left, REFGUID right) const
89 {
90 return memcmp(&left, &right, sizeof(GUID)) < 0;
91 }
92 };
93
94 typedef wil::unique_any_handle_null<decltype(&::ClosePseudoConsole), ::ClosePseudoConsole> unique_pseudo_console;
95
96 using unique_environment_block = wil::unique_any<LPVOID, decltype(&DestroyEnvironmentBlock), DestroyEnvironmentBlock>;
97
98 inline void DeleteProcThreadAttributeList(_In_ PPROC_THREAD_ATTRIBUTE_LIST AttributeList)
99 {
100 ::DeleteProcThreadAttributeList(AttributeList);
101 CoTaskMemFree(AttributeList);
102 }
103
104 using unique_proc_attribute_list =
105 wil::unique_any<PPROC_THREAD_ATTRIBUTE_LIST, decltype(&DeleteProcThreadAttributeList), DeleteProcThreadAttributeList>;
106
107 using unique_environment_strings = wil::unique_any<LPTCH, decltype(&::FreeEnvironmentStrings), ::FreeEnvironmentStrings>;
108
109 using unique_pseudo_console = wil::unique_any_handle_null<decltype(&ClosePseudoConsole), ClosePseudoConsole>;
110
111 using unique_mta_cookie = wil::unique_any<CO_MTA_USAGE_COOKIE, decltype(::CoDecrementMTAUsage), &::CoDecrementMTAUsage>;
112
113 void ConnectPipe(_In_ HANDLE Pipe, _In_ DWORD Timeout = INFINITE, _In_ const std::vector<HANDLE>& ExitEvents = {});
114
115 std::wstring_view ConsumeArgument(_In_ std::wstring_view CommandLine, _In_ std::wstring_view Argument);
116
117 void CreateConsole(_In_ LPCWSTR ConsoleTitle = nullptr);
118
119 [[nodiscard]] wil::unique_handle CreateKillOnCloseJob();
120
121 unique_proc_attribute_list CreateProcThreadAttributeList(_In_ DWORD AttributeCount);
122
123 std::vector<gsl::byte> GenerateConfigurationMessage(
124 _In_ const std::wstring& DistributionName,
125 _In_ ULONG FixedDrivesBitmap = 0,
126 _In_ ULONG DefaultUid = LX_UID_ROOT,
127 _In_ const std::string& Timezone = {},
128 _In_ const std::wstring& Plan9SocketPath = {},
129 _In_ ULONG FeatureFlags = 0,
130 _In_ LX_INIT_DRVFS_MOUNT DrvfsMount = LxInitDrvfsMountElevated);
131
132 std::vector<gsl::byte> GenerateTimezoneUpdateMessage(_In_ std::string_view Timezone);
133
134 std::string GetLinuxTimezone(_In_opt_ HANDLE UserToken = nullptr);
135
136 std::wstring GetUniquePipeName();
137
138 struct WindowsVersion
139 {
140 DWORD MajorVersion;
141 DWORD MinorVersion;
142 ULONG BuildNumber;
143 DWORD UpdateBuildRevision;
144 };
145
146 WindowsVersion GetWindowsVersion();
147
148 std::string GetWindowsVersionString();
149
150 std::filesystem::path GetUserProfilePath(_In_opt_ HANDLE userToken = nullptr);
151
152 std::filesystem::path GetWslConfigPath(_In_opt_ HANDLE userToken = nullptr);
153
154 bool IsPackageInstalled(_In_ LPCWSTR PackageFamilyName);
155
156 bool IsServicePresent(_In_ LPCWSTR ServiceName);
157
158 bool IsServiceRunning(_In_ LPCWSTR ServiceName);
159
160 bool IsVirtioSerialConsoleSupported();
161
162 bool IsVmemmSuffixSupported();
163
164 bool IsWindows11OrAbove();
165
166 bool IsWslOptionalComponentPresent();
167
168 bool IsWslSupportInterfacePresent();
169
170 void LaunchDebugConsole(
171 _In_ LPCWSTR PipeName, _In_ bool ConnectExistingPipe, _In_ HANDLE UserToken, _In_opt_ HANDLE LogFile, _In_ bool DisableTelemetry, _In_opt_ HANDLE JobObject = nullptr);
172
173 [[nodiscard]] wil::unique_handle LaunchInteropServer(
174 _In_opt_ LPCGUID DistroId,
175 _In_ HANDLE InteropHandle,
176 _In_opt_ HANDLE EventHandle,
177 _In_opt_ HANDLE ParentHandle,
178 _In_opt_ LPCGUID VmId,
179 _In_opt_ HANDLE UserToken = nullptr,
180 _In_opt_ HANDLE JobObject = nullptr);
181
182 void LaunchKdRelay(_In_ LPCWSTR PipeName, _In_ HANDLE UserToken, _In_ int Port, _In_ HANDLE ExitEvent, _In_ bool DisableTelemetry, _In_opt_ HANDLE JobObject = nullptr);
183
184 void LaunchPortRelay(_In_ SOCKET Socket, _In_ const GUID& VmId, _In_ HANDLE UserToken, _In_ bool DisableTelemetry, _In_opt_ HANDLE JobObject = nullptr);
185
186 void LaunchWslSettingsOOBE(_In_ HANDLE UserToken);
187
188 std::wstring_view ParseArgument(_In_ std::wstring_view CommandLine, _In_ bool HandleQuotes = false);
189
190 bool ReopenStdHandles();
191
192 #ifdef _WIN64
193 INT64
194 RoundUpToNearestPowerOfTwo(_In_ INT64 Num);
195 #else
196 INT32
197 RoundUpToNearestPowerOfTwo(_In_ INT32 Num);
198 #endif
199
200 DWORD RunProcess(_Inout_ std::wstring& CommandLine);
201
202 void SetHandleInheritable(_In_ HANDLE Handle, _In_ bool Inheritable = true);
203
204 bool TryAttachConsole();
205
206 std::optional<std::wstring> VersionRegisteredWithDcat();
207
208 void RegisterWithDcat(_In_ bool IncludeVersionNumber = true);
209
210 void AppendCommonKernelCommandLine(_Inout_ std::wstring& kernelCmdLine, _In_ int pageReportingOrder, _In_ ULONG64 swiotlbSizeBytes, _In_ ULONG cpuCount);
211
212 UINT64 ComputeDefaultSwiotlbConfig(_In_ UINT64 memoryBytes);
213
214 } // namespace wsl::windows::common::helpers