diff --git a/src/hooks/dx11.rs b/src/hooks/dx11.rs index d71a192..0f7ac74 100644 --- a/src/hooks/dx11.rs +++ b/src/hooks/dx11.rs @@ -133,8 +133,12 @@ fn get_target_addrs() -> DXGISwapChainPresentType { let swap_chain = p_swap_chain.unwrap(); - let present_ptr: DXGISwapChainPresentType = - unsafe { mem::transmute(swap_chain.vtable().Present) }; + let present_ptr: DXGISwapChainPresentType = unsafe { + mem::transmute::< + unsafe extern "system" fn(*mut c_void, u32, u32) -> HRESULT, + DXGISwapChainPresentType, + >(swap_chain.vtable().Present) + }; present_ptr } @@ -167,7 +171,9 @@ impl ImguiDx11Hooks { RENDER_LOOP.get_or_init(|| Box::new(t)); TRAMPOLINES.get_or_init(|| Trampolines { - dxgi_swap_chain_present: mem::transmute(hook_present.trampoline()), + dxgi_swap_chain_present: mem::transmute::<*mut c_void, DXGISwapChainPresentType>( + hook_present.trampoline(), + ), }); Self([hook_present]) diff --git a/src/hooks/dx12.rs b/src/hooks/dx12.rs index 2e687eb..0ff8022 100644 --- a/src/hooks/dx12.rs +++ b/src/hooks/dx12.rs @@ -276,9 +276,17 @@ impl ImguiDx12Hooks { RENDER_LOOP.get_or_init(|| Box::new(t)); TRAMPOLINES.get_or_init(|| Trampolines { - dxgi_swap_chain_present: mem::transmute(hook_present.trampoline()), - dxgi_swap_chain_resize_buffers: mem::transmute(hook_resize_buffers.trampoline()), - d3d12_command_queue_execute_command_lists: mem::transmute(hook_cqecl.trampoline()), + dxgi_swap_chain_present: mem::transmute::<*mut c_void, DXGISwapChainPresentType>( + hook_present.trampoline(), + ), + dxgi_swap_chain_resize_buffers: mem::transmute::< + *mut c_void, + DXGISwapChainResizeBuffersType, + >(hook_resize_buffers.trampoline()), + d3d12_command_queue_execute_command_lists: mem::transmute::< + *mut c_void, + D3D12CommandQueueExecuteCommandListsType, + >(hook_cqecl.trampoline()), }); Self([hook_present, hook_resize_buffers, hook_cqecl]) diff --git a/src/hooks/dx9.rs b/src/hooks/dx9.rs index ed730a9..92a1301 100644 --- a/src/hooks/dx9.rs +++ b/src/hooks/dx9.rs @@ -151,7 +151,24 @@ fn get_target_addrs() -> (Dx9PresentType, Dx9ResetType) { let present_ptr = device.vtable().Present; let reset_ptr = device.vtable().Reset; - unsafe { (mem::transmute(present_ptr), mem::transmute(reset_ptr)) } + unsafe { + ( + mem::transmute::< + unsafe extern "system" fn( + *mut c_void, + *const RECT, + *const RECT, + HWND, + *const RGNDATA, + ) -> HRESULT, + Dx9PresentType, + >(present_ptr), + mem::transmute::< + unsafe extern "system" fn(*mut c_void, *mut D3DPRESENT_PARAMETERS) -> HRESULT, + Dx9ResetType, + >(reset_ptr), + ) + } } /// Hooks for DirectX 9. @@ -182,8 +199,8 @@ impl ImguiDx9Hooks { RENDER_LOOP.get_or_init(|| Box::new(t)); TRAMPOLINES.get_or_init(|| Trampolines { - dx9_present: mem::transmute(hook_present.trampoline()), - dx9_reset: mem::transmute(hook_reset.trampoline()), + dx9_present: mem::transmute::<*mut c_void, Dx9PresentType>(hook_present.trampoline()), + dx9_reset: mem::transmute::<*mut c_void, Dx9ResetType>(hook_reset.trampoline()), }); Self([hook_present, hook_reset]) diff --git a/src/hooks/opengl3.rs b/src/hooks/opengl3.rs index 452591f..0245d86 100644 --- a/src/hooks/opengl3.rs +++ b/src/hooks/opengl3.rs @@ -1,6 +1,6 @@ //! Hooks for OpenGL 3. -use std::ffi::CString; +use std::ffi::{c_void, CString}; use std::mem; use std::sync::OnceLock; @@ -86,7 +86,9 @@ unsafe fn get_opengl_wglswapbuffers_addr() -> OpenGl32wglSwapBuffersType { let wglswapbuffers_func = GetProcAddress(opengl32module, PCSTR(wglswapbuffers.as_ptr() as *mut _)).unwrap(); - mem::transmute(wglswapbuffers_func) + mem::transmute:: isize, OpenGl32wglSwapBuffersType>( + wglswapbuffers_func, + ) } /// Hooks for OpenGL 3. @@ -119,7 +121,7 @@ impl ImguiOpenGl3Hooks { // Initialize the render loop and store detours RENDER_LOOP.get_or_init(move || Box::new(t)); TRAMPOLINES.get_or_init(|| Trampolines { - opengl32_wgl_swap_buffers: std::mem::transmute( + opengl32_wgl_swap_buffers: mem::transmute::<*mut c_void, OpenGl32wglSwapBuffersType>( hook_opengl_wgl_swap_buffers.trampoline(), ), }); diff --git a/src/inject.rs b/src/inject.rs index 55a692a..aa62259 100644 --- a/src/inject.rs +++ b/src/inject.rs @@ -1,5 +1,6 @@ //! Facilities for injecting compiled DLLs into target processes. +use std::ffi::c_void; use std::mem::{self, size_of}; use std::path::PathBuf; @@ -58,7 +59,7 @@ impl Process { WriteProcessMemory( self.0, dll_path_buf, - dll_path.as_ptr() as *const std::ffi::c_void, + dll_path.as_ptr() as *const c_void, (MAX_PATH as usize) * size_of::(), Some(&mut bytes_written), ) @@ -71,7 +72,12 @@ impl Process { self.0, None, 0, - Some(std::mem::transmute(proc_addr)), + proc_addr.map(|proc_addr| { + mem::transmute::< + unsafe extern "system" fn() -> isize, + unsafe extern "system" fn(*mut c_void) -> u32, + >(proc_addr) + }), Some(dll_path_buf), 0, None, diff --git a/src/renderer/backend/opengl3.rs b/src/renderer/backend/opengl3.rs index c721383..61f6e16 100644 --- a/src/renderer/backend/opengl3.rs +++ b/src/renderer/backend/opengl3.rs @@ -23,7 +23,12 @@ mod gl { clippy::too_many_arguments, clippy::unused_unit, clippy::upper_case_acronyms, - clippy::manual_non_exhaustive + clippy::manual_non_exhaustive, + + // We support stable but lint on nightly. The following lint isn't available on stable, + // so allow `unknown_lints`. + unknown_lints, + clippy::missing_transmute_annotations )] include!(concat!(env!("OUT_DIR"), "/gl_bindings.rs")); diff --git a/src/renderer/pipeline.rs b/src/renderer/pipeline.rs index aea75a6..c45bf17 100644 --- a/src/renderer/pipeline.rs +++ b/src/renderer/pipeline.rs @@ -65,7 +65,16 @@ impl Pipeline { } let wnd_proc = unsafe { - mem::transmute(SetWindowLongPtrA(hwnd, GWLP_WNDPROC, pipeline_wnd_proc as usize as _)) + #[cfg(target_arch = "x86")] + type SwlpRet = i32; + #[cfg(target_arch = "x86_64")] + type SwlpRet = isize; + + mem::transmute::(SetWindowLongPtrA( + hwnd, + GWLP_WNDPROC, + pipeline_wnd_proc as usize as _, + )) }; let (tx, rx) = mpsc::channel();