#![cfg(windows)]
pub mod errors;
mod handle;
mod process;
pub use self::{
errors::{Error, WinResult},
handle::Handle,
process::{
Access,
Module,
ModuleEntry,
ModuleInfo,
PriorityClass,
PriorityLevel,
Process,
Thread,
},
};
use std::mem;
use winapi::{
ctypes::c_void,
shared::minwindef::WORD,
um::{
sysinfoapi::{GetNativeSystemInfo, SYSTEM_INFO},
winnt::{
PROCESSOR_ARCHITECTURE_ALPHA,
PROCESSOR_ARCHITECTURE_ALPHA64,
PROCESSOR_ARCHITECTURE_AMD64,
PROCESSOR_ARCHITECTURE_ARM,
PROCESSOR_ARCHITECTURE_ARM32_ON_WIN64,
PROCESSOR_ARCHITECTURE_ARM64,
PROCESSOR_ARCHITECTURE_IA32_ON_ARM64,
PROCESSOR_ARCHITECTURE_IA32_ON_WIN64,
PROCESSOR_ARCHITECTURE_IA64,
PROCESSOR_ARCHITECTURE_INTEL,
PROCESSOR_ARCHITECTURE_MIPS,
PROCESSOR_ARCHITECTURE_MSIL,
PROCESSOR_ARCHITECTURE_NEUTRAL,
PROCESSOR_ARCHITECTURE_PPC,
PROCESSOR_ARCHITECTURE_SHX,
},
},
};
#[derive(Debug, Copy, Clone, Eq, PartialEq, Hash)]
pub enum ProcessorArchitecture {
AMD64,
Alpha,
Alpha64,
ARM,
ARM64,
IA64,
Intel,
PPC,
SHX,
MIPS,
MSIL,
Neutral,
ARM32OnWin64,
IA32OnWin64,
IA32OnARM64,
Unknown,
}
impl From<WORD> for ProcessorArchitecture {
fn from(processor_architecture: WORD) -> ProcessorArchitecture {
match processor_architecture {
PROCESSOR_ARCHITECTURE_AMD64 => ProcessorArchitecture::AMD64,
PROCESSOR_ARCHITECTURE_ARM => ProcessorArchitecture::ARM,
PROCESSOR_ARCHITECTURE_ARM64 => ProcessorArchitecture::ARM64,
PROCESSOR_ARCHITECTURE_ALPHA64 => ProcessorArchitecture::Alpha64,
PROCESSOR_ARCHITECTURE_PPC => ProcessorArchitecture::PPC,
PROCESSOR_ARCHITECTURE_SHX => ProcessorArchitecture::SHX,
PROCESSOR_ARCHITECTURE_IA64 => ProcessorArchitecture::IA64,
PROCESSOR_ARCHITECTURE_MIPS => ProcessorArchitecture::MIPS,
PROCESSOR_ARCHITECTURE_MSIL => ProcessorArchitecture::MSIL,
PROCESSOR_ARCHITECTURE_ALPHA => ProcessorArchitecture::Alpha,
PROCESSOR_ARCHITECTURE_INTEL => ProcessorArchitecture::Intel,
PROCESSOR_ARCHITECTURE_NEUTRAL => ProcessorArchitecture::Neutral,
PROCESSOR_ARCHITECTURE_IA32_ON_ARM64 => ProcessorArchitecture::IA32OnARM64,
PROCESSOR_ARCHITECTURE_IA32_ON_WIN64 => ProcessorArchitecture::IA32OnWin64,
PROCESSOR_ARCHITECTURE_ARM32_ON_WIN64 => ProcessorArchitecture::ARM32OnWin64,
_ => ProcessorArchitecture::Unknown,
}
}
}
#[derive(Debug, Copy, Clone, Eq, PartialEq, Hash)]
pub struct SystemInfo {
pub processor_architecture: ProcessorArchitecture,
pub page_size: u32,
pub minimum_application_address: *mut c_void,
pub maximum_application_address: *mut c_void,
pub active_processor_mask: usize,
pub processor_count: u32,
pub allocation_granularity: u32,
pub processor_level: u16,
pub processor_revision: u16,
}
unsafe impl Send for SystemInfo {}
unsafe impl Sync for SystemInfo {}
pub fn system_info() -> SystemInfo {
unsafe {
let mut system_info: SYSTEM_INFO = mem::zeroed();
GetNativeSystemInfo(&mut system_info);
system_info.into()
}
}
impl From<SYSTEM_INFO> for SystemInfo {
fn from(system_info: SYSTEM_INFO) -> SystemInfo {
unsafe {
SystemInfo {
processor_architecture: system_info.u.s().wProcessorArchitecture.into(),
page_size: system_info.dwPageSize,
minimum_application_address: system_info.lpMinimumApplicationAddress,
maximum_application_address: system_info.lpMaximumApplicationAddress,
active_processor_mask: system_info.dwActiveProcessorMask,
processor_count: system_info.dwNumberOfProcessors,
allocation_granularity: system_info.dwAllocationGranularity,
processor_level: system_info.wProcessorLevel,
processor_revision: system_info.wProcessorRevision,
}
}
}
}