master
h 2,060 lines 58.5 KB
Raw
1
2 //
3 // Copyright (c) Microsoft Corporation. All rights reserved.
4 //
5
6 /*++
7
8 Module Name:
9
10 lxinitshared.h
11
12 Abstract:
13
14 This is the header file for definitions shared between Windows and init.
15
16 --*/
17
18 #pragma once
19
20 #include <stdint.h>
21 #include <type_traits>
22 #include "prettyprintshared.h"
23
24 #if defined(_MSC_VER)
25
26 #pragma warning(disable : 4200) // Zero-sized array
27
28 #endif
29
30 //
31 // The path of the init daemon.
32 //
33
34 #define LX_INIT_PATH "/init"
35
36 //
37 // Command line argument for sending import result message.
38 //
39
40 #define LX_INIT_IMPORT_MESSAGE_ARG "--import-result-message"
41
42 //
43 // The name of the server.
44 //
45
46 #define LX_INIT_SERVER_NAME "wslservice"
47
48 //
49 // Max size for a distribution name.
50 //
51
52 #define LX_INIT_DISTRO_NAME_MAX 256
53
54 //
55 // The header for autogenerated files.
56 //
57
58 #define LX_INIT_AUTO_GENERATED_FILE_HEADER \
59 "# This file was automatically generated by WSL. To stop automatic " \
60 "generation of this file, add the following entry to /etc/wsl.conf:\n"
61
62 //
63 // The second header for resolv.conf.
64 //
65
66 #define LX_INIT_RESOLVCONF_PREFIX "# [network]\n# generateResolvConf = false\n"
67
68 //
69 // The destination prefix for the default routing rule.
70 //
71
72 #define LX_INIT_UNSPECIFIED_ADDRESS L"0.0.0.0"
73 #define LX_INIT_UNSPECIFIED_V6_ADDRESS L"::"
74
75 #define LX_INIT_DEFAULT_ROUTE_PREFIX LX_INIT_UNSPECIFIED_ADDRESS "/0"
76 #define LX_INIT_DEFAULT_ROUTE_V6_PREFIX LX_INIT_UNSPECIFIED_V6_ADDRESS "/0"
77
78 //
79 // The hard-coded link-local addresses used for communicating over the loopback to the host
80 //
81 #define LX_INIT_IPV4_LOOPBACK_GATEWAY_ADDRESS "169.254.73.249"
82 #define LX_INIT_IPV6_LOOPBACK_GATEWAY_ADDRESS "fe80::500:4aef:feef:2aa2"
83
84 //
85 // Linux device name for the GELNIC used for loopback communication in mirrored networking mode.
86 //
87 #define LX_INIT_LOOPBACK_DEVICE_NAME "loopback0"
88
89 //
90 // Default IP address used by the DNS tunneling listener.
91 // N.B. As of Germanium release, HNS will never assign a subnet from the 10.0.0.0/8 range to the WSL NAT network, so there
92 // can't be a conflict between that range and the default IP 10.255.255.254.
93 //
94 #define LX_INIT_DNS_TUNNELING_IP_ADDRESS "10.255.255.254"
95
96 //
97 // The data for launching a new process. The structure is variable size with the
98 // strings starting at the Buffer member in the following order: Filename,
99 // CurrentWorkingDirectory, CommandLine, and finally Environment.
100 //
101
102 #define LX_INIT_CREATE_PROCESS_USE_CONSOLE (LXBUS_IPC_HANDLE_ID_INVALID)
103
104 #define LX_INIT_STD_FD_COUNT 3
105
106 #define LX_INIT_USER_NOT_FOUND 67
107 #define LX_INIT_TTY_LIMIT 87
108
109 #define LX_INIT_CREATE_NT_PROCESS_SOCKETS 4
110
111 //
112 // HvSocket ports used for WSL VM Mode.
113 //
114
115 #define LX_INIT_UTILITY_VM_INIT_PORT (50000)
116 #define LX_INIT_UTILITY_VM_PLAN9_PORT (50001)
117 #define LX_INIT_UTILITY_VM_PLAN9_DRVFS_PORT (50002)
118 #define LX_INIT_UTILITY_VM_PLAN9_DRVFS_ADMIN_PORT (50003)
119 #define LX_INIT_UTILITY_VM_VIRTIOFS_PORT (50004)
120 #define LX_INIT_UTILITY_VM_CRASH_DUMP_PORT (50005)
121
122 //
123 // HvSocket buffer size for 9p connections.
124 //
125 // N.B. The kernel doubles this value.
126 //
127
128 #define LX_INIT_UTILITY_VM_PLAN9_BUFFER_SIZE (65536)
129
130 //
131 // Default buffer size for relaying.
132 //
133
134 #define LX_RELAY_BUFFER_SIZE 0x1000
135
136 //
137 // HVC terminal devices.
138 //
139
140 #define LX_INIT_HVC_DEBUG_SHELL "hvc2"
141 #define LX_INIT_HVC_TELEMETRY "hvc1"
142
143 // Since -1 is used to indicate "any port", it can't be an actual port number and is used as an
144 // invalid value.
145 // N.B. Can't use the actual VMADDR_PORT_ANY constant since the header isn't available.
146 #define LX_INIT_UTILITY_VM_INVALID_PORT (UINT_MAX)
147
148 #define LX_INIT_UTILITY_VM_INIT_SOCKET_FD (100)
149
150 #define LX_INIT_UTILITY_VM_DRVFS_SHARE_NAME "drvfs"
151
152 #define LX_INIT_DRVFS_VIRTIO_TAG "drvfs"
153 #define LX_INIT_DRVFS_ADMIN_VIRTIO_TAG "drvfsa"
154
155 //
156 // Typical default DrvFs-specific 9p mount options.
157 //
158 // N.B. These are used to prepopulate virtiofs shares with default mount options.
159 // These will match the default values used by the system distro, and will typically
160 // match the default uid / gid for the user distro. If the values do not match, a new
161 // virtiofs share will be created.
162 //
163
164 #define LX_INIT_DEFAULT_PLAN9_MOUNT_OPTIONS ";uid=1000;gid=1000;symlinkroot=/mnt/"
165
166 #define LX_INIT_UTILITY_VM_CREATE_PROCESS_SOCKET_COUNT (5)
167
168 #define LX_INIT_NO_CONSOLE (LXBUS_IPC_CONSOLE_ID_INVALID)
169
170 #define LX_INIT_CREATE_PROCESS_RESULT_FLAG_GUI_APPLICATION 0x1
171
172 //
173 // The timeout for hvsocket connect().
174 //
175
176 #define LX_INIT_HVSOCKET_TIMEOUT_SECONDS (30)
177
178 //
179 // The data for beginning a port listener.
180 //
181
182 #define LX_INIT_LOCALHOST_RELAY "localhost"
183
184 //
185 // Environment variable to determine if root init logic, or WSL entrypoint should be used.
186 //
187
188 #define WSL_ROOT_INIT_ENV "WSL_ROOT_INIT"
189
190 #define WSLC_ROOT_INIT_ENV "WSLC_ROOT_INIT"
191
192 #define WSL_SOCKET_LOG_ENV "WSL_SOCKET_LOG"
193
194 #define WSL_ENABLE_CRASH_DUMP_ENV "WSL_ENABLE_CRASH_DUMP"
195
196 #define WSL_DEBUG_ENV "WSL_DEBUG"
197
198 #define WSL_DISTRIBUTION_CONF "/etc/wsl-distribution.conf"
199
200 //
201 // Defines needed for GUI support.
202 //
203
204 #define PULSE_SERVER_ENV "PULSE_SERVER"
205 #define PULSE_SERVER_NAME "PulseServer"
206 #define WAYLAND_DISPLAY_ENV "WAYLAND_DISPLAY"
207 #define WAYLAND_DISPLAY_VALUE "wayland-0"
208 #define WAYLAND_RUNTIME_DIR "runtime-dir"
209 #define X11_DISPLAY_ENV "DISPLAY"
210 #define X11_DISPLAY_VALUE ":0"
211 #define X11_SOCKET_NAME ".X11-unix"
212 #define XDG_RUNTIME_DIR_ENV "XDG_RUNTIME_DIR"
213
214 //
215 // GNS arguments
216 //
217
218 #define LX_INIT_GNS "gns"
219 #define LX_INIT_GNS_ADAPTER_ARG "--adapter"
220 #define LX_INIT_GNS_SOCKET_ARG "--socket"
221 #define LX_INIT_GNS_DNS_SOCKET_ARG "--dns_socket"
222 #define LX_INIT_GNS_DNS_TUNNELING_IP "--dns_tunneling_ip"
223 #define LX_INIT_GNS_MESSAGE_TYPE_ARG "--msg_type"
224
225 //
226 // Plan9 arguments
227 //
228
229 #define LX_INIT_PLAN9 "plan9"
230 #define LX_INIT_PLAN9_CONTROL_SOCKET_ARG "--control-socket"
231 #define LX_INIT_PLAN9_SOCKET_PATH_ARG "--socket-path"
232 #define LX_INIT_PLAN9_SERVER_FD_ARG "--server-fd"
233 #define LX_INIT_PLAN9_LOG_FILE_ARG "--log-file"
234 #define LX_INIT_PLAN9_LOG_LEVEL_ARG "--log-level"
235 #define LX_INIT_PLAN9_PIPE_FD_ARG "--pipe-fd"
236 #define LX_INIT_PLAN9_TRUNCATE_LOG_ARG "--log-truncate"
237
238 //
239 // wsl-capture-crash
240 //
241
242 #define LX_INIT_WSL_CAPTURE_CRASH "wsl-capture-crash"
243
244 #define LX_INIT_WSL_GENERATOR "wsl-generator"
245
246 #define LX_INIT_WSL_USER_GENERATOR "wsl-user-generator"
247
248 #define LX_INIT_WSL_INIT_WATCHER "init-watcher"
249
250 #define LX_INIT_WSLC_GPU_HOOK "wsl-gpu-hook"
251
252 #define LX_WSLC_CDI_KIND "microsoft.com/wslc"
253 #define LX_WSLC_GPU_CDI_DEVICE LX_WSLC_CDI_KIND "=gpu"
254
255 //
256 // WSL2-specific environment variables.
257 //
258
259 #define LX_WSL2_CROSS_DISTRO_ENV "WSL2_CROSS_DISTRO"
260 #define LX_WSL2_DISTRO_NAME_ENV "WSL2_DISTRO_NAME"
261 #define LX_WSL2_GUI_APP_SUPPORT_ENV "WSL2_GUI_APPS_ENABLED"
262 #define LX_WSL2_KERNEL_MODULES_MOUNT_ENV "WSL2_KERNEL_MODULES_MOUNT"
263 #define LX_WSL2_KERNEL_MODULES_PATH_ENV "WSL2_KERNEL_MODULES_PATH"
264 #define LX_WSL2_SYSTEM_DISTRO_SHARE_ENV "WSL2_SYSTEM_DISTRO_SHARE"
265 #define LX_WSL2_GPU_SHARE_ENV "WSL2_GPU_SHARE_ENV_"
266 #define LX_WSL2_SHARED_MEMORY_OB_DIRECTORY "WSL2_SHARED_MEMORY_OB_DIRECTORY"
267 #define LX_WSL2_INSTALL_PATH "WSL2_INSTALL_PATH"
268 #define LX_WSL2_SAFE_MODE "WSL2_SAFE_MODE"
269 #define LX_WSL2_USER_PROFILE "WSL2_USER_PROFILE"
270 #define LX_WSL2_VM_ID_ENV "WSL2_VM_ID"
271 #define LX_WSL_PID_ENV "WSL2_PID"
272 #define LX_INIT_TELEMETRY_AGENT "telagent"
273 #define LX_WSL2_DISTRO_READ_ONLY_ENV "WSL_DISTRO_READ_ONLY"
274 #define LX_WSL2_NETWORKING_MODE_ENV "WSL2_NETWORKING_MODE"
275 #define LX_WSL2_DISTRO_INIT_PID "WSL2_DISTRO_INIT_PID"
276 #define LX_WSL2_DISTRO_CGROUP_PATH "WSL2_DISTRO_CGROUP_PATH"
277
278 //
279 // Command line arguments shared between init & mini_init
280 //
281
282 #define INIT_PORT_TRACKER_FD_ARG "--port-tracker-fd"
283 #define INIT_BPF_FD_ARG "--bpf-fd"
284 #define INIT_NETLINK_FD_ARG "--netlink-fd"
285 #define INIT_PORT_TRACKER_LOCALHOST_RELAY "--localhost-relay"
286 #define INIT_PORT_TRACKER_NETWORKING_MODE_ARG "--networking-mode"
287
288 #define DECLARE_MESSAGE_CTOR(Name) \
289 Name() \
290 { \
291 Header.MessageSize = sizeof(Name); \
292 Header.MessageType = Name::Type; \
293 }
294
295 //
296 // Definitions used by WSLC
297 //
298
299 constexpr auto c_ephemeralPortRange = std::pair<uint16_t, uint16_t>(10000, 20001);
300
301 static_assert((c_ephemeralPortRange.first & 1) ^ (c_ephemeralPortRange.second & 1), "port range must have different parities");
302
303 //
304 // The types of messages that can be sent to init and mini init.
305 //
306
307 typedef enum _LX_MESSAGE_TYPE
308 {
309 LxMiniInitMessageAny = 0,
310 LxInitMessageCreateProcess,
311 LxInitMessageCreateSession,
312 LxInitMessageCreateSessionResponse,
313 LxInitMessageNetworkInformation,
314 LxInitMessageInitialize,
315 LxInitMessageInitializeResponse,
316 LxInitMessageTimezoneInformation,
317 LxInitMessageCreateProcessUtilityVm,
318 LxInitMessageExitStatus,
319 LxInitMessageWindowSizeChanged,
320 LxInitMessageCreateProcessResponse,
321 LxInitMessageQueryDrvfsElevated,
322 LxInitMessageRemountDrvfs,
323 LxInitMessageTerminateInstance,
324 LxInitMessageStartSocketRelay,
325 LxInitMessageQueryEnvironmentVariable,
326 LxInitMessageQueryFeatureFlags,
327 LxInitMessageKernelVersion,
328 LxInitMessageAddVirtioFsDevice,
329 LxInitMessageAddVirtioFsDeviceResponse,
330 LxInitMessageRemountVirtioFsDevice,
331 LxInitMessageStartDistroInit,
332 LxInitMessageCreateLoginSession,
333 LxInitMessageStopPlan9Server,
334 LxInitMessageQueryNetworkingMode,
335 LxInitMessageQueryVmId,
336 LxInitCreateProcess,
337 LxInitOobeResult,
338 LxMiniInitMessageLaunchInit,
339 LxMiniInitMessageImport,
340 LxMiniInitMessageImportInplace,
341 LxMiniInitMessageExport,
342 LxMiniInitMessageCreateInstanceResult,
343 LxMiniInitMessageImportResult,
344 LxMiniInitMessageEjectVhd,
345 LxMiniInitMessageEarlyConfig,
346 LxMiniInitMessageInitialConfig,
347 LxMiniInitMessageMount,
348 LxMiniInitMessageUnmount,
349 LxMiniInitMessageDetach,
350 LxMiniInitMessageMountStatus,
351 LxMiniInitMessageNetworkInfo,
352 LxMiniInitMessageGuestCapabilities,
353 LxMiniInitMessageWaitForPmemDevice,
354 LxMiniInitMessageChildExit,
355 LxMiniInitMountFolder,
356 LxMiniInitCreateInstancePid,
357 LxMiniInitTelemetryMessage,
358 LxMinitWaitForPmemDeviceResult,
359 LxMiniInitMessageResizeDistribution,
360 LxMiniInitMessageResizeDistributionResponse,
361 LxProcessCrash,
362 LxGnsMessageInterfaceConfiguration,
363 LxGnsMessageResult,
364 LxGnsMessageNotification,
365 LxGnsMessagePortMappingRequest,
366 LxGnsMessagePortMappingResponse,
367 LxGnsMessageSetPortListener,
368 LxGnsMessagePortListenerRelayStart,
369 LxGnsMessagePortListenerRelayStop,
370 LxGnsMessageVmNicCreatedNotification,
371 LxGnsMessageCreateDeviceRequest,
372 LxGnsMessageModifyGuestDeviceSettingRequest,
373 LxGnsMessageLoopbackRoutesRequest,
374 LxGnsMessageDeviceSettingRequest,
375 LxGnsMessageIfStateChangeRequest,
376 LxGnsMessageIfStateChangeResponse,
377 LxGnsMessageInitialIpConfigurationNotification,
378 LxGnsMessageSetupIpv6,
379 LxGnsMessageDnsTunneling,
380 LxGnsMessageNoOp,
381 LxGnsMessageGlobalNetFilter,
382 LxGnsMessageInterfaceNetFilter,
383 LxGnsMessageConnectTestRequest,
384 LxGnsMessageListenerRelay,
385 LxMessageResultBool,
386 LxMessageResultInt32,
387 LxMessageResultUint32,
388 LxMessageResultUint8,
389 LxMessageWSLCMount,
390 LxMessageWSLCMountResult,
391 LxMessageWSLCError,
392 LxMessageWSLCGetDisk,
393 LxMessageWSLCGetDiskResult,
394 LxMessageWSLCExec,
395 LxMessageWSLCFork,
396 LxMessageWSLCForkResult,
397 LxMessageWSLCConnect,
398 LxMessageWSLCAccept,
399 LxMessageWSLCWaitPid,
400 LxMessageWSLCWaitPidResponse,
401 LxMessageWSLCSignal,
402 LxMessageWSLCRelayTty,
403 LxMessageWSLCMapPort,
404 LxMessageWSLCConnectRelay,
405 LxMessageWSLCPortRelay,
406 LxMessageWSLCUnmount,
407 LxMessageWSLCDetach,
408 LxMessageWSLCTerminalChanged,
409 LxMessageWSLCWatchProcesses,
410 LxMessageWSLCProcessExited,
411 LxMessageWSLCUnixConnect,
412 LxMessageWSLCGetGuestCapabilities,
413 LxMessageWSLCGetGuestCapabilitiesResult,
414 LxMessageWSLCListDir,
415 LxMessageWSLCListDirResult,
416 LxMessageWSLCMountVirtioFs,
417 LxMessageWSLCWriteFile,
418 LxMiniInitMessageTrimDistribution,
419 LxMiniInitMessageTrimDistributionResponse,
420 LxMessageWSLCMountModules,
421 } LX_MESSAGE_TYPE,
422 *PLX_MESSAGE_TYPE;
423
424 inline auto ToString(LX_MESSAGE_TYPE messageType)
425 {
426 #define X(Value) \
427 case Value: \
428 return #Value;
429
430 switch (messageType)
431 {
432 X(LxMiniInitMessageAny)
433 X(LxInitMessageCreateProcess)
434 X(LxInitMessageCreateSession)
435 X(LxInitMessageCreateSessionResponse)
436 X(LxInitMessageNetworkInformation)
437 X(LxInitMessageInitialize)
438 X(LxInitMessageInitializeResponse)
439 X(LxInitMessageTimezoneInformation)
440 X(LxInitMessageCreateProcessUtilityVm)
441 X(LxInitMessageExitStatus)
442 X(LxInitMessageWindowSizeChanged)
443 X(LxInitMessageCreateProcessResponse)
444 X(LxInitMessageQueryDrvfsElevated)
445 X(LxInitMessageRemountDrvfs)
446 X(LxInitMessageTerminateInstance)
447 X(LxInitMessageStartSocketRelay)
448 X(LxInitMessageQueryEnvironmentVariable)
449 X(LxInitMessageQueryFeatureFlags)
450 X(LxInitMessageKernelVersion)
451 X(LxInitMessageAddVirtioFsDevice)
452 X(LxInitMessageAddVirtioFsDeviceResponse)
453 X(LxInitMessageRemountVirtioFsDevice)
454 X(LxInitMessageStartDistroInit)
455 X(LxInitMessageCreateLoginSession)
456 X(LxInitMessageStopPlan9Server)
457 X(LxInitMessageQueryNetworkingMode)
458 X(LxInitCreateProcess)
459 X(LxInitOobeResult)
460 X(LxMiniInitMessageLaunchInit)
461 X(LxMiniInitMessageImport)
462 X(LxMiniInitMessageExport)
463 X(LxMiniInitMessageCreateInstanceResult)
464 X(LxMiniInitMessageImportResult)
465 X(LxMiniInitMessageEjectVhd)
466 X(LxMiniInitMessageEarlyConfig)
467 X(LxMiniInitMessageInitialConfig)
468 X(LxMiniInitMessageMount)
469 X(LxMiniInitMessageUnmount)
470 X(LxMiniInitMessageDetach)
471 X(LxMiniInitMessageMountStatus)
472 X(LxMiniInitMessageNetworkInfo)
473 X(LxMiniInitMessageGuestCapabilities)
474 X(LxMiniInitMessageWaitForPmemDevice)
475 X(LxMiniInitMessageChildExit)
476 X(LxMiniInitMessageResizeDistribution)
477 X(LxMiniInitMessageResizeDistributionResponse)
478 X(LxMiniInitMountFolder)
479 X(LxMiniInitCreateInstancePid)
480 X(LxMinitWaitForPmemDeviceResult)
481 X(LxProcessCrash)
482 X(LxGnsMessageInterfaceConfiguration)
483 X(LxGnsMessageResult)
484 X(LxGnsMessageNotification)
485 X(LxGnsMessagePortMappingRequest)
486 X(LxGnsMessagePortMappingResponse)
487 X(LxGnsMessageSetPortListener)
488 X(LxGnsMessagePortListenerRelayStart)
489 X(LxGnsMessagePortListenerRelayStop)
490 X(LxGnsMessageVmNicCreatedNotification)
491 X(LxGnsMessageCreateDeviceRequest)
492 X(LxGnsMessageModifyGuestDeviceSettingRequest)
493 X(LxGnsMessageLoopbackRoutesRequest)
494 X(LxGnsMessageDeviceSettingRequest)
495 X(LxGnsMessageIfStateChangeRequest)
496 X(LxGnsMessageIfStateChangeResponse)
497 X(LxGnsMessageInitialIpConfigurationNotification)
498 X(LxGnsMessageSetupIpv6)
499 X(LxGnsMessageDnsTunneling)
500 X(LxGnsMessageNoOp)
501 X(LxGnsMessageGlobalNetFilter)
502 X(LxGnsMessageInterfaceNetFilter)
503 X(LxGnsMessageConnectTestRequest)
504 X(LxMessageResultBool)
505 X(LxMessageResultInt32)
506 X(LxMessageResultUint32)
507 X(LxMiniInitTelemetryMessage)
508 X(LxMessageResultUint8)
509 X(LxMessageWSLCMount)
510 X(LxMessageWSLCMountResult)
511 X(LxMessageWSLCGetDisk)
512 X(LxMessageWSLCGetDiskResult)
513 X(LxMessageWSLCExec)
514 X(LxMessageWSLCFork)
515 X(LxMessageWSLCForkResult)
516 X(LxMessageWSLCConnect)
517 X(LxMessageWSLCAccept)
518 X(LxMessageWSLCWaitPid)
519 X(LxMessageWSLCWaitPidResponse)
520 X(LxMessageWSLCSignal)
521 X(LxMessageWSLCRelayTty)
522 X(LxMessageWSLCMapPort)
523 X(LxMessageWSLCConnectRelay)
524 X(LxMessageWSLCPortRelay)
525 X(LxMessageWSLCUnmount)
526 X(LxMessageWSLCDetach)
527 X(LxMessageWSLCTerminalChanged)
528 X(LxMessageWSLCWatchProcesses)
529 X(LxMessageWSLCProcessExited)
530 X(LxMessageWSLCUnixConnect)
531 X(LxMessageWSLCGetGuestCapabilities)
532 X(LxMessageWSLCGetGuestCapabilitiesResult)
533 X(LxMessageWSLCListDir)
534 X(LxMessageWSLCListDirResult)
535 X(LxMessageWSLCMountVirtioFs)
536 X(LxMessageWSLCWriteFile)
537 X(LxMiniInitMessageTrimDistribution)
538 X(LxMiniInitMessageTrimDistributionResponse)
539 X(LxMessageWSLCMountModules)
540
541 default:
542 return "<unexpected LX_MESSAGE_TYPE>";
543 }
544
545 #undef X
546 }
547
548 typedef enum _LX_INIT_DRVFS_MOUNT
549 {
550 LxInitDrvfsMountNone = 0,
551 LxInitDrvfsMountNonElevated,
552 LxInitDrvfsMountElevated
553 } LX_INIT_DRVFS_MOUNT,
554 *PLX_INIT_DRVFS_MOUNT;
555
556 #define CONCAT_IMPL(A, B) L##A##B
557
558 #define CONCAT(A, B) CONCAT_IMPL(A, B)
559
560 #define LX_INIT_RESOLVCONF_FULL_HEADER CONCAT(LX_INIT_AUTO_GENERATED_FILE_HEADER, LX_INIT_RESOLVCONF_PREFIX)
561
562 inline void PrettyPrint(std::stringstream& Out, LX_MESSAGE_TYPE Value)
563 {
564 Out << ToString(Value);
565 }
566
567 enum class TRANSACTION_STEP : unsigned int
568 {
569 NONE = 0,
570 REQUEST = 1,
571 FIRST_REPLY = 2,
572 };
573
574 struct MESSAGE_HEADER
575 {
576 static inline auto Type = LxMiniInitMessageAny; // Setting this allows using MESSAGE_HEADER to receive any type of message
577
578 LX_MESSAGE_TYPE MessageType;
579 unsigned int MessageSize;
580 unsigned int TransactionId;
581 unsigned int TransactionStep;
582
583 PRETTY_PRINT(FIELD(MessageType), FIELD(MessageSize), FIELD(TransactionId), FIELD(TransactionStep));
584 };
585
586 //
587 // The data for launching a new session.
588 //
589
590 typedef struct _LX_INIT_CREATE_SESSION_RESPONSE
591 {
592 static inline auto Type = LxInitMessageCreateSessionResponse;
593
594 MESSAGE_HEADER Header;
595 unsigned int Port;
596
597 PRETTY_PRINT(FIELD(Header), FIELD(Port));
598
599 } LX_INIT_CREATE_SESSION_RESPONSE, *PLX_INIT_CREATE_SESSION_RESPONSE;
600
601 typedef struct _LX_INIT_CREATE_SESSION
602 {
603 static inline auto Type = LxInitMessageCreateSession;
604 using TResponse = LX_INIT_CREATE_SESSION_RESPONSE;
605
606 MESSAGE_HEADER Header;
607 int64_t ConsoleId;
608
609 PRETTY_PRINT(FIELD(Header), FIELD(ConsoleId));
610 } LX_INIT_CREATE_SESSION, *PLX_INIT_CREATE_SESSION;
611
612 typedef enum _CREATE_PROCESS_SHELL_OPTIONS
613 {
614 ShellOptionsLogin = 0x1
615 } CREATE_PROCESS_SHELL_OPTIONS,
616 *PCREATE_PROCESS_SHELL_OPTIONS;
617
618 //
619 // N.B. The common create process structure must be the last element in the
620 // containing struct because it contains an anysize array.
621 //
622
623 template <typename T>
624 constexpr LX_MESSAGE_TYPE GetResultMessageType()
625 {
626 if constexpr (std::is_same_v<T, bool>)
627 {
628 return LxMessageResultBool;
629 }
630 else if constexpr (std::is_same_v<T, int32_t>)
631 {
632 return LxMessageResultInt32;
633 }
634 else if constexpr (std::is_same_v<T, uint32_t>)
635 {
636 return LxMessageResultUint32;
637 }
638 else if constexpr (std::is_same_v<T, uint8_t>)
639 {
640 return LxMessageResultUint8;
641 }
642 else
643 {
644 static_assert(sizeof(T) != sizeof(T));
645 }
646 }
647
648 template <typename T>
649 struct RESULT_MESSAGE
650 {
651 static inline auto Type = GetResultMessageType<T>();
652
653 MESSAGE_HEADER Header;
654 T Result;
655
656 PRETTY_PRINT(FIELD(Header), FIELD(Result));
657 };
658
659 typedef struct _LX_PROCESS_CRASH
660 {
661 static inline auto Type = LxProcessCrash;
662 using TResponse = RESULT_MESSAGE<int32_t>;
663
664 MESSAGE_HEADER Header;
665 std::uint64_t Timestamp;
666 std::uint32_t Signal;
667 std::uint32_t Pid;
668
669 char Buffer[];
670
671 PRETTY_PRINT(FIELD(Header), FIELD(Timestamp), FIELD(Signal), FIELD(Pid), BUFFER_FIELD(Buffer));
672
673 } LX_PROCESS_CRASH, *PLX_PROCESS_CRASH;
674
675 typedef struct _LX_INIT_CREATE_PROCESS_COMMON
676 {
677 unsigned int FilenameOffset;
678 unsigned int CurrentWorkingDirectoryOffset;
679 unsigned int CommandLineOffset;
680 unsigned short CommandLineCount;
681 unsigned int EnvironmentOffset;
682 unsigned short EnvironmentCount;
683 unsigned int NtEnvironmentOffset;
684 unsigned short NtEnvironmentCount;
685 unsigned int NtPathOffset;
686 unsigned int ShellOptions;
687 unsigned int UsernameOffset;
688 unsigned int DefaultUid;
689 int Flags;
690 char Buffer[];
691 } LX_INIT_CREATE_PROCESS_COMMON, *PLX_INIT_CREATE_PROCESS_COMMON;
692
693 typedef struct _LX_INIT_CREATE_PROCESS_RESPONSE
694 {
695 static inline auto Type = LxInitMessageCreateProcessResponse;
696
697 MESSAGE_HEADER Header;
698 int Result;
699 int64_t SignalPipeId;
700 unsigned int Flags;
701
702 PRETTY_PRINT(FIELD(Header), FIELD(Result), FIELD(SignalPipeId), FIELD(Flags));
703 } LX_INIT_CREATE_PROCESS_RESPONSE, *PLX_INIT_CREATE_PROCESS_RESPONSE;
704
705 typedef struct _LX_INIT_CREATE_PROCESS
706 {
707 static inline auto Type = LxInitMessageCreateProcess;
708 using TResponse = _LX_INIT_CREATE_PROCESS_RESPONSE;
709
710 MESSAGE_HEADER Header;
711 int64_t IpcServerId;
712 int64_t StdFdIds[LX_INIT_STD_FD_COUNT];
713 int64_t ForkTokenId;
714 LX_INIT_CREATE_PROCESS_COMMON Common;
715
716 PRETTY_PRINT(FIELD(Header), FIELD(IpcServerId), FIELD(StdFdIds), FIELD(ForkTokenId));
717 } LX_INIT_CREATE_PROCESS, *PLX_INIT_CREATE_PROCESS;
718
719 typedef struct _LX_INIT_CREATE_NT_PROCESS_COMMON
720 {
721 int64_t StdFdIds[LX_INIT_STD_FD_COUNT];
722 unsigned int FilenameOffset;
723 unsigned int CurrentWorkingDirectoryOffset;
724 unsigned int CommandLineOffset;
725 unsigned short CommandLineCount;
726 unsigned int EnvironmentOffset;
727 unsigned short Rows;
728 unsigned short Columns;
729 bool CreatePseudoconsole;
730 char Buffer[];
731
732 // Not pretty-printing command line and env since it could contain PII.
733 PRETTY_PRINT(FIELD(StdFdIds), STRING_FIELD(FilenameOffset), STRING_FIELD(CurrentWorkingDirectoryOffset), FIELD(Rows), FIELD(Columns), FIELD(CreatePseudoconsole));
734 } LX_INIT_CREATE_NT_PROCESS_COMMON, *PLX_INIT_CREATE_NT_PROCESS_COMMON;
735
736 using PCLX_INIT_CREATE_NT_PROCESS_COMMON = const LX_INIT_CREATE_NT_PROCESS_COMMON*;
737
738 typedef struct _LX_INIT_CREATE_NT_PROCESS
739 {
740 static inline auto Type = LxInitMessageCreateProcess;
741
742 MESSAGE_HEADER Header;
743 int64_t StdFdIds[LX_INIT_STD_FD_COUNT];
744 LX_INIT_CREATE_NT_PROCESS_COMMON Common;
745
746 PRETTY_PRINT(FIELD(Header), FIELD(StdFdIds), FIELD(Common));
747
748 } LX_INIT_CREATE_NT_PROCESS, *PLX_INIT_CREATE_NT_PROCESS;
749
750 using PCLX_INIT_CREATE_NT_PROCESS = const LX_INIT_CREATE_NT_PROCESS*;
751
752 typedef struct _LX_INIT_CREATE_NT_PROCESS_UTILITY_VM
753 {
754 static inline auto Type = LxInitMessageCreateProcessUtilityVm;
755
756 MESSAGE_HEADER Header;
757 unsigned int Port;
758 LX_INIT_CREATE_NT_PROCESS_COMMON Common;
759
760 PRETTY_PRINT(FIELD(Header), FIELD(Port), FIELD(Common));
761 } LX_INIT_CREATE_NT_PROCESS_UTILITY_VM, *PLX_INIT_CREATE_NT_PROCESS_UTILITY_VM;
762
763 using PCLX_INIT_CREATE_NT_PROCESS_UTILITY_VM = const LX_INIT_CREATE_NT_PROCESS_UTILITY_VM*;
764
765 //
766 // The data communicating networking information. The structure is variable
767 // size and the FileContents member contains the string to write to the
768 // /etc/resolv.conf file.
769 //
770
771 typedef struct _LX_INIT_NETWORK_INFORMATION
772 {
773 static inline auto Type = LxInitMessageNetworkInformation;
774
775 MESSAGE_HEADER Header;
776 unsigned int FileHeaderIndex;
777 unsigned int FileContentsIndex;
778 char Buffer[];
779
780 PRETTY_PRINT(FIELD(Header), STRING_FIELD(FileHeaderIndex), STRING_FIELD(FileContentsIndex));
781 } LX_INIT_NETWORK_INFORMATION, *PLX_INIT_NETWORK_INFORMATION;
782
783 typedef struct _LX_INIT_CREATE_LOGIN_SESSION
784 {
785 static inline auto Type = LxInitMessageCreateLoginSession;
786 using TResponse = RESULT_MESSAGE<bool>;
787
788 MESSAGE_HEADER Header;
789 unsigned int Uid;
790 unsigned int Gid;
791 char Buffer[]; // Contains username
792
793 PRETTY_PRINT(FIELD(Header), FIELD(Uid), FIELD(Gid), BUFFER_FIELD(Buffer));
794 } LX_INIT_CREATE_LOGIN_SESSION, *PLX_INIT_CREATE_LOGIN_SESSION;
795
796 //
797 // The buffer of the query environment variable struct contains the name of the variable
798 // to query for. On response, it will contain the value of the environment variable.
799 //
800
801 typedef struct _LX_INIT_QUERY_ENVIRONMENT_VARIABLE
802 {
803 static inline auto Type = LxInitMessageQueryEnvironmentVariable;
804
805 MESSAGE_HEADER Header;
806 char Buffer[];
807
808 PRETTY_PRINT(FIELD(Header), BUFFER_FIELD(Buffer));
809 } LX_INIT_QUERY_ENVIRONMENT_VARIABLE, *PLX_INIT_QUERY_ENVIRONMENT_VARIABLE;
810
811 typedef struct _LX_GNS_RESULT
812 {
813 static inline auto Type = LxGnsMessageResult;
814
815 MESSAGE_HEADER Header;
816 int Result;
817 char Buffer[];
818
819 // Note: 'Buffer' doesn't always contain a string, so don't pretty print it.
820 PRETTY_PRINT(FIELD(Header), FIELD(Result));
821 } LX_GNS_RESULT, *PLX_GNS_RESULT;
822
823 typedef struct _LX_GNS_INTERFACE_CONFIGURATION
824 {
825 static inline auto Type = LxGnsMessageInterfaceConfiguration;
826 using TResponse = LX_GNS_RESULT;
827
828 MESSAGE_HEADER Header;
829 char Content[];
830
831 PRETTY_PRINT(FIELD(Header), BUFFER_FIELD(Content));
832 } LX_GNS_INTERFACE_CONFIGURATION, *PLX_GNS_INTERFACE_CONFIGURATION;
833
834 typedef struct _LX_GNS_NOTIFICATION
835 {
836 static inline auto Type = LxGnsMessageNotification;
837 using TResponse = LX_GNS_RESULT;
838
839 MESSAGE_HEADER Header;
840 GUID AdapterId;
841 char Content[];
842
843 PRETTY_PRINT(FIELD(Header), FIELD(AdapterId), BUFFER_FIELD(Content));
844 } LX_GNS_NOTIFICATION, *PLX_GNS_NOTIFICATION;
845
846 typedef struct _LX_GNS_PORT_ALLOCATION_REQUEST
847 {
848 static inline auto Type = LxGnsMessagePortMappingRequest;
849 using TResponse = RESULT_MESSAGE<int32_t>;
850
851 MESSAGE_HEADER Header;
852 uint32_t Address32[4];
853 uint16_t Port;
854 int Af;
855 int Protocol;
856 bool Allocate;
857
858 PRETTY_PRINT(FIELD(Header), FIELD(Address32), FIELD(Port), FIELD(Af), FIELD(Protocol), FIELD(Allocate));
859 } LX_GNS_PORT_ALLOCATION_REQUEST, *PLX_GNS_PORT_ALLOCATION_REQUEST;
860
861 typedef struct _LX_GNS_SET_PORT_LISTENER
862 {
863 static inline auto Type = LxGnsMessageSetPortListener;
864
865 MESSAGE_HEADER Header;
866 int HvSocketPort;
867
868 PRETTY_PRINT(FIELD(Header), FIELD(HvSocketPort));
869 } LX_GNS_SET_PORT_LISTENER, *PLX_GNS_SET_PORT_LISTENER;
870
871 static_assert(sizeof(LX_GNS_SET_PORT_LISTENER) == 20);
872
873 typedef struct _LX_GNS_PORT_LISTENER_RELAY
874 {
875 static inline auto Type = LxGnsMessageListenerRelay;
876
877 MESSAGE_HEADER Header;
878 unsigned short Family;
879 unsigned short Port;
880 unsigned int Address[4];
881
882 PRETTY_PRINT(FIELD(Header), FIELD(Family), FIELD(Port), FIELD(Address));
883 } LX_GNS_PORT_LISTENER_RELAY, *PLX_GNS_START_PORT_LISTENER_RELAY;
884
885 using PCLX_GNS_PORT_LISTENER_RELAY = const LX_GNS_PORT_LISTENER_RELAY*;
886
887 typedef struct _LX_GNS_TUN_BRIDGE_REQUEST
888 {
889 static inline auto Type = LxGnsMessageIfStateChangeRequest;
890 using TResponse = RESULT_MESSAGE<int32_t>;
891
892 MESSAGE_HEADER Header;
893 char InterfaceName[16];
894 bool InterfaceUp;
895
896 PRETTY_PRINT(FIELD(Header), FIELD(InterfaceName), FIELD(InterfaceUp));
897 } LX_GNS_TUN_BRIDGE_REQUEST, *PLX_GNS_TUN_BRIDGE_REQUEST;
898
899 typedef struct _LX_GNS_DNS_CLIENT_IDENTIFIER
900 {
901 // Protocol used by the Linux DNS client. Can be TCP or UDP.
902 uint8_t Protocol;
903 // Unique id that identifies the Linux DNS client. Used by the DNS server on the Linux side to know to which
904 // DNS client to send back a DNS response.
905 uint32_t DnsClientId;
906
907 _LX_GNS_DNS_CLIENT_IDENTIFIER() = default;
908 ~_LX_GNS_DNS_CLIENT_IDENTIFIER() noexcept = default;
909
910 _LX_GNS_DNS_CLIENT_IDENTIFIER(const _LX_GNS_DNS_CLIENT_IDENTIFIER&) = default;
911 _LX_GNS_DNS_CLIENT_IDENTIFIER& operator=(const _LX_GNS_DNS_CLIENT_IDENTIFIER&) = default;
912 } LX_GNS_DNS_CLIENT_IDENTIFIER, *PLX_GNS_DNS_CLIENT_IDENTIFIER;
913
914 typedef struct _LX_GNS_DNS_TUNNELING_MESSAGE
915 {
916 static inline auto Type = LxGnsMessageDnsTunneling;
917
918 MESSAGE_HEADER Header;
919 LX_GNS_DNS_CLIENT_IDENTIFIER DnsClientIdentifier;
920 // Raw DNS request or response (variable length).
921 char Buffer[];
922
923 PRETTY_PRINT(FIELD(Header), FIELD(DnsClientIdentifier.Protocol), FIELD(DnsClientIdentifier.DnsClientId));
924 } LX_GNS_DNS_TUNNELING_MESSAGE, *PLX_GNS_DNS_TUNNELING_MESSAGE;
925
926 // Verify there is no padding in the LX_GNS_DNS_TUNNELING_MESSAGE structure before the variable length Buffer field.
927 static_assert(offsetof(LX_GNS_DNS_TUNNELING_MESSAGE, Buffer) == sizeof(MESSAGE_HEADER) + sizeof(LX_GNS_DNS_CLIENT_IDENTIFIER));
928
929 typedef struct _LX_GNS_JSON_MESSAGE
930 {
931 static inline auto Type = LxMiniInitMessageAny;
932 using TResponse = LX_GNS_RESULT;
933
934 MESSAGE_HEADER Header;
935 char Content[];
936
937 PRETTY_PRINT(FIELD(Header), BUFFER_FIELD(Content));
938 } LX_GNS_JSON_MESSAGE, *PLX_GNS_JSON_MESSAGE;
939
940 using PCLX_INIT_NETWORK_INFORMATION = const LX_INIT_NETWORK_INFORMATION*;
941
942 typedef struct _LX_INIT_STOP_PLAN9_SERVER
943 {
944 static inline auto Type = LxInitMessageStopPlan9Server;
945 using TResponse = RESULT_MESSAGE<bool>;
946
947 MESSAGE_HEADER Header;
948 bool Force;
949
950 PRETTY_PRINT(FIELD(Header), FIELD(Force));
951 } LX_INIT_STOP_PLAN9_SERVER, *PLX_INIT_STOP_PLAN9_SERVER;
952
953 //
954 // Feature flags to provide runtime velocity support for Linux code.
955 //
956 // To use this, define a new flag, and set it as part of the initial
957 // configuration message in WslService if the relevant feature is enabled.
958 // Call UtilGetFeatureFlags to determine which flags are enabled from the
959 // Linux code.
960 //
961
962 typedef enum _LX_INIT_FEATURE_FLAGS
963 {
964 LxInitFeatureNone = 0,
965 LxInitFeatureVirtIo9p = 0x1,
966 LxInitFeatureVirtIoFs = 0x2,
967 LxInitFeatureDisable9pServer = 0x4,
968 LxInitFeatureRootfsCompressed = 0x8,
969 LxInitFeatureSystemDistro = 0x10,
970 LxInitFeatureDnsTunneling = 0x20,
971 } LX_INIT_FEATURE_FLAGS,
972 *PLX_INIT_FEATURE_FLAGS;
973
974 typedef struct _LX_INIT_CONFIGURATION_INFORMATION_RESPONSE
975 {
976 static inline auto Type = LxInitMessageInitializeResponse;
977
978 MESSAGE_HEADER Header;
979 unsigned int Plan9Port;
980 unsigned int DefaultUid;
981 unsigned int InteropPort;
982 bool SystemdEnabled;
983 std::uint64_t PidNamespace;
984 unsigned int FlavorIndex;
985 unsigned int VersionIndex;
986 char Buffer[];
987
988 PRETTY_PRINT(FIELD(Header), FIELD(Plan9Port), FIELD(DefaultUid), FIELD(InteropPort), FIELD(SystemdEnabled), FIELD(PidNamespace), STRING_FIELD(FlavorIndex), STRING_FIELD(VersionIndex));
989 } LX_INIT_CONFIGURATION_INFORMATION_RESPONSE, *PLX_INIT_CONFIGURATION_INFORMATION_RESPONSE;
990
991 using PCLX_INIT_CONFIGURATION_INFORMATION_RESPONSE = const LX_INIT_CONFIGURATION_INFORMATION_RESPONSE*;
992
993 //
994 // The data communicating initial configuration information for the instance.
995 // This contains the hostname, domainname, entries from the Windows hosts file,
996 // and the DrvFs volumes to mount.
997 //
998
999 typedef struct _LX_INIT_CONFIGURATION_INFORMATION
1000 {
1001 static inline auto Type = LxInitMessageInitialize;
1002 using TResponse = LX_INIT_CONFIGURATION_INFORMATION_RESPONSE;
1003
1004 MESSAGE_HEADER Header;
1005 unsigned int HostnameOffset;
1006 unsigned int DomainnameOffset;
1007 unsigned int WindowsHostsOffset;
1008 unsigned int DistributionNameOffset;
1009 unsigned int Plan9SocketOffset;
1010 unsigned int TimezoneOffset;
1011 unsigned int DrvFsVolumesBitmap;
1012 unsigned int DrvFsDefaultOwner;
1013 unsigned int FeatureFlags;
1014 LX_INIT_DRVFS_MOUNT DrvfsMount;
1015 char Buffer[];
1016
1017 PRETTY_PRINT(
1018 FIELD(Header),
1019 STRING_FIELD(HostnameOffset),
1020 STRING_FIELD(DomainnameOffset),
1021 STRING_FIELD(WindowsHostsOffset),
1022 STRING_FIELD(Plan9SocketOffset),
1023 STRING_FIELD(TimezoneOffset),
1024 FIELD(DrvFsVolumesBitmap),
1025 FIELD(DrvFsDefaultOwner),
1026 FIELD(FeatureFlags),
1027 FIELD(DrvfsMount));
1028
1029 } LX_INIT_CONFIGURATION_INFORMATION, *PLX_INIT_CONFIGURATION_INFORMATION;
1030
1031 using PCLX_INIT_CONFIGURATION_INFORMATION = const LX_INIT_CONFIGURATION_INFORMATION*;
1032
1033 //
1034 // The data communicating timezone information. The structure contains the IANA
1035 // timezone identifier.
1036 //
1037
1038 typedef struct _LX_INIT_TIMEZONE_INFORMATION
1039 {
1040 static inline auto Type = LxInitMessageTimezoneInformation;
1041
1042 MESSAGE_HEADER Header;
1043 unsigned int TimezoneOffset;
1044 char Buffer[];
1045
1046 PRETTY_PRINT(FIELD(Header), STRING_FIELD(TimezoneOffset));
1047 } LX_INIT_TIMEZONE_INFORMATION, *PLX_INIT_TIMEZONE_INFORMATION;
1048
1049 using PCLX_INIT_TIMEZONE_INFORMATION = const LX_INIT_TIMEZONE_INFORMATION*;
1050
1051 //
1052 // Flags to provide runtime behavior for create process.
1053 //
1054
1055 typedef enum _LX_INIT_CREATE_PROCESS_FLAGS
1056 {
1057 LxInitCreateProcessFlagsNone = 0,
1058 LxInitCreateProcessFlagsStdInConsole = 0x1,
1059 LxInitCreateProcessFlagsStdOutConsole = 0x2,
1060 LxInitCreateProcessFlagsStdErrConsole = 0x4,
1061 LxInitCreateProcessFlagsElevated = 0x8,
1062 LxInitCreateProcessFlagsInteropEnabled = 0x10,
1063 LxInitCreateProcessFlagAllowOOBE = 0x20,
1064 } LX_INIT_CREATE_PROCESS_FLAGS,
1065 *PLX_INIT_CREATE_PROCESS_FLAGS;
1066
1067 typedef struct _LX_INIT_CREATE_PROCESS_UTILITY_VM
1068 {
1069 static inline auto Type = LxInitMessageCreateProcessUtilityVm;
1070 using TResponse = RESULT_MESSAGE<uint32_t>;
1071
1072 MESSAGE_HEADER Header;
1073 unsigned short Rows;
1074 unsigned short Columns;
1075 LX_INIT_CREATE_PROCESS_COMMON Common;
1076
1077 PRETTY_PRINT(FIELD(Header), FIELD(Rows), FIELD(Columns));
1078 } LX_INIT_CREATE_PROCESS_UTILITY_VM, *PLX_INIT_CREATE_PROCESS_UTILITY_VM;
1079
1080 using PCLX_INIT_CREATE_PROCESS_UTILITY_VM = const LX_INIT_CREATE_PROCESS_UTILITY_VM*;
1081
1082 //
1083 // The data for communicating process exit status.
1084 //
1085
1086 typedef struct _LX_INIT_PROCESS_EXIT_STATUS
1087 {
1088 static inline auto Type = LxInitMessageExitStatus;
1089
1090 MESSAGE_HEADER Header;
1091 int ExitCode;
1092
1093 PRETTY_PRINT(FIELD(Header), FIELD(ExitCode));
1094 } LX_INIT_PROCESS_EXIT_STATUS, *PLX_INIT_PROCESS_EXIT_STATUS;
1095
1096 using PCLX_INIT_PROCESS_EXIT_STATUS = const LX_INIT_PROCESS_EXIT_STATUS*;
1097
1098 //
1099 // The data for communicating window size changes.
1100 //
1101
1102 typedef struct _LX_INIT_WINDOW_SIZE_CHANGED
1103 {
1104 static inline auto Type = LxInitMessageWindowSizeChanged;
1105
1106 MESSAGE_HEADER Header;
1107 unsigned short Rows;
1108 unsigned short Columns;
1109
1110 PRETTY_PRINT(FIELD(Header), FIELD(Rows), FIELD(Columns));
1111 } LX_INIT_WINDOW_SIZE_CHANGED, *PLX_INIT_WINDOW_SIZE_CHANGED;
1112
1113 using PCLX_INIT_WINDOW_SIZE_CHANGED = const LX_INIT_WINDOW_SIZE_CHANGED*;
1114
1115 //
1116 // The data for terminating an instance.
1117 //
1118
1119 typedef struct _LX_INIT_TERMINATE_INSTANCE
1120 {
1121 static inline auto Type = LxInitMessageTerminateInstance;
1122 using TResponse = RESULT_MESSAGE<bool>;
1123
1124 MESSAGE_HEADER Header;
1125 bool Force;
1126
1127 PRETTY_PRINT(FIELD(Header), FIELD(Force));
1128 } LX_INIT_TERMINATE_INSTANCE, *PLX_INIT_TERMINATE_INSTANCE;
1129
1130 using PCLX_INIT_TERMINATE_INSTANCE = const LX_INIT_TERMINATE_INSTANCE*;
1131
1132 //
1133 // The data for beginning a socket relay.
1134 //
1135
1136 typedef struct _LX_INIT_START_SOCKET_RELAY
1137 {
1138 static inline auto Type = LxInitMessageStartSocketRelay;
1139
1140 DECLARE_MESSAGE_CTOR(_LX_INIT_START_SOCKET_RELAY);
1141
1142 MESSAGE_HEADER Header;
1143 unsigned short Family;
1144 unsigned short Port;
1145 uint64_t BufferSize;
1146
1147 PRETTY_PRINT(FIELD(Header), FIELD(Family), FIELD(Port), FIELD(BufferSize));
1148 } LX_INIT_START_SOCKET_RELAY, *PLX_INIT_START_SOCKET_RELAY;
1149
1150 using PCLX_INIT_START_SOCKET_RELAY = const LX_INIT_START_SOCKET_RELAY*;
1151
1152 typedef struct _LX_INIT_MOUNT_DRVFS
1153 {
1154 static inline auto Type = LxInitMessageRemountDrvfs;
1155 using TResponse = RESULT_MESSAGE<int32_t>;
1156
1157 MESSAGE_HEADER Header;
1158 bool Admin;
1159 unsigned int VolumesToMount;
1160 unsigned int UnreadableVolumes;
1161 int DefaultOwnerUid;
1162
1163 PRETTY_PRINT(FIELD(Header), FIELD(Admin), FIELD(VolumesToMount), FIELD(UnreadableVolumes), FIELD(DefaultOwnerUid));
1164 } LX_INIT_MOUNT_DRVFS, PLX_INIT_MOUNT_DRVFS;
1165
1166 typedef struct _LX_INIT_ADD_VIRTIOFS_SHARE_RESPONSE_MESSAGE
1167 {
1168 static inline auto Type = LxInitMessageAddVirtioFsDeviceResponse;
1169
1170 MESSAGE_HEADER Header;
1171 int Result;
1172 unsigned int TagOffset;
1173 unsigned int ChildNameOffset;
1174 unsigned int SourceOffset;
1175 char Buffer[];
1176
1177 PRETTY_PRINT(FIELD(Header), FIELD(Result), STRING_FIELD(TagOffset), STRING_FIELD(ChildNameOffset), STRING_FIELD(SourceOffset));
1178 } LX_INIT_ADD_VIRTIOFS_SHARE_RESPONSE_MESSAGE, *PLX_INIT_ADD_VIRTIOFS_SHARE_RESPONSE_MESSAGE;
1179
1180 typedef struct _LX_INIT_ADD_VIRTIOFS_SHARE_MESSAGE
1181 {
1182 static inline auto Type = LxInitMessageAddVirtioFsDevice;
1183 using TResponse = LX_INIT_ADD_VIRTIOFS_SHARE_RESPONSE_MESSAGE;
1184
1185 MESSAGE_HEADER Header;
1186 bool Admin;
1187 unsigned int PathOffset;
1188 unsigned int OptionsOffset;
1189 char Buffer[];
1190
1191 PRETTY_PRINT(FIELD(Header), FIELD(Admin), STRING_FIELD(PathOffset), STRING_FIELD(OptionsOffset));
1192 } LX_INIT_ADD_VIRTIOFS_SHARE_MESSAGE, *PLX_INIT_ADD_VIRTIOFS_SHARE_MESSAGE;
1193
1194 typedef struct _LX_INIT_REMOUNT_VIRTIOFS_SHARE_MESSAGE
1195 {
1196 static inline auto Type = LxInitMessageRemountVirtioFsDevice;
1197 using TResponse = LX_INIT_ADD_VIRTIOFS_SHARE_RESPONSE_MESSAGE;
1198
1199 MESSAGE_HEADER Header;
1200 bool Admin;
1201 unsigned int TagOffset;
1202 char Buffer[];
1203
1204 PRETTY_PRINT(FIELD(Header), FIELD(Admin), STRING_FIELD(TagOffset));
1205 } LX_INIT_REMOUNT_VIRTIOFS_SHARE_MESSAGE, *PLX_INIT_REMOUNT_VIRTIOFS_SHARE_MESSAGE;
1206
1207 //
1208 // The messages that can be sent to mini_init.
1209 //
1210
1211 typedef enum _LX_MINI_INIT_MESSAGE_FLAGS
1212 {
1213 LxMiniInitMessageFlagNone = 0,
1214 LxMiniInitMessageFlagMountReadOnly = 0x1,
1215 LxMiniInitMessageFlagCreateOverlayFs = 0x2,
1216 LxMiniInitMessageFlagLaunchSystemDistro = 0x4,
1217 LxMiniInitMessageFlagExportCompressGzip = 0x8,
1218 LxMiniInitMessageFlagExportCompressXzip = 0x10,
1219 LxMiniInitMessageFlagVerbose = 0x20,
1220 } LX_MINI_INIT_MESSAGE_FLAGS,
1221 *PLX_MINI_INIT_MESSAGE_FLAGS;
1222
1223 typedef enum _LX_MINI_INIT_MOUNT_DEVICE_TYPE
1224 {
1225 LxMiniInitMountDeviceTypeInvalid = 0,
1226 LxMiniInitMountDeviceTypeLun = 0x1,
1227 LxMiniInitMountDeviceTypePmem = 0x2,
1228 } LX_MINI_INIT_MOUNT_DEVICE_TYPE,
1229 *PLX_MINI_INIT_MOUNT_DEVICE_TYPE;
1230
1231 typedef struct _LX_MINI_INIT_MESSAGE
1232 {
1233 static inline auto Type = LxMiniInitMessageLaunchInit;
1234
1235 MESSAGE_HEADER Header;
1236 LX_MINI_INIT_MOUNT_DEVICE_TYPE MountDeviceType;
1237 unsigned int DeviceId;
1238 unsigned int FsTypeOffset;
1239 unsigned int MountOptionsOffset;
1240 unsigned int VmIdOffset;
1241 unsigned int DistributionNameOffset;
1242 unsigned int SharedMemoryRootOffset;
1243 unsigned int InstallPathOffset;
1244 unsigned int UserProfileOffset;
1245 unsigned int Flags;
1246 unsigned int ConnectPort;
1247 char Buffer[];
1248
1249 PRETTY_PRINT(
1250 FIELD(Header),
1251 FIELD(MountDeviceType),
1252 FIELD(DeviceId),
1253 STRING_FIELD(FsTypeOffset),
1254 STRING_FIELD(MountOptionsOffset),
1255 STRING_FIELD(DistributionNameOffset),
1256 STRING_FIELD(SharedMemoryRootOffset),
1257 STRING_FIELD(InstallPathOffset),
1258 STRING_FIELD(UserProfileOffset),
1259 FIELD(Flags),
1260 FIELD(ConnectPort));
1261
1262 } LX_MINI_INIT_MESSAGE, *PLX_MINI_INIT_MESSAGE;
1263
1264 using PCLX_MINI_INIT_MESSAGE = const LX_MINI_INIT_MESSAGE*;
1265
1266 typedef enum _LX_MINI_INIT_MEMORY_RECLAIM_MODE
1267 {
1268 LxMiniInitMemoryReclaimModeDisabled,
1269 LxMiniInitMemoryReclaimModeGradual,
1270 LxMiniInitMemoryReclaimModeDropCache
1271 } LX_MINI_INIT_MEMORY_RECLAIM_MODE,
1272 *PLX_MINI_INIT_MEMORY_RECLAIM_MODE;
1273
1274 typedef struct _LX_MINI_INIT_EARLY_CONFIG_MESSAGE
1275 {
1276 static inline auto Type = LxMiniInitMessageEarlyConfig;
1277
1278 MESSAGE_HEADER Header;
1279 unsigned int SwapLun;
1280 LX_MINI_INIT_MOUNT_DEVICE_TYPE SystemDistroDeviceType;
1281 unsigned int SystemDistroDeviceId;
1282 LX_MINI_INIT_MEMORY_RECLAIM_MODE MemoryReclaimMode;
1283 // IPv4 address stored in network byte order
1284 uint32_t DnsTunnelingIpAddress = 0;
1285 bool EnableDebugShell;
1286 bool EnableDnsTunneling;
1287 bool EnableSafeMode;
1288 bool DefaultKernel;
1289 bool IsolateDistroCgroup;
1290 unsigned int KernelModulesDeviceId;
1291 unsigned int HostnameOffset;
1292 unsigned int KernelModulesListOffset;
1293 char Buffer[];
1294
1295 PRETTY_PRINT(
1296 FIELD(Header),
1297 FIELD(SwapLun),
1298 FIELD(SystemDistroDeviceType),
1299 FIELD(SystemDistroDeviceId),
1300 FIELD(MemoryReclaimMode),
1301 FIELD(DnsTunnelingIpAddress),
1302 FIELD(EnableDebugShell),
1303 FIELD(EnableDnsTunneling),
1304 FIELD(EnableSafeMode),
1305 FIELD(DefaultKernel),
1306 FIELD(IsolateDistroCgroup),
1307 FIELD(KernelModulesDeviceId),
1308 STRING_FIELD(HostnameOffset),
1309 STRING_FIELD(KernelModulesListOffset));
1310 } LX_MINI_INIT_EARLY_CONFIG_MESSAGE, *PLX_MINI_INIT_EARLY_CONFIG_MESSAGE;
1311
1312 using PCLX_MINI_INIT_EARLY_CONFIG_MESSAGE = const LX_MINI_INIT_EARLY_CONFIG_MESSAGE*;
1313
1314 typedef enum _LX_MINI_INIT_PORT_TRACKER_TYPE
1315 {
1316 LxMiniInitPortTrackerTypeNone,
1317 LxMiniInitPortTrackerTypeMirrored,
1318 LxMiniInitPortTrackerTypeRelay,
1319 } LX_MINI_INIT_PORT_TRACKER_TYPE,
1320 *PLX_MINI_INIT_PORT_TRACKER_TYPE;
1321
1322 typedef enum _LX_MINI_INIT_NETWORKING_MODE
1323 {
1324 LxMiniInitNetworkingModeNone = 0,
1325 LxMiniInitNetworkingModeNat = 1,
1326 LxMiniInitNetworkingModeBridged = 2,
1327 LxMiniInitNetworkingModeMirrored = 3,
1328 LxMiniInitNetworkingModeConsomme = 4
1329 } LX_MINI_INIT_NETWORKING_MODE,
1330 *PLX_MINI_INIT_NETWORKING_MODE;
1331
1332 typedef struct _LX_MINI_INIT_NETWORKING_CONFIGURATION
1333 {
1334 LX_MINI_INIT_NETWORKING_MODE NetworkingMode;
1335 LX_MINI_INIT_PORT_TRACKER_TYPE PortTrackerType;
1336 uint16_t EphemeralPortRangeStart; // Both Start and End are inclusive
1337 uint16_t EphemeralPortRangeEnd;
1338 bool EnableDhcpClient;
1339 bool DisableIpv6;
1340 int DhcpTimeout;
1341 } LX_MINI_INIT_NETWORKING_CONFIGURATION, *PLX_MINI_INIT_NETWORKING_CONFIGURATION;
1342
1343 typedef struct _LX_MINI_INIT_CONFIG_MESSAGE
1344 {
1345 static inline auto Type = LxMiniInitMessageInitialConfig;
1346
1347 MESSAGE_HEADER Header;
1348 int EntropySize;
1349 unsigned int EntropyOffset;
1350 bool EnableGuiApps;
1351 bool MountGpuShares;
1352 bool EnableInboxGpuLibs;
1353 LX_MINI_INIT_NETWORKING_CONFIGURATION NetworkingConfiguration;
1354 char Buffer[];
1355
1356 PRETTY_PRINT(
1357 FIELD(Header),
1358 FIELD(EntropySize),
1359 FIELD(MountGpuShares),
1360 FIELD(EntropyOffset),
1361 FIELD(EnableInboxGpuLibs),
1362 FIELD(NetworkingConfiguration.NetworkingMode),
1363 FIELD(NetworkingConfiguration.PortTrackerType),
1364 FIELD(NetworkingConfiguration.EphemeralPortRangeStart),
1365 FIELD(NetworkingConfiguration.EphemeralPortRangeEnd),
1366 FIELD(NetworkingConfiguration.EnableDhcpClient),
1367 FIELD(NetworkingConfiguration.DisableIpv6),
1368 FIELD(NetworkingConfiguration.DhcpTimeout));
1369
1370 } LX_MINI_INIT_CONFIG_MESSAGE, *PLX_MINI_INIT_CONFIG_MESSAGE;
1371
1372 using PCLX_MINI_INIT_CONFIG_MESSAGE = const LX_MINI_INIT_CONFIG_MESSAGE*;
1373
1374 typedef struct _LX_MINI_INIT_TELEMETRY_MESSAGE
1375 {
1376 static inline auto Type = LxMiniInitTelemetryMessage;
1377
1378 MESSAGE_HEADER Header;
1379 bool ShowDrvFsNotification;
1380 char Buffer[];
1381
1382 PRETTY_PRINT(FIELD(Header), FIELD(ShowDrvFsNotification), BUFFER_FIELD(Buffer));
1383
1384 } LX_MINI_INIT_TELEMETRY_MESSAGE, *PLX_MINI_INIT_TELEMETRY_MESSAGE;
1385
1386 using PCLX_MINI_INIT_TELEMETRY_MESSAGE = const LX_MINI_INIT_TELEMETRY_MESSAGE*;
1387
1388 typedef struct _LX_MINI_INIT_MOUNT_MESSAGE
1389 {
1390 static inline auto Type = LxMiniInitMessageMount;
1391
1392 MESSAGE_HEADER Header;
1393 unsigned int PartitionIndex; // 0 means the disk directly
1394 unsigned int ScsiLun;
1395 unsigned int TypeOffset;
1396 unsigned int TargetNameOffset;
1397 unsigned int OptionsOffset;
1398 char Buffer[];
1399
1400 PRETTY_PRINT(FIELD(Header), FIELD(PartitionIndex), FIELD(ScsiLun), STRING_FIELD(TypeOffset), STRING_FIELD(TargetNameOffset), STRING_FIELD(OptionsOffset));
1401
1402 } LX_MINI_INIT_MOUNT_MESSAGE, *PLX_MINI_INIT_MOUNT_MESSAGE;
1403
1404 using PCLX_MINI_INIT_MOUNT_MESSAGE = const LX_MINI_INIT_MOUNT_MESSAGE*;
1405
1406 typedef struct _LX_MINI_INIT_UNMOUNT_MESSAGE
1407 {
1408 static inline auto Type = LxMiniInitMessageUnmount;
1409
1410 MESSAGE_HEADER Header;
1411 char Buffer[];
1412
1413 PRETTY_PRINT(FIELD(Header), BUFFER_FIELD(Buffer));
1414 } LX_MINI_INIT_UNMOUNT_MESSAGE, *PLX_MINI_INIT_UNMOUNT_MESSAGE;
1415
1416 typedef struct _LX_MINI_INIT_DETACH_MESSAGE
1417 {
1418 static inline auto Type = LxMiniInitMessageDetach;
1419
1420 MESSAGE_HEADER Header;
1421 unsigned int ScsiLun;
1422
1423 PRETTY_PRINT(FIELD(Header), FIELD(ScsiLun));
1424 } LX_MINI_INIT_DETACH_MESSAGE, *PLX_MINI_INIT_DETACH_MESSAGE;
1425
1426 using PCLX_MINI_INIT_UNMOUNT_MESSAGE = const LX_MINI_INIT_UNMOUNT_MESSAGE*;
1427
1428 typedef enum _LX_MINI_MOUNT_STEP
1429 {
1430 LxMiniInitMountStepNone = 0,
1431 LxMiniInitMountStepFindDevice = 0x1,
1432 LxMiniInitMountStepFindPartition = 0x2,
1433 LxMiniInitMountStepMount = 0x3,
1434 LxMiniInitMountStepUnmount = 0x4,
1435 LxMiniInitMountStepRmDir = 0x5,
1436 LxMiniInitMountStepDetectFilesystem = 0x6,
1437 } LX_MINI_MOUNT_STEP,
1438 *PLX_MINI_MOUNT_STEP;
1439
1440 typedef struct _LX_MINI_INIT_MOUNT_RESULT_MESSAGE
1441 {
1442 static inline auto Type = LxMiniInitMessageMountStatus;
1443
1444 MESSAGE_HEADER Header;
1445 int Result;
1446 LX_MINI_MOUNT_STEP FailureStep;
1447
1448 PRETTY_PRINT(FIELD(Header), FIELD(Result), FIELD(FailureStep));
1449
1450 } LX_MINI_INIT_MOUNT_RESULT_MESSAGE, *PLX_MINI_INIT_MOUNT_RESULT_MESSAGE;
1451
1452 using PCLX_MINI_INIT_MOUNT_RESULT_MESSAGE = const LX_MINI_INIT_MOUNT_RESULT_MESSAGE*;
1453
1454 typedef struct _LX_INIT_GUEST_CAPABILITIES
1455 {
1456 static inline auto Type = LxMiniInitMessageGuestCapabilities;
1457
1458 MESSAGE_HEADER Header;
1459 bool SeccompAvailable;
1460 uint64_t HvPciSwiotlbBase;
1461 uint64_t HvPciSwiotlbSize;
1462 char Buffer[]; // Contains the kernel version string
1463
1464 PRETTY_PRINT(FIELD(Header), FIELD(SeccompAvailable), FIELD(HvPciSwiotlbBase), FIELD(HvPciSwiotlbSize), BUFFER_FIELD(Buffer));
1465 } LX_INIT_GUEST_CAPABILITIES, *PLX_INIT_GUEST_CAPABILITIES;
1466
1467 typedef struct _LX_MINI_INIT_WAIT_FOR_PMEM_DEVICE_MESSAGE
1468 {
1469 static inline auto Type = LxMiniInitMessageWaitForPmemDevice;
1470 using TResponse = RESULT_MESSAGE<int32_t>;
1471
1472 MESSAGE_HEADER Header;
1473 unsigned int PmemId;
1474
1475 PRETTY_PRINT(FIELD(Header), FIELD(PmemId));
1476 } LX_MINI_INIT_WAIT_FOR_PMEM_DEVICE_MESSAGE, *PLX_MINI_INIT_WAIT_FOR_PMEM_DEVICE_MESSAGE;
1477
1478 typedef struct _LX_MINI_INIT_CHILD_EXIT_MESSAGE
1479 {
1480 static inline auto Type = LxMiniInitMessageChildExit;
1481
1482 MESSAGE_HEADER Header;
1483 unsigned int ChildPid;
1484
1485 PRETTY_PRINT(FIELD(Header), FIELD(ChildPid));
1486 } LX_MINI_INIT_CHILD_EXIT_MESSAGE, *PLX_MINI_INIT_CHILD_EXIT_MESSAGE;
1487
1488 typedef struct _LX_MINI_INIT_MOUNT_FOLDER_MESSAGE
1489 {
1490 static inline auto Type = LxMiniInitMountFolder;
1491 using TResponse = RESULT_MESSAGE<int32_t>;
1492
1493 MESSAGE_HEADER Header;
1494 bool ReadOnly;
1495 unsigned int PathIndex;
1496 unsigned int NameIndex;
1497 char Buffer[];
1498
1499 PRETTY_PRINT(FIELD(Header), FIELD(ReadOnly), STRING_FIELD(PathIndex), STRING_FIELD(NameIndex));
1500 } LX_MINI_INIT_MOUNT_FOLDER_MESSAGE, *PLX_MINI_INIT_MOUNT_FOLDER_MESSAGE;
1501
1502 typedef struct _LX_MINI_INIT_RESIZE_DISTRIBUTION_RESPONSE
1503 {
1504 static inline auto Type = LxMiniInitMessageResizeDistributionResponse;
1505
1506 MESSAGE_HEADER Header;
1507 uint32_t ResponseCode;
1508
1509 PRETTY_PRINT(FIELD(Header), FIELD(ResponseCode));
1510 } LX_MINI_INIT_RESIZE_DISTRIBUTION_RESPONSE, *PLX_MINI_INIT_RESIZE_DISTRIBUTION_RESPONSE;
1511
1512 typedef struct _LX_MINI_INIT_RESIZE_DISTRIBUTION_MESSAGE
1513 {
1514 static inline auto Type = LxMiniInitMessageResizeDistribution;
1515
1516 MESSAGE_HEADER Header;
1517 unsigned int ScsiLun;
1518 uint64_t NewSize;
1519
1520 PRETTY_PRINT(FIELD(Header), FIELD(ScsiLun), FIELD(NewSize));
1521 } LX_MINI_INIT_RESIZE_DISTRIBUTION_MESSAGE, *PLX_MINI_INIT_RESIZE_DISTRIBUTION_MESSAGE;
1522
1523 typedef struct _LX_MINI_INIT_TRIM_DISTRIBUTION_RESPONSE
1524 {
1525 static inline auto Type = LxMiniInitMessageTrimDistributionResponse;
1526
1527 MESSAGE_HEADER Header;
1528 uint32_t ResponseCode;
1529
1530 PRETTY_PRINT(FIELD(Header), FIELD(ResponseCode));
1531 } LX_MINI_INIT_TRIM_DISTRIBUTION_RESPONSE, *PLX_MINI_INIT_TRIM_DISTRIBUTION_RESPONSE;
1532
1533 typedef struct _LX_MINI_INIT_TRIM_DISTRIBUTION_MESSAGE
1534 {
1535 static inline auto Type = LxMiniInitMessageTrimDistribution;
1536
1537 MESSAGE_HEADER Header;
1538 unsigned int ScsiLun;
1539
1540 PRETTY_PRINT(FIELD(Header), FIELD(ScsiLun));
1541 } LX_MINI_INIT_TRIM_DISTRIBUTION_MESSAGE, *PLX_MINI_INIT_TRIM_DISTRIBUTION_MESSAGE;
1542
1543 struct CREATE_PROCESS_MESSAGE
1544 {
1545 static inline auto Type = LxInitCreateProcess;
1546
1547 MESSAGE_HEADER Header;
1548 unsigned int PathIndex;
1549 unsigned int CommandLineIndex;
1550 char Buffer[];
1551
1552 PRETTY_PRINT(FIELD(Header), STRING_FIELD(PathIndex), STRING_FIELD(CommandLineIndex));
1553 };
1554
1555 struct EJECT_VHD_MESSAGE
1556 {
1557 static inline auto Type = LxMiniInitMessageEjectVhd;
1558 using TResponse = RESULT_MESSAGE<int32_t>;
1559
1560 MESSAGE_HEADER Header;
1561 uint32_t Lun;
1562
1563 PRETTY_PRINT(FIELD(Header), FIELD(Lun));
1564 };
1565
1566 typedef enum _LX_MINI_CREATE_INSTANCE_STEP
1567 {
1568 LxInitCreateInstanceStepNone = 0,
1569 LxInitCreateInstanceStepFormatDisk = 0x1,
1570 LxInitCreateInstanceStepMountDisk = 0x2,
1571 LxInitCreateInstanceStepLaunchSystemDistro = 0x3,
1572 LxInitCreateInstanceStepLaunchInit = 0x3,
1573 LxInitCreateInstanceStepRunTar = 0x4
1574 } LX_MINI_CREATE_INSTANCE_STEP,
1575 *PLX_MINI_CREATE_INSTANCE_STEP;
1576
1577 typedef struct _LX_MINI_INIT_CREATE_INSTANCE_RESULT
1578 {
1579 static inline auto Type = LxMiniInitMessageCreateInstanceResult;
1580
1581 MESSAGE_HEADER Header;
1582 int Result;
1583 _LX_MINI_CREATE_INSTANCE_STEP FailureStep;
1584 uint64_t Pid;
1585 uint32_t ConnectPort;
1586 unsigned int WarningsOffset;
1587 char Buffer[];
1588
1589 PRETTY_PRINT(FIELD(Header), FIELD(Result), FIELD(FailureStep), FIELD(Pid), FIELD(ConnectPort), STRING_FIELD(WarningsOffset));
1590 } LX_MINI_INIT_CREATE_INSTANCE_RESULT, *P_LX_MINI_INIT_CREATE_INSTANCE_RESULT;
1591
1592 struct WSLC_ERROR
1593 {
1594 static inline auto Type = LxMessageWSLCError;
1595 MESSAGE_HEADER Header;
1596 int Errno{};
1597 PRETTY_PRINT(FIELD(Header), FIELD(Errno));
1598 };
1599
1600 struct WSLC_GET_DISK_RESULT
1601 {
1602 static inline auto Type = LxMessageWSLCGetDiskResult;
1603
1604 DECLARE_MESSAGE_CTOR(WSLC_GET_DISK_RESULT);
1605
1606 MESSAGE_HEADER Header;
1607 unsigned int Result{};
1608 char Buffer[];
1609
1610 PRETTY_PRINT(FIELD(Header), FIELD(Result), FIELD(Buffer));
1611 };
1612
1613 struct WSLC_GET_DISK
1614 {
1615 static inline auto Type = LxMessageWSLCGetDisk;
1616 using TResponse = WSLC_GET_DISK_RESULT;
1617
1618 DECLARE_MESSAGE_CTOR(WSLC_GET_DISK);
1619
1620 MESSAGE_HEADER Header;
1621 unsigned int ScsiLun{};
1622
1623 PRETTY_PRINT(FIELD(Header), FIELD(ScsiLun));
1624 };
1625
1626 struct WSLC_LISTDIR_RESULT
1627 {
1628 static inline auto Type = LxMessageWSLCListDirResult;
1629
1630 DECLARE_MESSAGE_CTOR(WSLC_LISTDIR_RESULT);
1631
1632 MESSAGE_HEADER Header;
1633 int Result{};
1634 unsigned int EntriesIndex{};
1635 char Buffer[];
1636
1637 PRETTY_PRINT(FIELD(Header), FIELD(Result), STRING_ARRAY_FIELD(EntriesIndex));
1638 };
1639
1640 struct WSLC_LISTDIR
1641 {
1642 static inline auto Type = LxMessageWSLCListDir;
1643 using TResponse = WSLC_LISTDIR_RESULT;
1644
1645 DECLARE_MESSAGE_CTOR(WSLC_LISTDIR);
1646
1647 MESSAGE_HEADER Header;
1648 char Buffer[];
1649
1650 PRETTY_PRINT(FIELD(Header), FIELD(Buffer));
1651 };
1652
1653 struct WSLC_MOUNT_RESULT
1654 {
1655 static inline auto Type = LxMessageWSLCMountResult;
1656 MESSAGE_HEADER Header{};
1657 int Result{};
1658
1659 PRETTY_PRINT(FIELD(Header), FIELD(Result));
1660 };
1661
1662 struct WSLC_MOUNT
1663 {
1664 static inline auto Type = LxMessageWSLCMount;
1665 using TResponse = WSLC_MOUNT_RESULT;
1666
1667 DECLARE_MESSAGE_CTOR(WSLC_MOUNT);
1668
1669 MESSAGE_HEADER Header{};
1670 unsigned int SourceIndex{};
1671 unsigned int DestinationIndex{};
1672 unsigned int TypeIndex{};
1673 unsigned int OptionsIndex{};
1674 unsigned int Flags{};
1675
1676 enum MountType : uint8_t
1677 {
1678 None,
1679 ReadOnly = 1,
1680 Chroot = 2,
1681 OverlayFs = 4
1682 };
1683
1684 char Buffer[];
1685
1686 PRETTY_PRINT(FIELD(Header), STRING_FIELD(SourceIndex), STRING_FIELD(DestinationIndex), STRING_FIELD(TypeIndex), STRING_FIELD(OptionsIndex));
1687 };
1688
1689 struct WSLC_MOUNT_VIRTIOFS
1690 {
1691 static inline auto Type = LxMessageWSLCMountVirtioFs;
1692 using TResponse = WSLC_MOUNT_RESULT;
1693
1694 DECLARE_MESSAGE_CTOR(WSLC_MOUNT_VIRTIOFS);
1695
1696 MESSAGE_HEADER Header{};
1697 unsigned int SourceIndex{};
1698 unsigned int DestinationIndex{};
1699 unsigned int TypeIndex{};
1700 unsigned int OptionsIndex{};
1701 unsigned int Flags{};
1702 unsigned int ChildNameIndex{};
1703 char Buffer[];
1704
1705 PRETTY_PRINT(FIELD(Header), STRING_FIELD(SourceIndex), STRING_FIELD(DestinationIndex), STRING_FIELD(TypeIndex), STRING_FIELD(OptionsIndex), STRING_FIELD(ChildNameIndex));
1706 };
1707
1708 struct WSLC_MOUNT_MODULES
1709 {
1710 static inline auto Type = LxMessageWSLCMountModules;
1711 using TResponse = WSLC_MOUNT_RESULT;
1712
1713 DECLARE_MESSAGE_CTOR(WSLC_MOUNT_MODULES);
1714
1715 MESSAGE_HEADER Header{};
1716 unsigned int SourceIndex{};
1717 char Buffer[];
1718
1719 PRETTY_PRINT(FIELD(Header), STRING_FIELD(SourceIndex));
1720 };
1721
1722 struct WSLC_EXEC
1723 {
1724 static inline auto Type = LxMessageWSLCExec;
1725 using TResponse = RESULT_MESSAGE<uint32_t>;
1726
1727 DECLARE_MESSAGE_CTOR(WSLC_EXEC);
1728
1729 MESSAGE_HEADER Header;
1730 unsigned int ExecutableIndex = 0;
1731 unsigned int CommandLineIndex = 0;
1732 unsigned int EnvironmentIndex = 0;
1733 unsigned int CurrentDirectoryIndex = 0;
1734 unsigned int FdIndex = 0;
1735
1736 char Buffer[];
1737
1738 PRETTY_PRINT(
1739 FIELD(Header),
1740 STRING_FIELD(ExecutableIndex),
1741 STRING_FIELD(CurrentDirectoryIndex),
1742 FIELD(FdIndex),
1743 STRING_ARRAY_FIELD(CommandLineIndex),
1744 STRING_ARRAY_FIELD(EnvironmentIndex));
1745 };
1746 struct WSLC_FORK_RESULT
1747 {
1748 static inline auto Type = LxMessageWSLCForkResult;
1749 using TResponse = RESULT_MESSAGE<uint32_t>;
1750
1751 DECLARE_MESSAGE_CTOR(WSLC_FORK_RESULT)
1752
1753 MESSAGE_HEADER Header;
1754 uint32_t Port = 0;
1755 int32_t Pid = -1;
1756 int32_t PtyMasterFd = -1;
1757 PRETTY_PRINT(FIELD(Header), FIELD(Pid), FIELD(Port), FIELD(PtyMasterFd));
1758 };
1759
1760 struct WSLC_FORK
1761 {
1762 static inline auto Type = LxMessageWSLCFork;
1763 using TResponse = WSLC_FORK_RESULT;
1764
1765 enum ForkType : uint8_t
1766 {
1767 Invalid,
1768 Process,
1769 Thread,
1770 Pty
1771 };
1772
1773 DECLARE_MESSAGE_CTOR(WSLC_FORK);
1774
1775 MESSAGE_HEADER Header;
1776 ForkType ForkType = Invalid;
1777 uint16_t TtyColumns = 0;
1778 uint16_t TtyRows = 0;
1779 PRETTY_PRINT(FIELD(Header), FIELD(ForkType), FIELD(TtyColumns), FIELD(TtyRows));
1780 };
1781
1782 struct WSLC_TTY_RELAY
1783 {
1784 static inline auto Type = LxMessageWSLCRelayTty;
1785 using TResponse = WSLC_FORK_RESULT;
1786
1787 DECLARE_MESSAGE_CTOR(WSLC_TTY_RELAY);
1788
1789 MESSAGE_HEADER Header;
1790 int32_t TtyMaster{};
1791 int32_t Socket{};
1792 int32_t TtyControl{};
1793
1794 PRETTY_PRINT(FIELD(Header), FIELD(TtyMaster), FIELD(Socket), FIELD(TtyControl));
1795 };
1796
1797 struct WSLC_ACCEPT
1798 {
1799 static inline auto Type = LxMessageWSLCAccept;
1800 using TResponse = RESULT_MESSAGE<uint32_t>;
1801 DECLARE_MESSAGE_CTOR(WSLC_ACCEPT);
1802
1803 MESSAGE_HEADER Header;
1804 int32_t Fd = -1; // TODO: multiple at once
1805 PRETTY_PRINT(FIELD(Header), FIELD(Fd));
1806 };
1807
1808 struct WSLC_CONNECT
1809 {
1810 static inline auto Type = LxMessageWSLCConnect;
1811 using TResponse = RESULT_MESSAGE<int32_t>;
1812 DECLARE_MESSAGE_CTOR(WSLC_CONNECT);
1813
1814 MESSAGE_HEADER Header;
1815 uint32_t HostPort{};
1816 PRETTY_PRINT(FIELD(Header), FIELD(HostPort));
1817 };
1818
1819 struct WSLC_SIGNAL
1820 {
1821 static inline auto Type = LxMessageWSLCSignal;
1822 using TResponse = RESULT_MESSAGE<int32_t>;
1823
1824 DECLARE_MESSAGE_CTOR(WSLC_SIGNAL);
1825
1826 MESSAGE_HEADER Header;
1827 int32_t Pid = -1;
1828 int32_t Signal = -1;
1829
1830 PRETTY_PRINT(FIELD(Header), FIELD(Pid), FIELD(Signal));
1831 };
1832
1833 struct WSLC_MAP_PORT
1834 {
1835 static inline auto Type = LxMessageWSLCMapPort;
1836 using TResponse = RESULT_MESSAGE<uint32_t>;
1837
1838 DECLARE_MESSAGE_CTOR(WSLC_MAP_PORT);
1839 MESSAGE_HEADER Header{};
1840 uint16_t WindowsPort{};
1841 uint16_t LinuxPort{};
1842 uint32_t AddressFamily{};
1843 bool Stop{};
1844
1845 PRETTY_PRINT(FIELD(Header));
1846 };
1847
1848 struct WSLC_CONNECT_RELAY
1849 {
1850 static inline auto Type = LxMessageWSLCConnectRelay;
1851 using TResponse = RESULT_MESSAGE<uint32_t>;
1852
1853 DECLARE_MESSAGE_CTOR(WSLC_CONNECT_RELAY);
1854 MESSAGE_HEADER Header;
1855 uint16_t Port{};
1856 uint16_t Family{};
1857 PRETTY_PRINT(FIELD(Header), FIELD(Port), FIELD(Family));
1858 };
1859
1860 struct WSLC_PORT_RELAY
1861 {
1862 static inline auto Type = LxMessageWSLCPortRelay;
1863 using TResponse = RESULT_MESSAGE<uint32_t>;
1864
1865 DECLARE_MESSAGE_CTOR(WSLC_PORT_RELAY);
1866 MESSAGE_HEADER Header;
1867
1868 PRETTY_PRINT(FIELD(Header));
1869 };
1870
1871 struct WSLC_UNMOUNT
1872 {
1873 static inline auto Type = LxMessageWSLCUnmount;
1874 using TResponse = RESULT_MESSAGE<int32_t>;
1875
1876 DECLARE_MESSAGE_CTOR(WSLC_UNMOUNT);
1877 MESSAGE_HEADER Header;
1878
1879 char Buffer[];
1880
1881 PRETTY_PRINT(FIELD(Header), FIELD(Buffer));
1882 };
1883
1884 struct WSLC_DETACH
1885 {
1886 static inline auto Type = LxMessageWSLCDetach;
1887 using TResponse = RESULT_MESSAGE<int32_t>;
1888
1889 DECLARE_MESSAGE_CTOR(WSLC_DETACH);
1890 MESSAGE_HEADER Header;
1891 unsigned int Lun{};
1892
1893 PRETTY_PRINT(FIELD(Header), FIELD(Lun));
1894 };
1895
1896 struct WSLC_TERMINAL_CHANGED
1897 {
1898 DECLARE_MESSAGE_CTOR(WSLC_TERMINAL_CHANGED);
1899
1900 static inline auto Type = LxMessageWSLCTerminalChanged;
1901
1902 MESSAGE_HEADER Header;
1903 unsigned short Rows{};
1904 unsigned short Columns{};
1905
1906 PRETTY_PRINT(FIELD(Header), FIELD(Rows), FIELD(Columns));
1907 };
1908
1909 struct WSLC_WATCH_PROCESSES
1910 {
1911 DECLARE_MESSAGE_CTOR(WSLC_WATCH_PROCESSES);
1912
1913 static inline auto Type = LxMessageWSLCWatchProcesses;
1914
1915 MESSAGE_HEADER Header;
1916
1917 PRETTY_PRINT(FIELD(Header));
1918 };
1919
1920 struct WSLC_PROCESS_EXITED
1921 {
1922 DECLARE_MESSAGE_CTOR(WSLC_PROCESS_EXITED);
1923
1924 MESSAGE_HEADER Header;
1925 static inline auto Type = LxMessageWSLCProcessExited;
1926 uint32_t Pid{};
1927 uint32_t Code{};
1928 bool Signaled{};
1929
1930 PRETTY_PRINT(FIELD(Header), FIELD(Pid), FIELD(Code), FIELD(Signaled));
1931 };
1932
1933 struct WSLC_UNIX_CONNECT
1934 {
1935 static inline auto Type = LxMessageWSLCUnixConnect;
1936 using TResponse = RESULT_MESSAGE<int32_t>;
1937
1938 DECLARE_MESSAGE_CTOR(WSLC_UNIX_CONNECT);
1939
1940 MESSAGE_HEADER Header;
1941 unsigned int PathOffset{};
1942 char Buffer[];
1943
1944 PRETTY_PRINT(FIELD(Header), STRING_FIELD(PathOffset));
1945 };
1946
1947 struct WSLC_GET_GUEST_CAPABILITIES_RESULT
1948 {
1949 static inline auto Type = LxMessageWSLCGetGuestCapabilitiesResult;
1950
1951 MESSAGE_HEADER Header{};
1952 uint64_t HvPciSwiotlbBase{};
1953 uint64_t HvPciSwiotlbSize{};
1954
1955 PRETTY_PRINT(FIELD(Header), FIELD(HvPciSwiotlbBase), FIELD(HvPciSwiotlbSize));
1956 };
1957
1958 struct WSLC_GET_GUEST_CAPABILITIES
1959 {
1960 static inline auto Type = LxMessageWSLCGetGuestCapabilities;
1961 using TResponse = WSLC_GET_GUEST_CAPABILITIES_RESULT;
1962
1963 DECLARE_MESSAGE_CTOR(WSLC_GET_GUEST_CAPABILITIES);
1964
1965 MESSAGE_HEADER Header{};
1966
1967 PRETTY_PRINT(FIELD(Header));
1968 };
1969
1970 struct WSLC_WRITE_FILE
1971 {
1972 static inline auto Type = LxMessageWSLCWriteFile;
1973 using TResponse = RESULT_MESSAGE<int32_t>;
1974
1975 DECLARE_MESSAGE_CTOR(WSLC_WRITE_FILE);
1976 MESSAGE_HEADER Header;
1977 unsigned int PathIndex;
1978 unsigned int ContentIndex;
1979 unsigned int ContentLength;
1980 int OpenFlags;
1981 int Permissions;
1982 char Buffer[];
1983
1984 // Buffer content excluded from PRETTY_PRINT so callers can pass sensitive payloads.
1985 PRETTY_PRINT(FIELD(Header), FIELD(OpenFlags), FIELD(Permissions));
1986 };
1987
1988 typedef struct _LX_MINI_INIT_IMPORT_RESULT
1989 {
1990 static inline auto Type = LxMiniInitMessageImportResult;
1991
1992 MESSAGE_HEADER Header;
1993 int Result;
1994 bool ValidDistribution;
1995 unsigned int FlavorIndex;
1996 unsigned int VersionIndex;
1997 unsigned int ShortcutIconIndex;
1998 unsigned int ShortcutIconSize;
1999 unsigned int DefaultNameIndex;
2000 unsigned int TerminalProfileIndex;
2001 unsigned int TerminalProfileSize;
2002 bool GenerateTerminalProfile;
2003 bool GenerateShortcut;
2004 char Buffer[];
2005
2006 PRETTY_PRINT(FIELD(Header), FIELD(Result), STRING_FIELD(FlavorIndex), STRING_FIELD(VersionIndex), STRING_FIELD(DefaultNameIndex), FIELD(ShortcutIconIndex), FIELD(TerminalProfileIndex));
2007 } LX_MINI_INIT_IMPORT_RESULT, *PLX_MINI_INIT_IMPORT_RESULT;
2008
2009 typedef struct _LX_INIT_OOBE_RESULT
2010 {
2011 static inline auto Type = LxInitOobeResult;
2012
2013 MESSAGE_HEADER Header;
2014 uint32_t Result;
2015 int64_t DefaultUid;
2016
2017 PRETTY_PRINT(FIELD(Header), FIELD(Result), FIELD(DefaultUid));
2018 } LX_INIT_OOBE_RESULT, *PLX_INIT_OOBE_RESULT;
2019
2020 typedef struct _LX_INIT_QUERY_VM_ID
2021 {
2022 static inline auto Type = LxInitMessageQueryVmId;
2023
2024 MESSAGE_HEADER Header;
2025 char Buffer[];
2026
2027 PRETTY_PRINT(FIELD(Header), BUFFER_FIELD(Buffer));
2028 } LX_INIT_QUERY_VM_ID, *PLX_INIT_QUERY_VM_ID;
2029
2030 template <>
2031 struct std::formatter<LX_MESSAGE_TYPE, char>
2032 {
2033 template <typename TCtx>
2034 static constexpr auto parse(TCtx& ctx)
2035 {
2036 return ctx.begin();
2037 }
2038
2039 template <typename TCtx>
2040 auto format(LX_MESSAGE_TYPE str, TCtx& ctx) const
2041 {
2042 return std::format_to(ctx.out(), "{}", ToString(str));
2043 }
2044 };
2045
2046 template <>
2047 struct std::formatter<LX_MINI_INIT_MOUNT_DEVICE_TYPE, char>
2048 {
2049 template <typename TCtx>
2050 static constexpr auto parse(TCtx& ctx)
2051 {
2052 return ctx.begin();
2053 }
2054
2055 template <typename TCtx>
2056 auto format(LX_MINI_INIT_MOUNT_DEVICE_TYPE str, TCtx& ctx) const
2057 {
2058 return std::format_to(ctx.out(), "{}", static_cast<int>(str));
2059 }
2060 };