#![allow(non_snake_case, non_camel_case_types)]
use core::ffi::{c_int, c_void};
use crate::os::windows::types::USHORT;
use super::types::{DWORD, LPSTR, PPS_POST_PROCESS_INIT_ROUTINE, ULONGLONG};
#[repr(C)]
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, Default)]
#[cfg_attr(feature = "std", derive(serde::Serialize, serde::Deserialize))]
#[cfg_attr(feature = "std", serde(rename_all = "PascalCase"))]
pub struct Guid {
pub data1: u32,
pub data2: u16,
pub data3: u16,
pub data4: [u8; 8],
}
impl Guid {
pub const fn new(
data1: u32,
data2: u16,
data3: u16,
data4: [u8; 8],
) -> Self {
Guid {
data1,
data2,
data3,
data4,
}
}
pub const fn from_u128(data: u128) -> Self {
let bytes = data.to_be_bytes();
Guid {
data1: u32::from_be_bytes([bytes[0], bytes[1], bytes[2], bytes[3]]),
data2: u16::from_be_bytes([bytes[4], bytes[5]]),
data3: u16::from_be_bytes([bytes[6], bytes[7]]),
data4: [
bytes[8], bytes[9], bytes[10], bytes[11],
bytes[12], bytes[13], bytes[14], bytes[15],
],
}
}
}
#[repr(C)]
pub struct TEB {
Reserved1: [*mut c_void; 12],
pub ProcessEnvironmentBlock: *mut PEB,
Reserved2: [*mut c_void; 399],
Reserved3: [u8; 1952],
TlsSlots: [*mut c_void; 64],
Reserved4: [u8; 8],
Reserved5: [*mut c_void; 26],
ReservedForOle: *mut c_void,
Reserved6: [*mut c_void; 4],
TlsExpansionSlots: *mut c_void,
}
#[repr(C)]
#[derive(Clone, Copy, Debug)]
pub struct PEB {
Reserved1: [u8; 2],
BeingDebugged: u8,
Reserved2: [u8; 1],
Reserved3: [*mut c_void; 2],
pub Ldr: *mut PEB_LDR_DATA,
pub ProcessParameters: *mut RTL_USER_PROCESS_PARAMETERS,
Reserved4: [*mut c_void; 3],
AtlThunkSListPtr: *mut c_void,
Reserved5: *mut c_void,
Reserved6: u32,
Reserved7: *mut c_void,
Reserved8: u32,
AtlThunkSListPtr32: u32,
Reserved9: [*mut c_void; 45],
Reserved10: [u8; 96],
PostProcessInitRoutine: PPS_POST_PROCESS_INIT_ROUTINE,
Reserved11: [u8; 128],
Reserved12: [*mut c_void; 1],
SessionId: u32,
}
#[repr(C)]
#[derive(Clone, Copy, Debug, PartialEq)]
pub struct RTL_USER_PROCESS_PARAMETERS {
Reserved1: [u8; 16],
Reserved2: [*mut c_void; 10],
pub ImagePathName: UNICODE_STRING,
pub CommandLine: UNICODE_STRING,
pub Environment: *mut u16,
}
impl Default for RTL_USER_PROCESS_PARAMETERS {
fn default() -> Self {
unsafe { core::mem::zeroed() }
}
}
#[repr(C)]
#[derive(Clone, Copy, Debug, PartialEq)]
pub struct UNICODE_STRING {
pub Length: u16,
pub MaximumLength: u16,
pub Buffer: *mut u16,
}
#[repr(C)]
#[derive(Debug)]
pub struct LIST_ENTRY {
pub flink: *mut LIST_ENTRY,
blink: *mut LIST_ENTRY,
}
#[repr(C)]
#[derive(Debug)]
pub struct LDR_DATA_TABLE_ENTRY {
InLoadOrderLinks: LIST_ENTRY,
InMemoryOrderLinks: LIST_ENTRY,
InInitializationOrderLinks: LIST_ENTRY,
pub DllBase: *mut c_void,
pub EntryPoint: *mut c_void,
pub SizeOfImage: u32,
FullDllName: UNICODE_STRING,
pub BaseDllName: UNICODE_STRING,
}
#[repr(C)]
#[derive(Debug)]
pub struct PEB_LDR_DATA {
Length: u32,
Initialized: u8,
SsHandle: *mut c_void,
pub InLoadOrderModuleList: LIST_ENTRY,
InMemoryOrderModuleList: LIST_ENTRY,
InInitializationOrderModuleList: LIST_ENTRY,
}
#[repr(C)]
#[derive(Debug, Clone, Copy)]
pub struct IMAGE_DOS_HEADER {
pub e_magic: u16,
e_cblp: u16,
e_cp: u16,
e_crlc: u16,
e_cparhdr: u16,
e_minalloc: u16,
e_maxalloc: u16,
e_ss: u16,
e_sp: u16,
e_csum: u16,
e_ip: u16,
e_cs: u16,
e_lfarlc: u16,
e_ovno: u16,
e_res: [u16; 4],
e_oemid: u16,
e_oeminfo: u16,
e_res2: [u16; 10],
pub e_lfanew: u32,
}
#[repr(C)]
#[derive(Debug, Clone, Copy)]
pub struct IMAGE_NT_HEADERS64 {
pub Signature: u32,
pub FileHeader: IMAGE_FILE_HEADER,
pub OptionalHeader: IMAGE_OPTIONAL_HEADER64,
}
#[repr(C)]
#[derive(Debug, Clone, Copy)]
pub struct IMAGE_FILE_HEADER {
Machine: u16,
pub NumberOfSections: u16,
TimeDateStamp: u32,
pub PointerToSymbolTable: u32,
pub NumberOfSymbols: u32,
pub SizeOfOptionalHeader: u16,
Characteristics: u16,
}
#[repr(C)]
#[derive(Debug, Clone, Copy)]
pub struct IMAGE_OPTIONAL_HEADER64 {
Magic: u16,
MajorLinkerVersion: u8,
MinorLinkerVersion: u8,
SizeOfCode: u32,
SizeOfInitializedData: u32,
SizeOfUninitializedData: u32,
pub AddressOfEntryPoint: u32,
BaseOfCode: u32,
pub ImageBase: u64,
SectionAlignment: u32,
FileAlignment: u32,
MajorOperatingSystemVersion: u16,
MinorOperatingSystemVersion: u16,
MajorImageVersion: u16,
MinorImageVersion: u16,
MajorSubsystemVersion: u16,
MinorSubsystemVersion: u16,
Win32VersionValue: u32,
pub SizeOfImage: u32,
pub SizeOfHeaders: u32,
CheckSum: u32,
Subsystem: u16,
DllCharacteristics: u16,
SizeOfStackReserve: u64,
SizeOfStackCommit: u64,
SizeOfHeapReserve: u64,
SizeOfHeapCommit: u64,
LoaderFlags: u32,
NumberOfRvaAndSizes: u32,
pub DataDirectory: [IMAGE_DATA_DIRECTORY; 16],
}
#[repr(C)]
#[derive(Debug, Clone, Copy)]
pub struct IMAGE_DATA_DIRECTORY {
pub VirtualAddress: u32,
pub Size: u32,
}
#[repr(C)]
#[derive(Debug, Clone, Copy)]
pub struct IMAGE_EXPORT_DIRECTORY {
Characteristics: u32,
TimeDateStamp: u32,
MajorVersion: u16,
MinorVersion: u16,
Name: u32,
Base: u32,
pub NumberOfFunctions: u32,
pub NumberOfNames: u32,
pub AddressOfFunctions: u32,
pub AddressOfNames: u32,
pub AddressOfNameOrdinals: u32,
}
#[repr(C)]
#[derive(Debug, Clone, Copy)]
pub struct IMAGE_SECTION_HEADER {
pub Name: [u8; 8],
pub VirtualSize: u32,
pub VirtualAddress: u32,
pub SizeOfRawData: u32,
pub PointerToRawData: u32,
PointerToRelocations: u32,
PointerToLinenumbers: u32,
NumberOfRelocations: u16,
NumberOfLinenumbers: u16,
pub Characteristics: u32,
}
#[repr(C)]
pub struct IMAGE_BASE_RELOCATION {
pub VirtualAddress: u32,
pub SizeOfBlock: u32,
}
#[repr(C)]
#[derive(Clone, Copy)]
pub struct IMAGE_IMPORT_DESCRIPTOR {
pub Anonymous: IMAGE_IMPORT_DESCRIPTOR_0,
TimeDateStamp: u32,
ForwarderChain: u32,
pub Name: u32,
pub FirstThunk: u32,
}
#[repr(C)]
#[derive(Clone, Copy)]
pub union IMAGE_IMPORT_DESCRIPTOR_0 {
Characteristics: u32,
pub OriginalFirstThunk: u32,
}
#[repr(C)]
pub struct IMAGE_THUNK_DATA64 {
pub u1: IMAGE_THUNK_DATA64_0,
}
#[repr(C)]
pub union IMAGE_THUNK_DATA64_0 {
ForwarderString: u64,
pub Function: u64,
pub Ordinal: u64,
pub AddressOfData: u64,
}
#[repr(C)]
pub struct IMAGE_IMPORT_BY_NAME {
Hint: u16,
pub Name: [i8; 1],
}
#[repr(C)]
pub struct IMAGE_TLS_DIRECTORY64 {
pub StartAddressOfRawData: ULONGLONG,
pub EndAddressOfRawData: ULONGLONG,
pub AddressOfIndex: ULONGLONG,
pub AddressOfCallbacks: ULONGLONG,
pub SizeOfZeroFill: DWORD,
Reserved0: DWORD,
Alignment: DWORD,
Reserved1: DWORD,
}
#[repr(C)]
#[derive(Debug)]
pub struct URL_COMPONENTSA {
pub dwStructSize: DWORD,
pub lpszScheme: LPSTR,
pub dwSchemeLength: DWORD,
pub nScheme: c_int,
pub lpszHostName: LPSTR,
pub dwHostNameLength: DWORD,
pub nPort: USHORT,
pub lpszUserName: LPSTR,
pub dwUserNameLength: DWORD,
pub lpszPassword: LPSTR,
pub dwPasswordLength: DWORD,
pub lpszUrlPath: LPSTR,
pub dwUrlPathLength: DWORD,
pub lpszExtraInfo: LPSTR,
pub dwExtraInfoLength: DWORD,
}
#[repr(C)]
#[derive(Debug)]
pub struct RUNTIME_FUNCTION {
pub BeginAddress: DWORD,
pub EndAddress: DWORD,
pub UnwindData: DWORD,
}