97
}
98
};
99
100
- [[nodiscard]] wil::unique_handle Launch(_In_opt_ HANDLE UserToken, _In_ bool HideWindow, _In_ bool CreateNoWindow = false) const
100
+ [[nodiscard]] wil::unique_handle Launch(
101
+ _In_opt_ HANDLE UserToken, _In_ bool HideWindow, _In_ bool CreateNoWindow = false, _In_opt_ HANDLE JobObject = nullptr) const
102
{
103
// If a user token was provided, create an environment block from the token.
104
wsl::windows::common::helpers::unique_environment_block environmentBlock{nullptr};
126
127
process.SetEnvironment(environmentBlock.get());
128
process.SetToken(UserToken);
129
+ process.SetJobObject(JobObject);
130
131
// Launch the process.
132
return process.Start();
139
};
140
141
[[nodiscard]] wil::unique_handle LaunchWslHost(
140
- _In_opt_ LPCGUID DistroId, _In_opt_ HANDLE InteropHandle, _In_opt_ HANDLE EventHandle, _In_opt_ HANDLE ParentHandle, _In_opt_ LPCGUID VmId, _In_opt_ HANDLE UserToken)
142
+ _In_opt_ LPCGUID DistroId,
143
+ _In_opt_ HANDLE InteropHandle,
144
+ _In_opt_ HANDLE EventHandle,
145
+ _In_opt_ HANDLE ParentHandle,
146
+ _In_opt_ LPCGUID VmId,
147
+ _In_opt_ HANDLE UserToken,
148
+ _In_opt_ HANDLE JobObject = nullptr)
149
{
150
// Construct the command line.
151
//
159
launcher.AddHandleOption(wslhost::handle_option, InteropHandle);
160
launcher.AddHandleOption(wslhost::event_option, EventHandle);
161
launcher.AddHandleOption(wslhost::parent_option, ParentHandle);
154
- return launcher.Launch(UserToken, true);
162
+ return launcher.Launch(UserToken, true, false, JobObject);
163
}
164
165
[[nodiscard]] wil::unique_handle LaunchWslRelay(
170
_In_opt_ std::optional<int> Port,
171
_In_opt_ HANDLE ExitEvent,
172
_In_opt_ HANDLE UserToken,
165
- _In_ LaunchWslRelayFlags Flags)
173
+ _In_ LaunchWslRelayFlags Flags,
174
+ _In_opt_ HANDLE JobObject = nullptr)
175
{
176
// Construct the command line.
177
//
200
launcher.AddOption(wslrelay::connect_pipe_option);
201
}
202
194
- return launcher.Launch(UserToken, WI_IsFlagSet(Flags, LaunchWslRelayFlags::HideWindow));
203
+ return launcher.Launch(UserToken, WI_IsFlagSet(Flags, LaunchWslRelayFlags::HideWindow), false, JobObject);
204
}
205
} // namespace
206
283
return List;
284
}
285
286
+wil::unique_handle wsl::windows::common::helpers::CreateKillOnCloseJob()
287
+{
288
+ wil::unique_handle job{CreateJobObjectW(nullptr, nullptr)};
289
+ THROW_LAST_ERROR_IF(!job);
290
+
291
+ JOBOBJECT_EXTENDED_LIMIT_INFORMATION jobInfo{};
292
+ jobInfo.BasicLimitInformation.LimitFlags = JOB_OBJECT_LIMIT_KILL_ON_JOB_CLOSE;
293
+ THROW_IF_WIN32_BOOL_FALSE(SetInformationJobObject(job.get(), JobObjectExtendedLimitInformation, &jobInfo, sizeof(jobInfo)));
294
+
295
+ return job;
296
+}
297
+
298
std::vector<gsl::byte> wsl::windows::common::helpers::GenerateConfigurationMessage(
299
_In_ const std::wstring& DistributionName,
300
_In_ ULONG FixedDrivesBitmap,
569
}
570
571
void wsl::windows::common::helpers::LaunchDebugConsole(
551
- _In_ LPCWSTR PipeName, _In_ bool ConnectExistingPipe, _In_ HANDLE UserToken, _In_opt_ HANDLE LogFile, _In_ bool DisableTelemetry)
572
+ _In_ LPCWSTR PipeName, _In_ bool ConnectExistingPipe, _In_ HANDLE UserToken, _In_opt_ HANDLE LogFile, _In_ bool DisableTelemetry, _In_opt_ HANDLE JobObject)
573
{
574
LaunchWslRelayFlags flags{};
575
wil::unique_hfile pipe;
597
THROW_LAST_ERROR_IF(!pipe);
598
599
WI_SetFlagIf(flags, LaunchWslRelayFlags::DisableTelemetry, DisableTelemetry);
579
- wil::unique_handle info{LaunchWslRelay(wslrelay::RelayMode::DebugConsole, LogFile, nullptr, pipe.get(), {}, nullptr, UserToken, flags)};
600
+ wil::unique_handle info{
601
+ LaunchWslRelay(wslrelay::RelayMode::DebugConsole, LogFile, nullptr, pipe.get(), {}, nullptr, UserToken, flags, JobObject)};
602
}
603
604
[[nodiscard]] wil::unique_handle wsl::windows::common::helpers::LaunchInteropServer(
583
- _In_opt_ LPCGUID DistroId, _In_ HANDLE InteropHandle, _In_opt_ HANDLE EventHandle, _In_opt_ HANDLE ParentHandle, _In_opt_ LPCGUID VmId, _In_opt_ HANDLE UserToken)
605
+ _In_opt_ LPCGUID DistroId,
606
+ _In_ HANDLE InteropHandle,
607
+ _In_opt_ HANDLE EventHandle,
608
+ _In_opt_ HANDLE ParentHandle,
609
+ _In_opt_ LPCGUID VmId,
610
+ _In_opt_ HANDLE UserToken,
611
+ _In_opt_ HANDLE JobObject)
612
{
585
- return LaunchWslHost(DistroId, InteropHandle, EventHandle, ParentHandle, VmId, UserToken);
613
+ return LaunchWslHost(DistroId, InteropHandle, EventHandle, ParentHandle, VmId, UserToken, JobObject);
614
}
615
588
-void wsl::windows::common::helpers::LaunchKdRelay(_In_ LPCWSTR PipeName, _In_ HANDLE UserToken, _In_ int Port, _In_ HANDLE ExitEvent, _In_ bool DisableTelemetry)
616
+void wsl::windows::common::helpers::LaunchKdRelay(
617
+ _In_ LPCWSTR PipeName, _In_ HANDLE UserToken, _In_ int Port, _In_ HANDLE ExitEvent, _In_ bool DisableTelemetry, _In_opt_ HANDLE JobObject)
618
{
619
// Create a new pipe server. The pipe should be:
620
// Bi-directional: PIPE_ACCESS_DUPLEX
628
629
LaunchWslRelayFlags flags = LaunchWslRelayFlags::ConnectPipe;
630
WI_SetFlagIf(flags, LaunchWslRelayFlags::DisableTelemetry, DisableTelemetry);
602
- wil::unique_handle info{LaunchWslRelay(wslrelay::RelayMode::KdRelay, nullptr, nullptr, pipe.get(), Port, ExitEvent, UserToken, flags)};
631
+ wil::unique_handle info{
632
+ LaunchWslRelay(wslrelay::RelayMode::KdRelay, nullptr, nullptr, pipe.get(), Port, ExitEvent, UserToken, flags, JobObject)};
633
}
634
605
-void wsl::windows::common::helpers::LaunchPortRelay(_In_ SOCKET Socket, _In_ const GUID& VmId, _In_ HANDLE UserToken, _In_ bool DisableTelemetry)
635
+void wsl::windows::common::helpers::LaunchPortRelay(
636
+ _In_ SOCKET Socket, _In_ const GUID& VmId, _In_ HANDLE UserToken, _In_ bool DisableTelemetry, _In_opt_ HANDLE JobObject)
637
{
638
LaunchWslRelayFlags flags{};
639
WI_SetFlagIf(flags, LaunchWslRelayFlags::DisableTelemetry, DisableTelemetry);
640
wil::unique_handle info{LaunchWslRelay(
610
- wslrelay::RelayMode::PortRelay, reinterpret_cast<HANDLE>(Socket), &VmId, nullptr, {}, nullptr, UserToken, flags)};
641
+ wslrelay::RelayMode::PortRelay, reinterpret_cast<HANDLE>(Socket), &VmId, nullptr, {}, nullptr, UserToken, flags, JobObject)};
642
}
643
644
void wsl::windows::common::helpers::LaunchWslSettingsOOBE(_In_ HANDLE UserToken)