-
Notifications
You must be signed in to change notification settings - Fork 4
Description
Currently bindings are restricted to windows and x86_64/x86. This is reflected in the src/ffi/generated.rs:
compile_error!("These bindings can only be used on `x86_64` architectures. To generate bindings for your target architecture, consider using the `regenerate` feature.");There are two reasons I found for this:
- The
ctycrate depends on thetargetto create ctype definitions externblocks rely on linked symbols and ABIs such asstdcallmay not be possible on other targets.
My use case is such that I wish to use structures such as PPEB on non-native targets such as i686-unknown-linux-gnu.
This being the case I forked this repository, which can be found here: https://github.com/Irate-Walrus/phnt-rs
In this fork I introduced a pre-generated x86_64_bindgen.rs and x86_bindgen.rs as well as two feature flags externs and fn_types.
externs allows externally linked symbols to be enabled/disabled:
#[cfg(feature="externs")]
extern "C" {
pub static GUID_NULL: GUID;
pub static mut NlsAnsiCodePage: USHORT;
...While fn_types defines the externally linked functions as types:
#[cfg(feature="fn_types")]
mod fn_types {
pub type NtCallbackReturnFn = unsafe extern "C" fn(OutputBuffer: PVOID, OutputLength: ULONG, Status: NTSTATUS) -> NTSTATUS;
pub type NtFlushProcessWriteBuffersFn = unsafe extern "C" fn() -> NTSTATUS;
pub type NtQueryDebugFilterStateFn = unsafe extern "C" fn(ComponentId: ULONG, Level: ULONG) -> NTSTATUS;
...This is helpful if you are trying to call these functions directly in memory:
let rtl_allocate_heap: RtlAllocateHeapFn = core::mem::transmute(rtl_allocate_heap_addr);
let ptr = rtl_allocate_heap(self.handle(), HEAP_ZERO_MEMORY, layout.size() as _)I've also added to the GitHub workflows to auto-regenerate both x86 and x86_64 bindings and commit them to the repo.
There are a few issues that I've seen so far:
- Bad regexes in my
build.rslead to failure with the latest bindgen version0.71.1 - Dropping the use of
ctyfor internally defined ctypes may break compatibility with pre-existing users. - Custom
rustfmtto allow for the use of regex when feature-gating externs and function types.
This issue is to gauge your interest in these changes, although it's likely I may continue in the fork to add further definitions from other header files. Thanks for you hard work, it made these changes relatively straightforward.