cross compiling support (with x86_64-pc-windows-gnu on linux) #2
4 changed files with 58 additions and 166 deletions
11
build.rs
11
build.rs
|
@ -1,11 +0,0 @@
|
||||||
fn main() {
|
|
||||||
cc::Build::new().file("version.asm").compile("version");
|
|
||||||
|
|
||||||
println!("cargo:rerun-if-changed=version.asm");
|
|
||||||
println!(
|
|
||||||
"cargo:rustc-link-search=native={}",
|
|
||||||
std::env::var("OUT_DIR").unwrap()
|
|
||||||
);
|
|
||||||
println!("cargo:rustc-link-lib=static=version");
|
|
||||||
println!("cargo:rustc-link-arg=/DEF:version.def");
|
|
||||||
}
|
|
|
@ -1,29 +1,7 @@
|
||||||
use libloading::{Error, Library, Symbol};
|
use libloading::{Error, Library, Symbol};
|
||||||
|
use std::arch::asm;
|
||||||
use std::env;
|
use std::env;
|
||||||
use std::ffi::CStr;
|
use std::ffi::{CStr, CString};
|
||||||
|
|
||||||
static FUNCTION_NAMES: &[&CStr] = &[
|
|
||||||
c"GetFileVersionInfoA",
|
|
||||||
c"GetFileVersionInfoByHandle",
|
|
||||||
c"GetFileVersionInfoExA",
|
|
||||||
c"GetFileVersionInfoExW",
|
|
||||||
c"GetFileVersionInfoSizeA",
|
|
||||||
c"GetFileVersionInfoSizeExA",
|
|
||||||
c"GetFileVersionInfoSizeExW",
|
|
||||||
c"GetFileVersionInfoSizeW",
|
|
||||||
c"GetFileVersionInfoW",
|
|
||||||
c"VerFindFileA",
|
|
||||||
c"VerFindFileW",
|
|
||||||
c"VerInstallFileA",
|
|
||||||
c"VerInstallFileW",
|
|
||||||
c"VerLanguageNameA",
|
|
||||||
c"VerLanguageNameW",
|
|
||||||
c"VerQueryValueA",
|
|
||||||
c"VerQueryValueW",
|
|
||||||
];
|
|
||||||
|
|
||||||
#[no_mangle]
|
|
||||||
static mut ORIGINAL_FUNCTIONS: [*const usize; 17] = [0 as *const usize; 17];
|
|
||||||
|
|
||||||
pub struct VersionDllProxy {
|
pub struct VersionDllProxy {
|
||||||
library: Library,
|
library: Library,
|
||||||
|
@ -52,3 +30,59 @@ impl VersionDllProxy {
|
||||||
Ok(())
|
Ok(())
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
macro_rules! count_exprs {
|
||||||
|
() => {0usize};
|
||||||
|
($head:expr, $($tail:expr,)*) => {1usize + count_exprs!($($tail,)*)};
|
||||||
|
}
|
||||||
|
|
||||||
|
macro_rules! version_dll_proxy {
|
||||||
|
($($fn_name:ident),*) => {
|
||||||
|
static FUNCTION_NAMES: &[&CStr] = &[
|
||||||
|
$(
|
||||||
|
unsafe { CStr::from_bytes_with_nul_unchecked(concat!(stringify!($fn_name), "\0").as_bytes()) }
|
||||||
|
),*,
|
||||||
|
];
|
||||||
|
|
||||||
|
#[no_mangle]
|
||||||
|
static mut ORIGINAL_FUNCTIONS: [*const usize; count_exprs!($($fn_name,)*)] = [0 as *const usize; count_exprs!($($fn_name,)*)];
|
||||||
|
|
||||||
|
$(
|
||||||
|
#[no_mangle]
|
||||||
|
extern "C" fn $fn_name() {
|
||||||
|
let function_name = FUNCTION_NAMES
|
||||||
|
.iter()
|
||||||
|
.position(|&name| name == CString::new(stringify!($fn_name)).unwrap().as_ref())
|
||||||
|
.unwrap();
|
||||||
|
let fn_addr = unsafe { ORIGINAL_FUNCTIONS[function_name] };
|
||||||
|
unsafe {
|
||||||
|
asm! {
|
||||||
|
"call {tmp}",
|
||||||
|
tmp = in(reg) fn_addr,
|
||||||
|
clobber_abi("C")
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
)*
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
version_dll_proxy! {
|
||||||
|
GetFileVersionInfoA,
|
||||||
|
GetFileVersionInfoByHandle,
|
||||||
|
GetFileVersionInfoExA,
|
||||||
|
GetFileVersionInfoExW,
|
||||||
|
GetFileVersionInfoSizeA,
|
||||||
|
GetFileVersionInfoSizeExA,
|
||||||
|
GetFileVersionInfoSizeExW,
|
||||||
|
GetFileVersionInfoSizeW,
|
||||||
|
GetFileVersionInfoW,
|
||||||
|
VerFindFileA,
|
||||||
|
VerFindFileW,
|
||||||
|
VerInstallFileA,
|
||||||
|
VerInstallFileW,
|
||||||
|
VerLanguageNameA,
|
||||||
|
VerLanguageNameW,
|
||||||
|
VerQueryValueA,
|
||||||
|
VerQueryValueW
|
||||||
|
}
|
||||||
|
|
112
version.asm
112
version.asm
|
@ -1,112 +0,0 @@
|
||||||
ifdef RAX
|
|
||||||
.code
|
|
||||||
extern ORIGINAL_FUNCTIONS:QWORD
|
|
||||||
GetFileVersionInfoA proc
|
|
||||||
jmp QWORD ptr ORIGINAL_FUNCTIONS[0 * 8]
|
|
||||||
GetFileVersionInfoA endp
|
|
||||||
GetFileVersionInfoByHandle proc
|
|
||||||
jmp QWORD ptr ORIGINAL_FUNCTIONS[1 * 8]
|
|
||||||
GetFileVersionInfoByHandle endp
|
|
||||||
GetFileVersionInfoExA proc
|
|
||||||
jmp QWORD ptr ORIGINAL_FUNCTIONS[2 * 8]
|
|
||||||
GetFileVersionInfoExA endp
|
|
||||||
GetFileVersionInfoExW proc
|
|
||||||
jmp QWORD ptr ORIGINAL_FUNCTIONS[3 * 8]
|
|
||||||
GetFileVersionInfoExW endp
|
|
||||||
GetFileVersionInfoSizeA proc
|
|
||||||
jmp QWORD ptr ORIGINAL_FUNCTIONS[4 * 8]
|
|
||||||
GetFileVersionInfoSizeA endp
|
|
||||||
GetFileVersionInfoSizeExA proc
|
|
||||||
jmp QWORD ptr ORIGINAL_FUNCTIONS[5 * 8]
|
|
||||||
GetFileVersionInfoSizeExA endp
|
|
||||||
GetFileVersionInfoSizeExW proc
|
|
||||||
jmp QWORD ptr ORIGINAL_FUNCTIONS[6 * 8]
|
|
||||||
GetFileVersionInfoSizeExW endp
|
|
||||||
GetFileVersionInfoSizeW proc
|
|
||||||
jmp QWORD ptr ORIGINAL_FUNCTIONS[7 * 8]
|
|
||||||
GetFileVersionInfoSizeW endp
|
|
||||||
GetFileVersionInfoW proc
|
|
||||||
jmp QWORD ptr ORIGINAL_FUNCTIONS[8 * 8]
|
|
||||||
GetFileVersionInfoW endp
|
|
||||||
VerFindFileA proc
|
|
||||||
jmp QWORD ptr ORIGINAL_FUNCTIONS[9 * 8]
|
|
||||||
VerFindFileA endp
|
|
||||||
VerFindFileW proc
|
|
||||||
jmp QWORD ptr ORIGINAL_FUNCTIONS[10 * 8]
|
|
||||||
VerFindFileW endp
|
|
||||||
VerInstallFileA proc
|
|
||||||
jmp QWORD ptr ORIGINAL_FUNCTIONS[11 * 8]
|
|
||||||
VerInstallFileA endp
|
|
||||||
VerInstallFileW proc
|
|
||||||
jmp QWORD ptr ORIGINAL_FUNCTIONS[12 * 8]
|
|
||||||
VerInstallFileW endp
|
|
||||||
VerLanguageNameA proc
|
|
||||||
jmp QWORD ptr ORIGINAL_FUNCTIONS[13 * 8]
|
|
||||||
VerLanguageNameA endp
|
|
||||||
VerLanguageNameW proc
|
|
||||||
jmp QWORD ptr ORIGINAL_FUNCTIONS[14 * 8]
|
|
||||||
VerLanguageNameW endp
|
|
||||||
VerQueryValueA proc
|
|
||||||
jmp QWORD ptr ORIGINAL_FUNCTIONS[15 * 8]
|
|
||||||
VerQueryValueA endp
|
|
||||||
VerQueryValueW proc
|
|
||||||
jmp QWORD ptr ORIGINAL_FUNCTIONS[16 * 8]
|
|
||||||
VerQueryValueW endp
|
|
||||||
else
|
|
||||||
.model flat, C
|
|
||||||
.stack 4096
|
|
||||||
.code
|
|
||||||
extern ORIGINAL_FUNCTIONS:DWORD
|
|
||||||
GetFileVersionInfoA proc
|
|
||||||
jmp DWORD ptr ORIGINAL_FUNCTIONS[0 * 4]
|
|
||||||
GetFileVersionInfoA endp
|
|
||||||
GetFileVersionInfoByHandle proc
|
|
||||||
jmp DWORD ptr ORIGINAL_FUNCTIONS[1 * 4]
|
|
||||||
GetFileVersionInfoByHandle endp
|
|
||||||
GetFileVersionInfoExA proc
|
|
||||||
jmp DWORD ptr ORIGINAL_FUNCTIONS[2 * 4]
|
|
||||||
GetFileVersionInfoExA endp
|
|
||||||
GetFileVersionInfoExW proc
|
|
||||||
jmp DWORD ptr ORIGINAL_FUNCTIONS[3 * 4]
|
|
||||||
GetFileVersionInfoExW endp
|
|
||||||
GetFileVersionInfoSizeA proc
|
|
||||||
jmp DWORD ptr ORIGINAL_FUNCTIONS[4 * 4]
|
|
||||||
GetFileVersionInfoSizeA endp
|
|
||||||
GetFileVersionInfoSizeExA proc
|
|
||||||
jmp DWORD ptr ORIGINAL_FUNCTIONS[5 * 4]
|
|
||||||
GetFileVersionInfoSizeExA endp
|
|
||||||
GetFileVersionInfoSizeExW proc
|
|
||||||
jmp DWORD ptr ORIGINAL_FUNCTIONS[6 * 4]
|
|
||||||
GetFileVersionInfoSizeExW endp
|
|
||||||
GetFileVersionInfoSizeW proc
|
|
||||||
jmp DWORD ptr ORIGINAL_FUNCTIONS[7 * 4]
|
|
||||||
GetFileVersionInfoSizeW endp
|
|
||||||
GetFileVersionInfoW proc
|
|
||||||
jmp DWORD ptr ORIGINAL_FUNCTIONS[8 * 4]
|
|
||||||
GetFileVersionInfoW endp
|
|
||||||
VerFindFileA proc
|
|
||||||
jmp DWORD ptr ORIGINAL_FUNCTIONS[9 * 4]
|
|
||||||
VerFindFileA endp
|
|
||||||
VerFindFileW proc
|
|
||||||
jmp DWORD ptr ORIGINAL_FUNCTIONS[10 * 4]
|
|
||||||
VerFindFileW endp
|
|
||||||
VerInstallFileA proc
|
|
||||||
jmp DWORD ptr ORIGINAL_FUNCTIONS[11 * 4]
|
|
||||||
VerInstallFileA endp
|
|
||||||
VerInstallFileW proc
|
|
||||||
jmp DWORD ptr ORIGINAL_FUNCTIONS[12 * 4]
|
|
||||||
VerInstallFileW endp
|
|
||||||
VerLanguageNameA proc
|
|
||||||
jmp DWORD ptr ORIGINAL_FUNCTIONS[13 * 4]
|
|
||||||
VerLanguageNameA endp
|
|
||||||
VerLanguageNameW proc
|
|
||||||
jmp DWORD ptr ORIGINAL_FUNCTIONS[14 * 4]
|
|
||||||
VerLanguageNameW endp
|
|
||||||
VerQueryValueA proc
|
|
||||||
jmp DWORD ptr ORIGINAL_FUNCTIONS[15 * 4]
|
|
||||||
VerQueryValueA endp
|
|
||||||
VerQueryValueW proc
|
|
||||||
jmp DWORD ptr ORIGINAL_FUNCTIONS[16 * 4]
|
|
||||||
VerQueryValueW endp
|
|
||||||
endif
|
|
||||||
end
|
|
19
version.def
19
version.def
|
@ -1,19 +0,0 @@
|
||||||
|
|
||||||
EXPORTS
|
|
||||||
GetFileVersionInfoA
|
|
||||||
GetFileVersionInfoByHandle
|
|
||||||
GetFileVersionInfoExA
|
|
||||||
GetFileVersionInfoExW
|
|
||||||
GetFileVersionInfoSizeA
|
|
||||||
GetFileVersionInfoSizeExA
|
|
||||||
GetFileVersionInfoSizeExW
|
|
||||||
GetFileVersionInfoSizeW
|
|
||||||
GetFileVersionInfoW
|
|
||||||
VerFindFileA
|
|
||||||
VerFindFileW
|
|
||||||
VerInstallFileA
|
|
||||||
VerInstallFileW
|
|
||||||
VerLanguageNameA
|
|
||||||
VerLanguageNameW
|
|
||||||
VerQueryValueA
|
|
||||||
VerQueryValueW
|
|
Loading…
Reference in a new issue