#![allow(non_snake_case)]
#[cfg(feature = "nightly")]
mod nightly;
use std::alloc::Layout;
use std::os::raw::{c_ulong, c_ushort};
use std::os::windows::io::RawHandle;
pub use windows_sys::Win32::Foundation::{
CloseHandle, GetLastError, SetLastError, ERROR_INSUFFICIENT_BUFFER, FALSE, GENERIC_READ, GENERIC_WRITE, HANDLE,
INVALID_HANDLE_VALUE,
};
pub use windows_sys::Win32::Security::{
AdjustTokenPrivileges, LookupPrivilegeValueW, SE_PRIVILEGE_ENABLED, TOKEN_ADJUST_PRIVILEGES, TOKEN_PRIVILEGES,
};
pub use windows_sys::Win32::Security::{SE_BACKUP_NAME, SE_CREATE_SYMBOLIC_LINK_NAME, SE_RESTORE_NAME};
pub use windows_sys::Win32::Storage::FileSystem::{
GetFullPathNameW, FILE_FLAG_BACKUP_SEMANTICS, FILE_FLAG_OPEN_REPARSE_POINT, MAXIMUM_REPARSE_DATA_BUFFER_SIZE,
REPARSE_GUID_DATA_BUFFER,
};
pub use windows_sys::Win32::System::Ioctl::{
FSCTL_DELETE_REPARSE_POINT, FSCTL_GET_REPARSE_POINT, FSCTL_SET_REPARSE_POINT,
};
pub use windows_sys::Win32::System::SystemServices::IO_REPARSE_TAG_MOUNT_POINT;
pub use windows_sys::Win32::System::Threading::{GetCurrentProcess, OpenProcessToken};
pub use windows_sys::Win32::System::IO::DeviceIoControl;
#[allow(clippy::unnecessary_operation)]
const _: () = {
let std_layout = Layout::new::<RawHandle>();
let win_sys_layout = Layout::new::<HANDLE>();
assert!(std_layout.size() == win_sys_layout.size());
assert!(std_layout.align() == win_sys_layout.align());
};
pub const REPARSE_DATA_BUFFER_HEADER_SIZE: u16 = 8;
pub const REPARSE_GUID_DATA_BUFFER_HEADER_SIZE: u16 = 24;
pub const MOUNT_POINT_REPARSE_BUFFER_HEADER_SIZE: u16 = 8;
#[cfg(feature = "nightly")]
#[allow(clippy::assertions_on_constants)]
const _: () = {
assert!(REPARSE_DATA_BUFFER_HEADER_SIZE == nightly::REPARSE_DATA_BUFFER_HEADER_SIZE);
assert!(REPARSE_GUID_DATA_BUFFER_HEADER_SIZE == nightly::REPARSE_GUID_DATA_BUFFER_HEADER_SIZE);
assert!(MOUNT_POINT_REPARSE_BUFFER_HEADER_SIZE == nightly::MOUNT_POINT_REPARSE_BUFFER_HEADER_SIZE);
};
type VarLenArr<T> = [T; 1];
#[repr(C)]
#[derive(Debug)]
pub struct REPARSE_DATA_BUFFER {
pub ReparseTag: c_ulong,
pub ReparseDataLength: c_ushort,
pub Reserved: c_ushort,
pub ReparseBuffer: MountPointReparseBuffer,
}
#[repr(C)]
#[derive(Debug)]
pub struct MountPointReparseBuffer {
pub SubstituteNameOffset: c_ushort,
pub SubstituteNameLength: c_ushort,
pub PrintNameOffset: c_ushort,
pub PrintNameLength: c_ushort,
pub PathBuffer: VarLenArr<c_ushort>,
}