Skip to main content

windows_enclave/manual_bindings/
vertdll.rs

1// Copyright (c) Microsoft Corporation.
2// Licensed under the MIT License.
3
4use crate::vertdll::*;
5
6// The following APIs in VERTDLL.DLL should be generated but are not currently included in the Win32 metadata.
7
8pub type PDELAYLOAD_FAILURE_SYSTEM_ROUTINE = Option<
9    unsafe extern "system" fn(dllname: PCSTR, procedurename: PCSTR) -> *mut core::ffi::c_void,
10>;
11
12windows_link::link!("vertdll.dll" "system" fn EnclaveCopyIntoEnclave(enclaveaddress: *mut core::ffi::c_void, unsecureaddress: *const core::ffi::c_void, numberofbytes: usize) -> HRESULT);
13windows_link::link!("vertdll.dll" "system" fn EnclaveCopyOutOfEnclave(unsecureaddress: *mut core::ffi::c_void, enclaveaddress: *const core::ffi::c_void, numberofbytes: usize) -> HRESULT);
14windows_link::link!("vertdll.dll" "system" fn EnclaveRestrictContainingProcessAccess(restrictaccess: BOOL, previouslyrestricted: *mut BOOL) -> HRESULT);
15windows_link::link!("vertdll.dll" "system" fn LdrDisableThreadCalloutsForDll(baseaddress: *mut core::ffi::c_void) -> NTSTATUS);
16windows_link::link!("vertdll.dll" "system" fn LdrResolveDelayLoadedAPI(parentmodulebase: *const core::ffi::c_void, delayloaddescriptor: *const IMAGE_DELAYLOAD_DESCRIPTOR, failuredllhook: PDELAYLOAD_FAILURE_DLL_CALLBACK, failuresystemhook: PDELAYLOAD_FAILURE_SYSTEM_ROUTINE, thunkaddress: *mut IMAGE_THUNK_DATA32, flags: u32) -> *mut core::ffi::c_void);
17windows_link::link!("vertdll.dll" "system" fn RtlGetLastNtStatus() -> NTSTATUS);
18windows_link::link!("vertdll.dll" "system" fn RtlNtStatusToDosError(status: NTSTATUS) -> u32);
19windows_link::link!("vertdll.dll" "system" fn RtlRaiseStatus(status: NTSTATUS));
20windows_link::link!("vertdll.dll" "system" fn RtlUnhandledExceptionFilter(exceptionpointers: *const EXCEPTION_POINTERS) -> i32);
21
22// The following are duplicated when adding them individually for VERTDLL.DLL bindings via bindgen,
23// so we define them here manually.
24// Created bug in windows-rs to track: https://github.com/microsoft/windows-rs/issues/3852
25
26//HEAP_FLAGS
27pub const HEAP_CREATE_ENABLE_EXECUTE: HEAP_FLAGS = 262144u32;
28pub const HEAP_DISABLE_COALESCE_ON_FREE: HEAP_FLAGS = 128u32;
29pub const HEAP_FREE_CHECKING_ENABLED: HEAP_FLAGS = 64u32;
30pub const HEAP_GENERATE_EXCEPTIONS: HEAP_FLAGS = 4u32;
31pub const HEAP_NO_SERIALIZE: HEAP_FLAGS = 1u32;
32pub const HEAP_REALLOC_IN_PLACE_ONLY: HEAP_FLAGS = 16u32;
33pub const HEAP_TAIL_CHECKING_ENABLED: HEAP_FLAGS = 32u32;
34pub const HEAP_ZERO_MEMORY: HEAP_FLAGS = 8u32;
35
36// VirtualAlloc / VirtualFree allocation types
37pub const MEM_COMMIT: u32 = 4096u32;
38pub const MEM_DECOMMIT: u32 = 16384u32;
39pub const MEM_LARGE_PAGES: u32 = 536870912u32;
40pub const MEM_RELEASE: u32 = 32768u32;
41pub const MEM_RESERVE: u32 = 8192u32;
42pub const MEM_RESET: u32 = 524288u32;
43pub const MEM_RESET_UNDO: u32 = 16777216u32;
44
45// VirtualAlloc / VirtualProtect page protections
46pub const PAGE_EXECUTE: u32 = 16u32;
47pub const PAGE_EXECUTE_READ: u32 = 32u32;
48pub const PAGE_EXECUTE_READWRITE: u32 = 64u32;
49pub const PAGE_EXECUTE_WRITECOPY: u32 = 128u32;
50pub const PAGE_GUARD: u32 = 256u32;
51pub const PAGE_NOACCESS: u32 = 1u32;
52pub const PAGE_NOCACHE: u32 = 512u32;
53pub const PAGE_READONLY: u32 = 2u32;
54pub const PAGE_READWRITE: u32 = 4u32;
55pub const PAGE_WRITECOMBINE: u32 = 1024u32;
56pub const PAGE_WRITECOPY: u32 = 8u32;
57
58// VirtualQuery page types
59pub const MEM_IMAGE: PAGE_TYPE = 16777216u32;
60pub const MEM_MAPPED: u32 = 262144u32;
61pub const MEM_PRIVATE: u32 = 131072u32;
62
63// Enclave identity constants (used for manual struct definitions if needed)
64// Note: ENCLAVE_IDENTITY and ENCLAVE_INFORMATION structs are in generated bindings
65pub const IMAGE_ENCLAVE_LONG_ID_LENGTH: usize = 32;
66pub const IMAGE_ENCLAVE_SHORT_ID_LENGTH: usize = 16;
67
68// Enclave type constants (not in generated bindings)
69pub const ENCLAVE_TYPE_SGX: u32 = 0x00000001;
70pub const ENCLAVE_TYPE_SGX2: u32 = 0x00000002;
71pub const ENCLAVE_TYPE_VBS: u32 = 0x00000010;
72
73// Enclave policy flags
74#[allow(dead_code)]
75pub const IMAGE_ENCLAVE_POLICY_DEBUGGABLE: u32 = 0x0000_0001;
76
77// Enclave image flags
78pub const IMAGE_ENCLAVE_FLAG_PRIMARY_IMAGE: u32 = 0x0000_0001;
79
80/// Enclave configuration structure.
81/// See: https://learn.microsoft.com/en-us/windows/win32/api/winnt/ns-winnt-image_enclave_config64
82#[repr(C)]
83pub struct ImageEnclaveConfig {
84    pub size: u32,
85    pub minimum_required_config_size: u32,
86    pub policy_flags: u32,
87    pub number_of_imports: u32,
88    pub import_list: u32,
89    pub import_entry_size: u32,
90    pub family_id: [u8; IMAGE_ENCLAVE_SHORT_ID_LENGTH],
91    pub image_id: [u8; IMAGE_ENCLAVE_SHORT_ID_LENGTH],
92    pub image_version: u32,
93    pub security_version: u32,
94    pub enclave_size: usize,
95    pub number_of_threads: u32,
96    pub enclave_flags: u32,
97}
98
99/// Minimum config size required (offset of enclave_flags field).
100pub const IMAGE_ENCLAVE_MINIMUM_CONFIG_SIZE: u32 =
101    core::mem::offset_of!(ImageEnclaveConfig, enclave_flags) as u32;