mirror of
https://github.com/vosen/ZLUDA.git
synced 2025-08-03 06:40:21 +00:00
Refactor winapi calls to surface errors
This commit is contained in:
parent
611e289531
commit
6bd033c369
2 changed files with 238 additions and 179 deletions
29
src/bin.rs
29
src/bin.rs
|
@ -9,7 +9,8 @@ use std::ptr;
|
||||||
|
|
||||||
use clap::{App, AppSettings, Arg};
|
use clap::{App, AppSettings, Arg};
|
||||||
|
|
||||||
mod win_err;
|
#[macro_use]
|
||||||
|
mod win;
|
||||||
|
|
||||||
fn main() -> Result<(), Box<dyn Error>> {
|
fn main() -> Result<(), Box<dyn Error>> {
|
||||||
let matches = App::new("notCUDA injector")
|
let matches = App::new("notCUDA injector")
|
||||||
|
@ -47,7 +48,7 @@ fn main() -> Result<(), Box<dyn Error>> {
|
||||||
cmd_line.push(0);
|
cmd_line.push(0);
|
||||||
let mut startup_info = unsafe { mem::zeroed::<detours_sys::_STARTUPINFOW>() };
|
let mut startup_info = unsafe { mem::zeroed::<detours_sys::_STARTUPINFOW>() };
|
||||||
let mut proc_info = unsafe { mem::zeroed::<detours_sys::_PROCESS_INFORMATION>() };
|
let mut proc_info = unsafe { mem::zeroed::<detours_sys::_PROCESS_INFORMATION>() };
|
||||||
let process_success = unsafe {
|
os_call!(
|
||||||
detours_sys::DetourCreateProcessWithDllExW(
|
detours_sys::DetourCreateProcessWithDllExW(
|
||||||
ptr::null(),
|
ptr::null(),
|
||||||
cmd_line.as_mut_ptr(),
|
cmd_line.as_mut_ptr(),
|
||||||
|
@ -60,13 +61,25 @@ fn main() -> Result<(), Box<dyn Error>> {
|
||||||
&mut startup_info as *mut _,
|
&mut startup_info as *mut _,
|
||||||
&mut proc_info as *mut _,
|
&mut proc_info as *mut _,
|
||||||
"nvcuda_redirect.dll".as_ptr() as *const i8,
|
"nvcuda_redirect.dll".as_ptr() as *const i8,
|
||||||
Option::None,
|
Option::None
|
||||||
)
|
),
|
||||||
};
|
0
|
||||||
if process_success == 0 {
|
);
|
||||||
return Err(win_err::error_string(win_err::errno()))?;
|
|
||||||
}
|
|
||||||
Ok(())
|
Ok(())
|
||||||
|
/*
|
||||||
|
|
||||||
|
cmd_line.as_mut_ptr(),
|
||||||
|
ptr::null_mut(),
|
||||||
|
ptr::null_mut(),
|
||||||
|
0,
|
||||||
|
0x10,
|
||||||
|
ptr::null_mut(),
|
||||||
|
ptr::null(),
|
||||||
|
&mut startup_info as *mut _,
|
||||||
|
&mut proc_info as *mut _,
|
||||||
|
"nvcuda_redirect.dll".as_ptr() as *const i8,
|
||||||
|
Option::None,
|
||||||
|
*/
|
||||||
}
|
}
|
||||||
|
|
||||||
fn copy_to(from: &OsStr, to: &mut Vec<u16>) {
|
fn copy_to(from: &OsStr, to: &mut Vec<u16>) {
|
||||||
|
|
|
@ -1,10 +1,13 @@
|
||||||
#![allow(non_snake_case)]
|
#![allow(non_snake_case)]
|
||||||
|
|
||||||
|
use std::error;
|
||||||
|
use std::error::Error;
|
||||||
|
use std::fmt;
|
||||||
use std::ptr;
|
use std::ptr;
|
||||||
|
|
||||||
mod c {
|
mod c {
|
||||||
use std::ffi::c_void;
|
use std::ffi::c_void;
|
||||||
use std::os::raw::{c_ulong};
|
use std::os::raw::c_ulong;
|
||||||
|
|
||||||
pub type DWORD = c_ulong;
|
pub type DWORD = c_ulong;
|
||||||
pub type HANDLE = LPVOID;
|
pub type HANDLE = LPVOID;
|
||||||
|
@ -35,6 +38,49 @@ mod c {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
macro_rules! last_ident {
|
||||||
|
($i:ident) => {
|
||||||
|
stringify!($i)
|
||||||
|
};
|
||||||
|
($start:ident, $($cont:ident),+) => {
|
||||||
|
last_ident!($($cont),+)
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
macro_rules! os_call {
|
||||||
|
($($path:ident)::+ ($($args:expr),*), $success:expr) => {
|
||||||
|
let result = unsafe{ $($path)::+ ($($args),+) };
|
||||||
|
if result != $success {
|
||||||
|
let name = last_ident!($($path),+);
|
||||||
|
let err_code = $crate::win::errno();
|
||||||
|
Err($crate::win::OsError{
|
||||||
|
function: name,
|
||||||
|
error_code: err_code as u32,
|
||||||
|
message: $crate::win::error_string(err_code)
|
||||||
|
})?;
|
||||||
|
}
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
#[derive(Debug)]
|
||||||
|
pub struct OsError {
|
||||||
|
pub function: &'static str,
|
||||||
|
pub error_code: u32,
|
||||||
|
pub message: String,
|
||||||
|
}
|
||||||
|
|
||||||
|
impl fmt::Display for OsError {
|
||||||
|
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
|
||||||
|
write!(f, "{:?}", self)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
impl error::Error for OsError {
|
||||||
|
fn source(&self) -> Option<&(dyn error::Error + 'static)> {
|
||||||
|
None
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
pub fn errno() -> i32 {
|
pub fn errno() -> i32 {
|
||||||
unsafe { c::GetLastError() as i32 }
|
unsafe { c::GetLastError() as i32 }
|
||||||
}
|
}
|
Loading…
Add table
Add a link
Reference in a new issue