#![cfg(target_os = "windows")]
#![cfg(not(tarpaulin_include))]
#![allow(non_camel_case_types)]
#![allow(non_snake_case)]
#![allow(clippy::upper_case_acronyms)]
use std::{
io,
os::{raw::c_void, windows::raw::HANDLE},
ptr::null_mut,
};
pub const INVALID_HANDLE_VALUE: HANDLE = -1isize as HANDLE;
type LPCSTR = *const i8;
pub type DWORD = u32;
pub type LPDWORD = *mut DWORD;
pub type LPVOID = *mut c_void;
pub type LPCVOID = *const c_void;
type PVOID = *mut c_void;
type ULONG_PTR = usize;
#[derive(Copy, Clone)]
#[repr(transparent)]
pub struct BOOL(i32);
pub const FALSE: BOOL = BOOL(0);
pub const TRUE: BOOL = BOOL(1);
impl BOOL {
pub fn to_bool(self) -> bool {
self.0 != FALSE.0
}
}
impl From<bool> for BOOL {
fn from(x: bool) -> Self {
if x {
TRUE
} else {
FALSE
}
}
}
#[repr(C)]
#[derive(Copy, Clone)]
pub struct OVERLAPPED_Offset {
pub Offset: DWORD,
pub OffsetHigh: DWORD,
}
#[repr(C)]
pub union OVERLAPPED_OffsetOrPointer {
pub Offset: OVERLAPPED_Offset,
Pointer: PVOID,
}
#[repr(C)]
pub struct OVERLAPPED {
Internal: ULONG_PTR,
InternalHigh: ULONG_PTR,
pub OffsetOrPointer: OVERLAPPED_OffsetOrPointer,
hEvent: HANDLE,
}
impl Default for OVERLAPPED {
fn default() -> Self {
Self::new(0)
}
}
impl OVERLAPPED {
pub fn new(offset: u64) -> Self {
Self {
Internal: 0,
InternalHigh: 0,
OffsetOrPointer: OVERLAPPED_OffsetOrPointer {
Offset: OVERLAPPED_Offset {
Offset: offset as DWORD,
OffsetHigh: (offset >> 32) as DWORD,
},
},
hEvent: null_mut(),
}
}
}
pub type LPOVERLAPPED = *mut OVERLAPPED;
#[repr(transparent)]
pub struct ACCESS_MASK(DWORD);
pub const GENERIC_READ: ACCESS_MASK = ACCESS_MASK(0x80000000);
pub const GENERIC_WRITE: ACCESS_MASK = ACCESS_MASK(0x40000000);
#[repr(C)]
pub struct SECURITY_ATTRIBUTES {
nLength: DWORD,
lpSecurityDescriptor: LPVOID,
bInheritHandle: BOOL,
}
type LPSECURITY_ATTRIBUTES = *mut SECURITY_ATTRIBUTES;
#[repr(transparent)]
pub struct CreationDisposition(DWORD);
pub const CREATE_ALWAYS: CreationDisposition = CreationDisposition(2);
pub const OPEN_ALWAYS: CreationDisposition = CreationDisposition(4);
#[repr(transparent)]
pub struct FlagsAndAttributes(DWORD);
pub const FILE_FLAG_OVERLAPPED: FlagsAndAttributes = FlagsAndAttributes(0x40000000);
#[derive(PartialEq, Eq, Clone, Copy, Debug)]
#[repr(transparent)]
pub struct Error(DWORD);
pub const ERROR_SUCCESS: Error = Error(0);
pub const ERROR_HANDLE_EOF: Error = Error(38);
pub const ERROR_IO_INCOMPLETE: Error = Error(996);
pub const ERROR_IO_PENDING: Error = Error(997);
impl Error {
pub fn to_error(self) -> io::Error {
io::Error::from_raw_os_error(self.0 as i32)
}
}
#[link(name = "kernel32")]
extern "system" {
pub fn CreateFileA(
lpFileName: LPCSTR, dwDesiredAccess: ACCESS_MASK, dwShareMode: DWORD, lpSecurityAttributes: LPSECURITY_ATTRIBUTES, dwCreationDisposition: CreationDisposition, dwFlagsAndAttributes: FlagsAndAttributes, hTemplateFile: HANDLE, ) -> HANDLE;
}
#[link(name = "kernel32")]
extern "system" {
pub fn ReadFile(
hFile: HANDLE, lpBuffer: LPVOID, nNumberOfBytesToRead: DWORD, lpNumberOfBytesRead: LPDWORD, lpOverlapped: LPOVERLAPPED, ) -> BOOL;
}
#[link(name = "kernel32")]
extern "system" {
pub fn WriteFile(
hFile: HANDLE, lpBuffer: LPCVOID, nNumberOfBytesToWrite: DWORD, lpNumberOfBytesWritten: LPDWORD, lpOverlapped: LPOVERLAPPED, ) -> BOOL;
}
#[link(name = "kernel32")]
extern "system" {
pub fn CloseHandle(hObject: HANDLE, ) -> BOOL;
}
#[link(name = "kernel32")]
extern "system" {
pub fn CancelIoEx(
hFile: HANDLE, lpOverlapped: LPOVERLAPPED, ) -> BOOL;
}
#[link(name = "kernel32")]
extern "system" {
pub fn GetOverlappedResult(
hFile: HANDLE, lpOverlapped: LPOVERLAPPED, lpNumberOfBytesTransferred: LPDWORD, bWait: BOOL, ) -> BOOL;
}
#[link(name = "kernel32")]
extern "system" {
pub fn GetLastError() -> Error;
}