Crates.io | vmt-hook |
lib.rs | vmt-hook |
version | 0.2.0 |
source | src |
created_at | 2023-12-18 23:26:07.349746 |
updated_at | 2024-01-18 01:15:28.955713 |
description | Virtual method table hook library |
homepage | https://github.com/RinatNamazov/vmt-hook |
repository | https://github.com/RinatNamazov/vmt-hook |
max_upload_size | |
id | 1073774 |
size | 10,112 |
This library provides the ability to hook Virtual Method Tables (VMT).
It works by copying the original VMT and then swapping it out with the modified version.
Add this to your Cargo.toml
:
[dependencies]
vmt-hook = { version = "0.2.0" }
use vmt_hook::VTableHook;
use windows::{
core::HRESULT,
Win32::{
Foundation::{HWND, RECT},
Graphics::{
Direct3D9::IDirect3DDevice9,
Gdi::RGNDATA,
},
},
};
type FnPresent = extern "stdcall" fn(
IDirect3DDevice9,
*const RECT,
*const RECT,
HWND,
*const RGNDATA,
) -> HRESULT;
static mut ORIGINAL_PRESENT: Option<FnPresent> = None;
extern "stdcall" fn hk_present(
device: IDirect3DDevice9,
source_rect: *const RECT,
dest_rect: *const RECT,
dest_window_override: HWND,
dirty_region: *const RGNDATA,
) -> HRESULT {
// Your code.
unsafe {
let original_present = ORIGINAL_PRESENT.unwrap();
original_present(device, source_rect, dest_rect, dest_window_override, dirty_region)
}
}
unsafe fn instal_d3d9_hook() {
let device: IDirect3DDevice9 = /* Your ptr. */;
// Creating a hook with automatic detection of the number of methods in its VMT.
// let hook = VTableHook::new(device);
// If you know the number of methods in the table, you can specify it manually.
let hook = VTableHook::with_count(device, 119);
// Getting the original method.
ORIGINAL_PRESENT = Some(std::mem::transmute(hook.get_original_method(17)));
// Replacing the method at index 17 in the VMT with our function.
hook.replace_method(17, hk_present as usize);
}