-
Notifications
You must be signed in to change notification settings - Fork 1.7k
Expand file tree
/
Copy pathwslc.idl
More file actions
762 lines (646 loc) · 25 KB
/
wslc.idl
File metadata and controls
762 lines (646 loc) · 25 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
/*++
Copyright (c) Microsoft Corporation. All rights reserved.
Module Name:
wslc.idl
Abstract:
This file contains the WSLC-related COM object definitions.
--*/
import "unknwn.idl";
import "wtypes.idl";
cpp_quote("#ifdef __cplusplus")
cpp_quote("class DECLSPEC_UUID(\"a9b7a1b9-0671-405c-95f1-e0612cb4ce8f\") WSLCSessionManager;")
cpp_quote("class DECLSPEC_UUID(\"9FCD2067-9FC6-4EFA-9EB0-698169EBF7D3\") WSLCSessionFactory;")
cpp_quote("#endif")
#define WSLC_MAX_CONTAINER_NAME_LENGTH 255
#define WSLC_MAX_IMAGE_NAME_LENGTH 255
#define WSLC_MAX_VOLUME_NAME_LENGTH 255
#define WSLC_CONTAINER_ID_LENGTH 64
#define WSLC_MAX_BINDING_ADDRESS_LENGTH 45
#define WSLC_EPHEMERAL_PORT 0
cpp_quote("#define WSLC_MAX_CONTAINER_NAME_LENGTH 255")
cpp_quote("#define WSLC_MAX_IMAGE_NAME_LENGTH 255")
cpp_quote("#define WSLC_MAX_VOLUME_NAME_LENGTH 255")
cpp_quote("#define WSLC_CONTAINER_ID_LENGTH 64")
cpp_quote("#define WSLC_MAX_BINDING_ADDRESS_LENGTH 45")
cpp_quote("#define WSLC_EPHEMERAL_PORT 0")
typedef
struct _WSLCVersion {
ULONG Major;
ULONG Minor;
ULONG Revision;
} WSLCVersion;
typedef enum _WSLCVirtualMachineTerminationReason
{
WSLCVirtualMachineTerminationReasonUnknown,
WSLCVirtualMachineTerminationReasonShutdown,
WSLCVirtualMachineTerminationReasonCrashed,
} WSLCVirtualMachineTerminationReason;
typedef enum _WSLCFD
{
WSLCFDStdin = 0,
WSLCFDStdout = 1,
WSLCFDStderr = 2,
WSLCFDTty = 3,
} WSLCFD;
typedef enum _WSLCSignal
{
WSLCSignalNone = 0,
WSLCSignalSIGHUP = 1,
WSLCSignalSIGINT = 2,
WSLCSignalSIGQUIT = 3,
WSLCSignalSIGILL = 4,
WSLCSignalSIGTRAP = 5,
WSLCSignalSIGABRT = 6,
WSLCSignalSIGIOT = 6, // SIGABRT and SIGIOT are equivalent.
WSLCSignalSIGBUS = 7,
WSLCSignalSIGFPE = 8,
WSLCSignalSIGKILL = 9,
WSLCSignalSIGUSR1 = 10,
WSLCSignalSIGSEGV = 11,
WSLCSignalSIGUSR2 = 12,
WSLCSignalSIGPIPE = 13,
WSLCSignalSIGALRM = 14,
WSLCSignalSIGTERM = 15,
WSLCSignalSIGTKFLT = 16,
WSLCSignalSIGCHLD = 17,
WSLCSignalSIGCONT = 18,
WSLCSignalSIGSTOP = 19,
WSLCSignalSIGTSTP = 20,
WSLCSignalSIGTTIN = 21,
WSLCSignalSIGTTOU = 22,
WSLCSignalSIGURG = 23,
WSLCSignalSIGXCPU = 24,
WSLCSignalSIGXFSZ = 25,
WSLCSignalSIGVTALRM = 26,
WSLCSignalSIGPROF = 27,
WSLCSignalSIGWINCH = 28,
WSLCSignalSIGIO = 29,
WSLCSignalSIGPOLL = 29, // SIGIO and SIGPOLL are equivalent.
WSLCSignalSIGPWR = 30,
WSLCSignalSIGSYS = 31
} WSLCSignal;
[
uuid(7BC4E198-6531-4FA6-ADE2-5EF3D2A04DFE),
pointer_default(unique),
object
]
interface ITerminationCallback : IUnknown
{
HRESULT OnTermination(WSLCVirtualMachineTerminationReason Reason, LPCWSTR Details);
};
[
uuid(5038842F-53DB-4F30-A6D0-A41B02C94AC1),
pointer_default(unique),
object
]
interface IProgressCallback : IUnknown
{
HRESULT OnProgress(LPCSTR Status, LPCSTR Id, ULONGLONG Current, ULONGLONG Total);
};
typedef struct _WSLCImageInformation
{
char Image[WSLC_MAX_IMAGE_NAME_LENGTH + 1];
char Hash[256];
char Digest[256];
ULONGLONG Size;
LONGLONG Created; // Unix timestamp
char ParentId[256];
} WSLCImageInformation;
typedef enum _WSLCListImagesFlags
{
WSLCListImagesFlagsNone = 0,
WSLCListImagesFlagsAll = 1, // Show all images (default hides intermediate images)
WSLCListImagesFlagsDigests = 2, // Include digest information
WSLCListImagesFlagsDanglingTrue = 4, // Show only dangling images (untagged)
WSLCListImagesFlagsDanglingFalse = 8, // Show only non-dangling images (tagged)
// Note: If neither dangling flag is set, no dangling filter is passed (default: both).
} WSLCListImagesFlags;
cpp_quote("#define WSLCListImagesFlagsValid (WSLCListImagesFlagsAll | WSLCListImagesFlagsDigests | WSLCListImagesFlagsDanglingTrue | WSLCListImagesFlagsDanglingFalse)")
cpp_quote("DEFINE_ENUM_FLAG_OPERATORS(WSLCListImagesFlags);")
typedef struct _WSLCLabelInformation
{
[string] LPSTR Key;
[string] LPSTR Value;
} WSLCLabelInformation;
typedef struct _WSLCLabel
{
[string] LPCSTR Key;
[string] LPCSTR Value;
} WSLCLabel;
typedef struct _WSLCListImageOptions
{
DWORD Flags; // WSLCListImagesFlags (can combine with bitwise OR)
[unique] LPCSTR Reference; // Filter by reference (name[:tag])
[unique] LPCSTR Before; // Filter: show images created before this image
[unique] LPCSTR Since; // Filter: show images created since this image
[unique, size_is(LabelsCount)] const WSLCLabel* Labels;
ULONG LabelsCount;
} WSLCListImageOptions;
typedef enum _WSLCProcessFlags
{
WSLCProcessFlagsNone = 0,
WSLCProcessFlagsStdin = 1,
WSLCProcessFlagsTty = 2
} WSLCProcessFlags;
cpp_quote("#define WSLCProcessFlagsValid (WSLCProcessFlagsStdin | WSLCProcessFlagsTty)")
cpp_quote("DEFINE_ENUM_FLAG_OPERATORS(WSLCProcessFlags);")
typedef struct _WSLCStringArray
{
[unique, size_is(Count)] LPCSTR const* Values;
ULONG Count;
} WSLCStringArray;
typedef struct _WSLCProcessOptions
{
[unique] LPCSTR CurrentDirectory;
[unique] LPCSTR User;
WSLCStringArray CommandLine;
WSLCStringArray Environment;
WSLCProcessFlags Flags;
ULONG TtyRows; // Only needed when tty fd's are passed.
ULONG TtyColumns;
} WSLCProcessOptions;
typedef struct _WSLCNamedVolume
{
LPCSTR Name;
LPCSTR ContainerPath;
BOOL ReadOnly;
} WSLCNamedVolume;
typedef struct _WSLCVolume
{
LPCWSTR HostPath;
LPCSTR ContainerPath;
BOOL ReadOnly;
} WSLCVolume;
typedef struct _WSLCPortMapping
{
USHORT HostPort;
USHORT ContainerPort;
int Family;
int Protocol;
char BindingAddress[WSLC_MAX_BINDING_ADDRESS_LENGTH + 1];
} WSLCPortMapping;
typedef struct _WSLCTmpfsMount
{
LPCSTR Destination;
[unique] LPCSTR Options;
} WSLCTmpfsMount;
typedef enum _WSLCContainerNetworkType
{
WSLCContainerNetworkTypeNone = 0,
WSLCContainerNetworkTypeHost = 1,
WSLCContainerNetworkTypeBridged = 2,
// WSLCContainerNetworkTypeCustom = 3 // TODO: Implement when implementing custom networks
} WSLCContainerNetworkType;
typedef struct _WSLCContainerNetwork
{
WSLCContainerNetworkType ContainerNetworkType;
LPCSTR ContainerNetworkName;
} WSLCContainerNetwork;
typedef enum _WSLCContainerFlags
{
WSLCContainerFlagsNone = 0,
WSLCContainerFlagsRm = 1, // Delete the container when it exits. TODO: Implement.
WSLCContainerFlagsGpu = 2, // Enable GPU access. TODO: implement.
WSLCContainerFlagsInit = 4, // Run the container under an init process.
} WSLCContainerFlags;
cpp_quote("#define WSLCContainerFlagsValid (WSLCContainerFlagsRm | WSLCContainerFlagsGpu | WSLCContainerFlagsInit)")
cpp_quote("DEFINE_ENUM_FLAG_OPERATORS(WSLCContainerFlags);")
typedef enum _WSLCContainerStartFlags
{
WSLCContainerStartFlagsNone = 0,
WSLCContainerStartFlagsAttach = 1, // Attach stdio handles on start.
} WSLCContainerStartFlags;
cpp_quote("#define WSLCContainerStartFlagsValid (WSLCContainerStartFlagsAttach)")
cpp_quote("DEFINE_ENUM_FLAG_OPERATORS(WSLCContainerStartFlags);")
typedef struct _WSLCContainerOptions
{
LPCSTR Image;
[unique] LPCSTR Name;
WSLCStringArray Entrypoint;
WSLCProcessOptions InitProcessOptions;
[unique, size_is(VolumesCount)] WSLCVolume* Volumes;
ULONG VolumesCount;
[unique, size_is(PortsCount)] WSLCPortMapping* Ports;
ULONG PortsCount;
[unique, size_is(LabelsCount)] const WSLCLabel* Labels;
ULONG LabelsCount;
WSLCContainerFlags Flags;
WSLCSignal StopSignal;
// TODO: List specific GPU devices.
[unique] LPCSTR HostName;
[unique] LPCSTR DomainName;
WSLCStringArray DnsServers;
WSLCStringArray DnsSearchDomains;
WSLCStringArray DnsOptions;
ULONGLONG ShmSize;
WSLCContainerNetwork ContainerNetwork;
[unique, size_is(TmpfsCount)] const WSLCTmpfsMount* Tmpfs;
ULONG TmpfsCount;
[unique, size_is(NamedVolumesCount)] WSLCNamedVolume* NamedVolumes;
ULONG NamedVolumesCount;
} WSLCContainerOptions;
typedef enum _WSLCContainerState
{
WslcContainerStateInvalid = 0,
WslcContainerStateCreated = 1,
WslcContainerStateRunning = 2,
WslcContainerStateExited = 3,
WslcContainerStateDeleted = 4,
} WSLCContainerState;
typedef char WSLCContainerId[WSLC_CONTAINER_ID_LENGTH + 1] ;
typedef struct _WSLCContainerEntry
{
char Name[WSLC_MAX_CONTAINER_NAME_LENGTH + 1];
char Image[WSLC_MAX_IMAGE_NAME_LENGTH + 1];
WSLCContainerId Id;
ULONGLONG StateChangedAt;
ULONGLONG CreatedAt;
WSLCContainerState State;
} WSLCContainerEntry;
typedef struct _WSLCContainerPortMapping
{
WSLCContainerId Id;
WSLCPortMapping PortMapping;
} WSLCContainerPortMapping;
typedef [system_handle(sh_file)] HANDLE FILE_HANDLE;
typedef [system_handle(sh_pipe)] HANDLE PIPE_HANDLE;
typedef [system_handle(sh_socket)] HANDLE SOCKET_HANDLE;
typedef enum _WSLCHandleType
{
WSLCHandleTypeUnknown = 0,
WSLCHandleTypeFile = 1,
WSLCHandleTypePipe = 2,
WSLCHandleTypeSocket = 3
} WSLCHandleType;
typedef struct _WSLCHandle
{
WSLCHandleType Type;
[switch_type(WSLCHandleType), switch_is(Type)]
union
{
[case(WSLCHandleTypeFile)]
FILE_HANDLE File;
[case(WSLCHandleTypePipe)]
PIPE_HANDLE Pipe;
[case(WSLCHandleTypeSocket)]
SOCKET_HANDLE Socket;
[default];
} Handle;
} WSLCHandle;
typedef enum _WSLCProcessState
{
WslcProcessStateUnknown = 0,
WslcProcessStateRunning = 1,
WslcProcessStateExited = 2,
WslcProcessStateSignalled = 3
} WSLCProcessState;
[
uuid(1AD163CD-393D-4B33-83A2-8A3F3F23E608),
pointer_default(unique),
object
]
interface IWSLCProcess : IUnknown
{
HRESULT Signal([in] int Signal);
HRESULT GetExitEvent([out, system_handle(sh_event)] HANDLE* EventHandle);
HRESULT GetStdHandle([in] WSLCFD Fd, [out] WSLCHandle* Handle);
HRESULT GetFlags([out] WSLCProcessFlags* Flags);
HRESULT GetPid([out] int* Pid);
HRESULT GetState([out] WSLCProcessState* State, [out] int* Code);
HRESULT ResizeTty([in] ULONG Rows, [in] ULONG Columns);
// Note: the SDK can offer a convenience Wait() method, but that doesn't need to be part of the service API.
}
typedef enum _WSLCNetworkingMode
{
WSLCNetworkingModeNone,
WSLCNetworkingModeNAT,
WSLCNetworkingModeVirtioProxy
} WSLCNetworkingMode;
typedef enum _WSLCFeatureFlags
{
WslcFeatureFlagsNone = 0,
WslcFeatureFlagsDnsTunneling = 1,
WslcFeatureFlagsEarlyBootDmesg = 2,
WslcFeatureFlagsGPU = 4,
WslcFeatureFlagsVirtioFs = 8,
WslcFeatureFlagsDebug = 16,
} WSLCFeatureFlags;
cpp_quote("#define WSLCFeatureFlagsValid (WslcFeatureFlagsDnsTunneling | WslcFeatureFlagsEarlyBootDmesg | WslcFeatureFlagsGPU | WslcFeatureFlagsVirtioFs | WslcFeatureFlagsDebug)")
cpp_quote("DEFINE_ENUM_FLAG_OPERATORS(WSLCFeatureFlags);")
//
// IWSLCVirtualMachine - Interface representing a single VM instance.
// Operations are scoped to this VM. The VM ID is stored internally,
// so only the holder of this interface can operate on the VM.
//
[
uuid(B5E2D8F1-9A3C-4E6B-8D1F-7C4A2E9B6D3A),
pointer_default(unique),
object
]
interface IWSLCVirtualMachine : IUnknown
{
// Gets the VM ID.
HRESULT GetId([out, retval] GUID* VmId);
// Accepts a connect from mini_init in the VM.
HRESULT AcceptConnection([out, system_handle(sh_socket)] HANDLE* Socket);
// Configures networking engine with sockets from the user process.
// GnsSocket is required; DnsSocket is optional (NULL if DNS tunneling is disabled).
// The service duplicates the socket handles.
HRESULT ConfigureNetworking(
[in, system_handle(sh_socket)] HANDLE GnsSocket,
[in, system_handle(sh_socket), unique] HANDLE* DnsSocket);
// Attaches a VHD or VHDX disk to the VM.
// GrantVmAccess is called by the service before attaching.
// Returns the SCSI LUN assigned to the disk.
HRESULT AttachDisk([in] LPCWSTR Path, [in] BOOL ReadOnly, [out, retval] ULONG* Lun);
// Detaches a previously attached disk from the VM.
HRESULT DetachDisk([in] ULONG Lun);
// Adds a filesystem share (Plan9 or VirtioFS) accessible to the VM.
// Returns an instance GUID that can be used to remove the share.
HRESULT AddShare([in] LPCWSTR WindowsPath, [in] BOOL ReadOnly, [out, retval] GUID* ShareId);
// Removes a previously added filesystem share.
HRESULT RemoveShare([in] REFGUID ShareId);
// Maps a port via VirtioNetworking.
// For anonymous binds (HostPort == WSLC_EPHEMERAL_PORT), the networking engine allocates a host port
// and returns it in AllocatedHostPort.
// Protocol must be IPPROTO_TCP or IPPROTO_UDP.
// ListenAddress is the IP address to bind on (e.g. "127.0.0.1", "0.0.0.0", "::1").
HRESULT MapVirtioNetPort(
[in] USHORT HostPort,
[in] USHORT GuestPort,
[in] int Protocol,
[in] LPCSTR ListenAddress,
[out, retval] USHORT* AllocatedHostPort);
// Unmaps a port previously mapped via MapVirtioNetPort.
HRESULT UnmapVirtioNetPort(
[in] USHORT HostPort,
[in] USHORT GuestPort,
[in] int Protocol,
[in] LPCSTR ListenAddress);
}
typedef enum _WSLCSessionStorageFlags
{
WSLCSessionStorageFlagsNone = 0,
WSLCSessionStorageFlagsNoCreate = 1, // Open an existing storage path, but don't create a new one.
WSLCSessionStorageFlagsValid = WSLCSessionStorageFlagsNoCreate
} WSLCSessionStorageFlags;
cpp_quote("DEFINE_ENUM_FLAG_OPERATORS(WSLCSessionStorageFlags);")
// Settings for IWSLCSessionManager::CreateSession - full session configuration
typedef struct _WSLCSessionSettings {
LPCWSTR DisplayName;
LPCWSTR StoragePath;
ULONGLONG MaximumStorageSizeMb;
ULONG CpuCount;
ULONG MemoryMb;
ULONG BootTimeoutMs;
WSLCNetworkingMode NetworkingMode;
[unique] ITerminationCallback* TerminationCallback;
WSLCFeatureFlags FeatureFlags;
WSLCHandle DmesgOutput;
WSLCSessionStorageFlags StorageFlags;
// Below options are used for debugging purposes only.
[unique] LPCWSTR RootVhdOverride;
[unique] LPCSTR RootVhdTypeOverride;
} WSLCSessionSettings;
typedef enum _WSLCLogsFlags
{
WSLCLogsFlagsNone = 0,
WSLCLogsFlagsFollow = 1,
WSLCLogsFlagsTimestamps = 2,
} WSLCLogsFlags;
cpp_quote("#define WSLCLogsFlagsValid (WSLCLogsFlagsFollow | WSLCLogsFlagsTimestamps)")
cpp_quote("DEFINE_ENUM_FLAG_OPERATORS(WSLCLogsFlags);")
typedef enum _WSLCDeleteFlags
{
WSLCDeleteFlagsNone = 0,
WSLCDeleteFlagsForce = 1,
// TODO: Flags to remove anonymous volumes, bridge links, etc.
} WSLCDeleteFlags;
cpp_quote("#define WSLCDeleteFlagsValid (WSLCDeleteFlagsForce)")
cpp_quote("DEFINE_ENUM_FLAG_OPERATORS(WSLCDeleteFlags);")
[
uuid(7577FE8D-DE85-471E-B870-11669986F332),
pointer_default(unique),
object
]
interface IWSLCContainer : IUnknown
{
HRESULT Attach([in, unique] LPCSTR DetachKeys, [out] WSLCHandle* StdIn, [out] WSLCHandle* StdOut, [out] WSLCHandle* StdErr);
HRESULT Stop([in] WSLCSignal Signal, [in] LONG TimeoutSeconds);
HRESULT Start([in] WSLCContainerStartFlags Flags, [in, unique] LPCSTR DetachKeys);
HRESULT Delete([in] WSLCDeleteFlags Flags);
HRESULT Export([in] WSLCHandle TarHandle);
HRESULT GetState([out] WSLCContainerState* State);
HRESULT GetInitProcess([out] IWSLCProcess** Process);
HRESULT Exec([in, ref] const WSLCProcessOptions* Options, [in, unique] LPCSTR DetachKeys, [out] IWSLCProcess** Process);
HRESULT Inspect([out] LPSTR* Output);
HRESULT Logs([in] WSLCLogsFlags Flags, [out] WSLCHandle* Stdout, [out] WSLCHandle* Stderr, [in] ULONGLONG Since, [in] ULONGLONG Until, [in] ULONGLONG Tail);
HRESULT GetId([out, string] WSLCContainerId Id);
HRESULT GetName([out, string] LPSTR* Name);
HRESULT GetLabels([out, size_is(, *Count)] WSLCLabelInformation** Labels, [out] ULONG* Count);
HRESULT Kill([in] WSLCSignal Signal);
}
typedef enum _WSLCDeletedImageType
{
WSLCDeletedImageTypeDeleted = 0,
WSLCDeletedImageTypeUntagged = 1
} WSLCDeletedImageType;
typedef struct _WSLCDeletedImageInformation
{
char Image[WSLC_MAX_IMAGE_NAME_LENGTH + 1];
WSLCDeletedImageType Type;
} WSLCDeletedImageInformation;
typedef enum _WSLCDeleteImageFlags
{
WSLCDeleteImageFlagsNone = 0,
WSLCDeleteImageFlagsForce = 1,
WSLCDeleteImageFlagsNoPrune = 2,
} WSLCDeleteImageFlags;
cpp_quote("#define WSLCDeleteImageFlagsValid (WSLCDeleteImageFlagsForce | WSLCDeleteImageFlagsNoPrune)")
cpp_quote("DEFINE_ENUM_FLAG_OPERATORS(WSLCDeleteImageFlags);")
typedef struct _WSLCDeleteImageOptions
{
LPCSTR Image; // Image can be ID or Repo:Tag.
DWORD Flags; // WSLCDeleteImageFlags
// TODO: Platforms: a json array of OCI platform strings.
} WSLCDeleteImageOptions;
typedef struct _WSLCBuildImageOptions
{
LPCWSTR ContextPath;
WSLCHandle DockerfileHandle;
WSLCStringArray Tags;
WSLCStringArray BuildArgs; // KEY=VALUE pairs passed as --build-arg to docker.
BOOL Verbose; // Show all build progress including internal steps and all statuses.
} WSLCBuildImageOptions;
typedef struct _WSLCTagImageOptions
{
LPCSTR Image; // Source image name or ID.
LPCSTR Repo; // Target repository name.
LPCSTR Tag; // Target tag name.
} WSLCTagImageOptions;
typedef struct _WSLCVolumeOptions
{
LPCSTR Name;
LPCSTR Type;
[unique] LPCSTR Options;
} WSLCVolumeOptions;
typedef struct _WSLCVolumeInformation
{
char Name[WSLC_MAX_VOLUME_NAME_LENGTH + 1];
char Type[64];
} WSLCVolumeInformation;
typedef struct _WSLCContainerPruneFilter
{
LPCSTR Key;
[unique] LPCSTR Value;
BOOL Present;
} WSLCContainerPruneFilter;
typedef struct _WSLCPruneContainersResults
{
[unique, size_is(ContainersCount)] WSLCContainerId* Containers;
ULONG ContainersCount;
ULONGLONG SpaceReclaimed;
} WSLCPruneContainersResults;
typedef enum _WSLCSessionState
{
WSLCSessionStateRunning = 0,
WSLCSessionStateTerminated = 1
} WSLCSessionState;
// Settings for IWSLCSession::Initialize - passed from service to per-user process
typedef struct _WSLCSessionInitSettings
{
ULONG SessionId;
ULONG CreatorPid;
LPCWSTR DisplayName;
LPCWSTR StoragePath;
WSLCSessionStorageFlags StorageFlags;
ULONGLONG MaximumStorageSizeMb;
ULONG BootTimeoutMs;
WSLCNetworkingMode NetworkingMode;
WSLCFeatureFlags FeatureFlags;
[unique] LPCSTR RootVhdTypeOverride;
} WSLCSessionInitSettings;
[
uuid(EF0661E4-6364-40EA-B433-E2FDF11F3519),
pointer_default(unique),
object
]
interface IWSLCSession : IUnknown
{
HRESULT GetId([out] ULONG* Id);
HRESULT GetState([out] WSLCSessionState* State);
// Image management.
HRESULT PullImage([in] LPCSTR Image, [in, unique] LPCSTR RegistryAuthenticationInformation, [in, unique] IProgressCallback* ProgressCallback);
HRESULT BuildImage([in] const WSLCBuildImageOptions* Options, [in, unique] IProgressCallback* ProgressCallback, [in, unique, system_handle(sh_event)] HANDLE CancelEvent);
HRESULT LoadImage([in] WSLCHandle ImageHandle, [in, unique] IProgressCallback* ProgressCallback, [in] ULONGLONG ContentLength);
HRESULT ImportImage([in] WSLCHandle ImageHandle, [in] LPCSTR ImageName, [in, unique] IProgressCallback* ProgressCallback, [in] ULONGLONG ContentLength);
HRESULT SaveImage([in] WSLCHandle OutputHandle, [in] LPCSTR ImageNameOrID, [in, unique] IProgressCallback * ProgressCallback, [in, unique, system_handle(sh_event)] HANDLE CancelEvent);
HRESULT ListImages([in, unique] const WSLCListImageOptions* Options, [out, size_is(, *Count)] WSLCImageInformation** Images, [out] ULONG* Count);
HRESULT DeleteImage([in] const WSLCDeleteImageOptions* Options, [out, size_is(, *Count)] WSLCDeletedImageInformation** DeletedImages, [out] ULONG* Count);
HRESULT TagImage([in] const WSLCTagImageOptions* Options);
HRESULT InspectImage([in] LPCSTR ImageNameOrId, [out] LPSTR* Output);
// Container management.
HRESULT CreateContainer([in] const WSLCContainerOptions* Options, [out] IWSLCContainer** Container);
HRESULT OpenContainer([in, ref] LPCSTR Id, [out] IWSLCContainer** Container);
HRESULT ListContainers([out, size_is(, *Count)] WSLCContainerEntry** Containers,
[out] ULONG* Count,
[out, size_is(, *PortsCount)] WSLCContainerPortMapping** Ports,
[out] ULONG* PortsCount);
HRESULT PruneContainers([in, unique, size_is(FiltersCount)] WSLCContainerPruneFilter* Filters, [in] DWORD FiltersCount, [in] ULONGLONG Until, [out] WSLCPruneContainersResults* Result);
// Create a process at the VM level. This is meant for debugging.
HRESULT CreateRootNamespaceProcess([in, ref] LPCSTR Executable, [in, ref] const WSLCProcessOptions* Options, [out] IWSLCProcess** Process, [out] int* Errno);
// TODO: an OpenProcess() method can be added later if needed.
// Disk management.
HRESULT FormatVirtualDisk([in, ref] LPCWSTR Path);
// Terminate the VM and containers.
HRESULT Terminate();
// Used only for testing. TODO: Think about moving them to a dedicated testing-only interface.
HRESULT MountWindowsFolder([in, ref] LPCWSTR WindowsPath, [in, ref] LPCSTR LinuxPath, [in] BOOL ReadOnly);
HRESULT UnmountWindowsFolder([in, ref] LPCSTR LinuxPath);
HRESULT MapVmPort([in] int Family, [in] unsigned short WindowsPort, [in] unsigned short LinuxPort);
HRESULT UnmapVmPort([in] int Family, [in] unsigned short WindowsPort, [in] unsigned short LinuxPort);
// Session initialization - called by SYSTEM service after launching per-user process.
// Returns a handle to this COM server process (used to add to job object).
HRESULT GetProcessHandle([out, system_handle(sh_process)] HANDLE* ProcessHandle);
// Initializes the session with a pre-created VM.
HRESULT Initialize(
[in] const WSLCSessionInitSettings* Settings,
[in] IWSLCVirtualMachine* Vm);
// Volume management.
HRESULT CreateVolume([in] const WSLCVolumeOptions* Options);
HRESULT DeleteVolume([in] LPCSTR Name);
HRESULT ListVolumes([out, size_is(, *Count)] WSLCVolumeInformation** Volumes, [out] ULONG* Count);
HRESULT InspectVolume([in] LPCSTR Name, [out] LPSTR* Output);
}
//
// IWSLCSessionReference - Weak reference to a session held by the SYSTEM service.
// Stored in per-user process, allows service to check liveness and terminate sessions.
// Session metadata (ID, name, etc.) is stored service-side in SessionEntry.
//
[
uuid(B3A72F48-9D15-4E8A-A621-7C3E84F09B52),
pointer_default(unique),
object
]
interface IWSLCSessionReference : IUnknown
{
// Try to open the session. Fails if session was released or terminated.
// Returns S_OK and a valid session if still alive.
HRESULT OpenSession([out] IWSLCSession** Session);
// Terminate the session if still alive.
HRESULT Terminate();
}
//
// IWSLCSessionFactory - Creates sessions in the per-user COM server process.
// Called by the SYSTEM service via CoCreateInstanceAsUser.
//
[
uuid(C4E8F291-3B5D-4A7C-9E12-8F6A4D2B7C91),
pointer_default(unique),
object
]
interface IWSLCSessionFactory : IUnknown
{
// Creates a new session and returns both the session interface and a service reference.
HRESULT CreateSession(
[in] const WSLCSessionInitSettings* Settings,
[in] IWSLCVirtualMachine* Vm,
[out] IWSLCSession** Session,
[out] IWSLCSessionReference** ServiceRef);
// Gets the process handle for adding to job object.
HRESULT GetProcessHandle([out, system_handle(sh_process)] HANDLE* ProcessHandle);
}
typedef struct _WSLCSessionInformation
{
ULONG SessionId;
DWORD CreatorPid;
wchar_t DisplayName[256];
wchar_t Sid[256 + 1]; // MAX_SID_SIZE = 256
} WSLCSessionInformation;
typedef enum _WSLCSessionFlags
{
WSLCSessionFlagsNone = 0,
WSLCSessionFlagsPersistent = 1, // Session remains active after its COM reference is released.
WSLCSessionFlagsOpenExisting = 2, // Open an existing session if the name is in use.
} WSLCSessionFlags;
cpp_quote("#define WSLCSessionFlagsValid (WSLCSessionFlagsPersistent | WSLCSessionFlagsOpenExisting)")
cpp_quote("DEFINE_ENUM_FLAG_OPERATORS(WSLCSessionFlags);")
[
uuid(82A7ABC8-6B50-43FC-AB96-15FBBE7E8760),
pointer_default(unique),
object
]
interface IWSLCSessionManager : IUnknown
{
HRESULT GetVersion([out] WSLCVersion* Version);
// Session management.
HRESULT CreateSession([in, ref] const WSLCSessionSettings* Settings, WSLCSessionFlags Flags, [out] IWSLCSession** Session);
HRESULT ListSessions([out, size_is(, *SessionsCount)] WSLCSessionInformation** Sessions, [out] ULONG* SessionsCount);
HRESULT OpenSession([in] ULONG Id, [out] IWSLCSession** Session);
HRESULT OpenSessionByName([in, ref] LPCWSTR DisplayName, [out] IWSLCSession** Session);
}
cpp_quote("#define WSLC_E_BASE (0x0600)")
cpp_quote("#define WSLC_E_IMAGE_NOT_FOUND MAKE_HRESULT(SEVERITY_ERROR, FACILITY_ITF, WSLC_E_BASE + 1) /* 0x80040601 */")
cpp_quote("#define WSLC_E_CONTAINER_PREFIX_AMBIGUOUS MAKE_HRESULT(SEVERITY_ERROR, FACILITY_ITF, WSLC_E_BASE + 2) /* 0x80040602 */")
cpp_quote("#define WSLC_E_CONTAINER_NOT_FOUND MAKE_HRESULT(SEVERITY_ERROR, FACILITY_ITF, WSLC_E_BASE + 3) /* 0x80040603 */")
cpp_quote("#define WSLC_E_VOLUME_NOT_FOUND MAKE_HRESULT(SEVERITY_ERROR, FACILITY_ITF, WSLC_E_BASE + 4) /* 0x80040604 */")