2个不稳定版本
0.2.0 | 2024年1月18日 |
---|---|
0.1.0 | 2023年12月18日 |
#331 in 图形API
每月21次下载
10KB
65 行
此库提供挂钩虚拟方法表(VMT)的功能。
它通过复制原始VMT然后将其与修改后的版本交换来实现。
安装
将以下内容添加到您的 Cargo.toml
[dependencies]
vmt-hook = { version = "0.2.0" }
示例
- 挂钩DirectX 9中的'Present'方法。
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);
}