#![allow(clippy::upper_case_acronyms, non_snake_case, non_camel_case_types)]
use std::{ffi::c_void, mem::size_of, ptr::null_mut};
pub(crate) const INFINITE: u32 = 0xFFFFFFFF;
pub(crate) const WAIT_OBJECT_0: u32 = 0x00000000;
pub(crate) const STATUS_PENDING: u32 = 0x00000103;
pub(crate) type BOOL = i32;
pub(crate) type DWORD = u32;
pub(crate) type PCWSTR = *const u16;
pub(crate) type PDWORD = *mut u32;
type PVOID = *mut c_void;
pub(crate) type PWSTR = *mut u16;
pub(crate) type UINT = u32;
type HANDLE = *mut c_void;
type PBYTE = *mut u8;
type WORD = u16;
#[repr(C)]
#[derive(Debug)]
pub(crate) struct PROCESS_INFORMATION {
pub hProcess: HANDLE,
pub hThread: HANDLE,
pub dwProcessId: DWORD,
dwThreadId: DWORD,
}
impl Default for PROCESS_INFORMATION {
fn default() -> Self {
Self {
hProcess: null_mut(),
hThread: null_mut(),
dwProcessId: 0,
dwThreadId: 0,
}
}
}
#[repr(C)]
pub(crate) struct SECURITY_ATTRIBUTES {
nLength: DWORD,
lpSecurityDescriptor: PVOID,
bInheritHandle: BOOL,
}
#[repr(C)]
pub(crate) struct STARTUPINFOW {
pub cb: DWORD,
lpReserved: PWSTR,
lpDesktop: PWSTR,
lpTitle: PWSTR,
dwX: DWORD,
dwY: DWORD,
dwXSize: DWORD,
dwYSize: DWORD,
dwXCountChars: DWORD,
dwYCountChars: DWORD,
dwFillAttribute: DWORD,
dwFlags: DWORD,
wShowWindow: WORD,
cbReserved2: WORD,
lpReserved2: PBYTE,
hStdInput: HANDLE,
hStdOutput: HANDLE,
hStdError: HANDLE,
}
impl Default for STARTUPINFOW {
fn default() -> Self {
Self {
cb: size_of::<STARTUPINFOW>() as DWORD,
lpReserved: null_mut(),
lpDesktop: null_mut(),
lpTitle: null_mut(),
dwX: 0,
dwY: 0,
dwXSize: 0,
dwYSize: 0,
dwXCountChars: 0,
dwYCountChars: 0,
dwFillAttribute: 0,
dwFlags: 0,
wShowWindow: 0,
cbReserved2: 0,
lpReserved2: null_mut(),
hStdInput: null_mut(),
hStdOutput: null_mut(),
hStdError: null_mut(),
}
}
}
extern "system" {
pub(crate) fn CloseHandle(hObject: HANDLE) -> BOOL;
pub(crate) fn CreateProcessW(
lpApplicationName: PCWSTR,
lpCommandLine: PWSTR,
lpProcessAttributes: *mut SECURITY_ATTRIBUTES,
lpThreadAttributes: *mut SECURITY_ATTRIBUTES,
bInheritHandles: BOOL,
dwCreationFlags: DWORD,
lpEnvironment: PVOID,
lpCurrentDirectory: PCWSTR,
lpStartupInfo: *const STARTUPINFOW,
lpProcessInformation: *mut PROCESS_INFORMATION,
) -> BOOL;
pub(crate) fn GetExitCodeProcess(hProcess: HANDLE, lpExitCode: PDWORD) -> BOOL;
pub(crate) fn TerminateProcess(hProcess: HANDLE, uExitCode: UINT) -> BOOL;
pub(crate) fn WaitForSingleObject(hHandle: HANDLE, dwMilliseconds: DWORD) -> DWORD;
}