Skip to main content

wslcsdk_sys/
lib.rs

1//! Microsoft.WSL.Containers 3.0.1 官方原始 C FFI 绑定
2//!
3//! 提供对 `wslcsdk.dll` 的全量 1:1 C 导出函数声明。
4
5#![allow(non_snake_case, non_camel_case_types)]
6
7pub mod errors;
8pub mod types;
9
10pub use errors::*;
11pub use types::*;
12
13use core::ffi::c_void;
14use windows_sys::Win32::Foundation::HANDLE;
15use windows_sys::core::HRESULT;
16
17unsafe extern "system" {
18    // ==================== 安装与版本检测 API ====================
19
20    /// 获取 WSLC 运行时版本号
21    pub fn WslcGetVersion(version: *mut WslcVersion) -> HRESULT;
22
23    /// 获取当前宿主机缺失的组件标志位
24    pub fn WslcGetMissingComponents(missingComponents: *mut WslcComponentFlags) -> HRESULT;
25
26    /// 安装缺失组件与依赖
27    pub fn WslcInstallWithDependencies(
28        components: WslcComponentFlags,
29        options: WslcInstallOptions,
30        progressCallback: WslcInstallCallback,
31        context: *mut c_void,
32    ) -> HRESULT;
33
34    // ==================== 会话管理 API ====================
35
36    /// 初始化会话设置
37    pub fn WslcInitSessionSettings(
38        name: *const u16,
39        storagePath: *const u16,
40        sessionSettings: *mut WslcSessionSettings,
41    ) -> HRESULT;
42
43    /// 设置会话 CPU 核心数限制
44    pub fn WslcSetSessionSettingsCpuCount(
45        sessionSettings: *mut WslcSessionSettings,
46        cpuCount: u32,
47    ) -> HRESULT;
48
49    /// 设置会话内存限制 (MB)
50    pub fn WslcSetSessionSettingsMemory(
51        sessionSettings: *mut WslcSessionSettings,
52        memoryMB: u32,
53    ) -> HRESULT;
54
55    /// 设置会话空闲超时断开时间 (毫秒)
56    pub fn WslcSetSessionSettingsTimeout(
57        sessionSettings: *mut WslcSessionSettings,
58        timeoutMS: u32,
59    ) -> HRESULT;
60
61    /// 设置会话 VHDX 存储规格
62    pub fn WslcSetSessionSettingsVhd(
63        sessionSettings: *mut WslcSessionSettings,
64        vhdRequirements: *const WslcVhdRequirements,
65    ) -> HRESULT;
66
67    /// 设置会话特性标志位 (如 GPU)
68    pub fn WslcSetSessionSettingsFeatureFlags(
69        sessionSettings: *mut WslcSessionSettings,
70        flags: WslcSessionFeatureFlags,
71    ) -> HRESULT;
72
73    /// 创建会话
74    pub fn WslcCreateSession(
75        sessionSettings: *mut WslcSessionSettings,
76        session: *mut WslcSession,
77        errorMessage: *mut *mut u16,
78    ) -> HRESULT;
79
80    /// 获取会话终止通知事件句柄
81    pub fn WslcGetSessionTerminationEvent(
82        session: WslcSession,
83        terminationEvent: *mut HANDLE,
84    ) -> HRESULT;
85
86    /// 获取会话终止原因
87    pub fn WslcGetSessionTerminationReason(
88        session: WslcSession,
89        reason: *mut WslcSessionTerminationReason,
90    ) -> HRESULT;
91
92    /// 强制终止会话
93    pub fn WslcTerminateSession(session: WslcSession) -> HRESULT;
94
95    /// 释放会话句柄
96    pub fn WslcReleaseSession(session: WslcSession) -> HRESULT;
97
98    /// 注册会话崩溃转储回调
99    pub fn WslcRegisterSessionCrashDumpCallback(
100        session: WslcSession,
101        crashDumpCallback: WslcSessionCrashDumpCallback,
102        crashDumpContext: *mut c_void,
103        subscription: *mut WslcCrashDumpSubscription,
104        errorMessage: *mut *mut u16,
105    ) -> HRESULT;
106
107    /// 释放崩溃转储订阅句柄
108    pub fn WslcReleaseCrashDumpSubscription(subscription: WslcCrashDumpSubscription) -> HRESULT;
109
110    // ==================== 容器配置与创建 API ====================
111
112    /// 初始化容器设置
113    pub fn WslcInitContainerSettings(
114        imageName: *const i8,
115        containerSettings: *mut WslcContainerSettings,
116    ) -> HRESULT;
117
118    /// 设置容器名称
119    pub fn WslcSetContainerSettingsName(
120        containerSettings: *mut WslcContainerSettings,
121        name: *const i8,
122    ) -> HRESULT;
123
124    /// 设置容器初始化主进程
125    pub fn WslcSetContainerSettingsInitProcess(
126        containerSettings: *mut WslcContainerSettings,
127        initProcess: *mut WslcProcessSettings,
128    ) -> HRESULT;
129
130    /// 设置容器网络模式
131    pub fn WslcSetContainerSettingsNetworkingMode(
132        containerSettings: *mut WslcContainerSettings,
133        networkingMode: WslcContainerNetworkingMode,
134    ) -> HRESULT;
135
136    /// 设置容器主机名
137    pub fn WslcSetContainerSettingsHostName(
138        containerSettings: *mut WslcContainerSettings,
139        hostName: *const i8,
140    ) -> HRESULT;
141
142    /// 设置容器域名
143    pub fn WslcSetContainerSettingsDomainName(
144        containerSettings: *mut WslcContainerSettings,
145        domainName: *const i8,
146    ) -> HRESULT;
147
148    /// 设置容器运行标志位
149    pub fn WslcSetContainerSettingsFlags(
150        containerSettings: *mut WslcContainerSettings,
151        flags: WslcContainerFlags,
152    ) -> HRESULT;
153
154    /// 设置容器端口映射
155    pub fn WslcSetContainerSettingsPortMappings(
156        containerSettings: *mut WslcContainerSettings,
157        portMappings: *const WslcContainerPortMapping,
158        portMappingCount: u32,
159    ) -> HRESULT;
160
161    /// 设置容器目录卷挂载
162    pub fn WslcSetContainerSettingsVolumes(
163        containerSettings: *mut WslcContainerSettings,
164        volumes: *const WslcContainerVolume,
165        volumeCount: u32,
166    ) -> HRESULT;
167
168    /// 设置容器具名 VHD 卷挂载
169    pub fn WslcSetContainerSettingsNamedVolumes(
170        containerSettings: *mut WslcContainerSettings,
171        namedVolumes: *const WslcContainerNamedVolume,
172        namedVolumeCount: u32,
173    ) -> HRESULT;
174
175    /// 创建容器
176    pub fn WslcCreateContainer(
177        session: WslcSession,
178        containerSettings: *const WslcContainerSettings,
179        container: *mut WslcContainer,
180        errorMessage: *mut *mut u16,
181    ) -> HRESULT;
182
183    /// 打开已有容器
184    pub fn WslcOpenContainer(
185        session: WslcSession,
186        nameOrId: *const i8,
187        container: *mut WslcContainer,
188        errorMessage: *mut *mut u16,
189    ) -> HRESULT;
190
191    /// 启动容器
192    pub fn WslcStartContainer(
193        container: WslcContainer,
194        flags: WslcContainerStartFlags,
195        errorMessage: *mut *mut u16,
196    ) -> HRESULT;
197
198    /// 停止容器
199    pub fn WslcStopContainer(
200        container: WslcContainer,
201        signal: WslcSignal,
202        timeoutSeconds: u32,
203        errorMessage: *mut *mut u16,
204    ) -> HRESULT;
205
206    /// 删除容器
207    pub fn WslcDeleteContainer(
208        container: WslcContainer,
209        flags: WslcDeleteContainerFlags,
210        errorMessage: *mut *mut u16,
211    ) -> HRESULT;
212
213    /// 释放容器句柄
214    pub fn WslcReleaseContainer(container: WslcContainer) -> HRESULT;
215
216    /// 获取容器 64 位唯一哈希 ID
217    pub fn WslcGetContainerID(container: WslcContainer, containerID: *mut i8) -> HRESULT;
218
219    /// 获取容器初始化主进程
220    pub fn WslcGetContainerInitProcess(
221        container: WslcContainer,
222        initProcess: *mut WslcProcess,
223    ) -> HRESULT;
224
225    /// 获取容器 JSON 检查快照
226    pub fn WslcInspectContainer(container: WslcContainer, inspectData: *mut *mut i8) -> HRESULT;
227
228    /// 获取容器状态
229    pub fn WslcGetContainerState(
230        container: WslcContainer,
231        state: *mut WslcContainerState,
232    ) -> HRESULT;
233
234    /// 设置容器主进程 IO 回调
235    pub fn WslcSetContainerInitProcessIOCallbacks(
236        container: WslcContainer,
237        callbacks: *const WslcProcessCallbacks,
238        context: *mut c_void,
239    ) -> HRESULT;
240
241    // ==================== 进程与流交互 API ====================
242
243    /// 初始化进程设置
244    pub fn WslcInitProcessSettings(processSettings: *mut WslcProcessSettings) -> HRESULT;
245
246    /// 设置进程工作目录
247    pub fn WslcSetProcessSettingsWorkingDirectory(
248        processSettings: *mut WslcProcessSettings,
249        workingDirectory: *const i8,
250    ) -> HRESULT;
251
252    /// 设置进程命令行参数
253    pub fn WslcSetProcessSettingsCmdLine(
254        processSettings: *mut WslcProcessSettings,
255        argv: *const *const i8,
256        argc: usize,
257    ) -> HRESULT;
258
259    /// 设置进程环境变量
260    pub fn WslcSetProcessSettingsEnvVariables(
261        processSettings: *mut WslcProcessSettings,
262        keyValue: *const *const i8,
263        argc: usize,
264    ) -> HRESULT;
265
266    /// 设置进程标志位
267    pub fn WslcSetProcessSettingsFlags(
268        processSettings: *mut WslcProcessSettings,
269        flags: WslcProcessFlags,
270    ) -> HRESULT;
271
272    /// 设置进程回调函数
273    pub fn WslcSetProcessSettingsCallbacks(
274        processSettings: *mut WslcProcessSettings,
275        callbacks: *const WslcProcessCallbacks,
276        context: *mut c_void,
277    ) -> HRESULT;
278
279    /// 在容器内创建新进程
280    pub fn WslcCreateContainerProcess(
281        container: WslcContainer,
282        newProcessSettings: *mut WslcProcessSettings,
283        newProcess: *mut WslcProcess,
284        errorMessage: *mut *mut u16,
285    ) -> HRESULT;
286
287    /// 获取进程 PID
288    pub fn WslcGetProcessPid(process: WslcProcess, pid: *mut u32) -> HRESULT;
289
290    /// 获取进程退出事件句柄
291    pub fn WslcGetProcessExitEvent(process: WslcProcess, exitEvent: *mut HANDLE) -> HRESULT;
292
293    /// 获取进程运行状态
294    pub fn WslcGetProcessState(process: WslcProcess, state: *mut WslcProcessState) -> HRESULT;
295
296    /// 获取进程退出代码
297    pub fn WslcGetProcessExitCode(process: WslcProcess, exitCode: *mut i32) -> HRESULT;
298
299    /// 向进程发送信号
300    pub fn WslcSignalProcess(process: WslcProcess, signal: WslcSignal) -> HRESULT;
301
302    /// 获取进程标准 IO 管道句柄
303    pub fn WslcGetProcessIOHandle(
304        process: WslcProcess,
305        ioHandle: WslcProcessIOHandle,
306        handle: *mut HANDLE,
307    ) -> HRESULT;
308
309    /// 释放进程句柄
310    pub fn WslcReleaseProcess(process: WslcProcess) -> HRESULT;
311
312    // ==================== 镜像与注册表 API ====================
313
314    /// 列出会话内的镜像列表
315    pub fn WslcListSessionImages(
316        session: WslcSession,
317        images: *mut *mut WslcImageInfo,
318        count: *mut u32,
319    ) -> HRESULT;
320
321    /// 拉取远程镜像
322    pub fn WslcPullSessionImage(
323        session: WslcSession,
324        options: *const WslcPullImageOptions,
325        errorMessage: *mut *mut u16,
326    ) -> HRESULT;
327
328    /// 从内存流句柄导入镜像
329    pub fn WslcImportSessionImage(
330        session: WslcSession,
331        imageName: *const i8,
332        imageContent: HANDLE,
333        imageContentBytes: u64,
334        options: *const WslcImportImageOptions,
335        errorMessage: *mut *mut u16,
336    ) -> HRESULT;
337
338    /// 从文件导入镜像
339    pub fn WslcImportSessionImageFromFile(
340        session: WslcSession,
341        imageName: *const i8,
342        path: *const u16,
343        options: *const WslcImportImageOptions,
344        errorMessage: *mut *mut u16,
345    ) -> HRESULT;
346
347    /// 从内存流句柄载入镜像
348    pub fn WslcLoadSessionImage(
349        session: WslcSession,
350        imageContent: HANDLE,
351        imageContentBytes: u64,
352        options: *const WslcLoadImageOptions,
353        errorMessage: *mut *mut u16,
354    ) -> HRESULT;
355
356    /// 从文件载入镜像
357    pub fn WslcLoadSessionImageFromFile(
358        session: WslcSession,
359        path: *const u16,
360        options: *const WslcLoadImageOptions,
361        errorMessage: *mut *mut u16,
362    ) -> HRESULT;
363
364    /// 为镜像打标签
365    pub fn WslcTagSessionImage(
366        session: WslcSession,
367        options: *const WslcTagImageOptions,
368        errorMessage: *mut *mut u16,
369    ) -> HRESULT;
370
371    /// 推送镜像至远程仓库
372    pub fn WslcPushSessionImage(
373        session: WslcSession,
374        options: *const WslcPushImageOptions,
375        errorMessage: *mut *mut u16,
376    ) -> HRESULT;
377
378    /// 删除镜像
379    pub fn WslcDeleteSessionImage(
380        session: WslcSession,
381        nameOrID: *const i8,
382        errorMessage: *mut *mut u16,
383    ) -> HRESULT;
384
385    /// 登录镜像仓库并生成身份认证 Token
386    pub fn WslcSessionAuthenticate(
387        session: WslcSession,
388        serverAddress: *const i8,
389        username: *const i8,
390        password: *const i8,
391        identityToken: *mut *mut i8,
392        tokenType: *mut WslcIdentityTokenType,
393        errorMessage: *mut *mut u16,
394    ) -> HRESULT;
395
396    // ==================== 存储卷 API ====================
397
398    /// 创建会话 VHD 卷
399    pub fn WslcCreateSessionVhdVolume(
400        session: WslcSession,
401        options: *const WslcVhdRequirements,
402        errorMessage: *mut *mut u16,
403    ) -> HRESULT;
404
405    /// 删除会话 VHD 卷
406    pub fn WslcDeleteSessionVhdVolume(
407        session: WslcSession,
408        name: *const i8,
409        errorMessage: *mut *mut u16,
410    ) -> HRESULT;
411}