Guest User

Untitled

a guest
Aug 16th, 2018
88
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 1.28 KB | None | 0 0
  1. pub struct SubclassedWndProc {
  2. old_wnd_proc: WNDPROC,
  3. config: Config
  4. }
  5.  
  6. impl SubclassedWndProc {
  7. pub fn new(config: &Config) { //-> Self {
  8. let mut new_proc = SubclassedWndProc{ old_wnd_proc: None, config: *config };
  9.  
  10. // Subclasses window and gets the old WndProc function location in memory
  11. let proc_location = unsafe { SetWindowLongA(&mut *config.h_hammer_hwnd, GWL_WNDPROC, wnd_proc as i32) } as isize;
  12.  
  13. // convert old wndproc memory location to function pointer
  14. let old_wnd_proc = unsafe {
  15. mem::transmute::<isize, unsafe extern "system" fn(HWND, u32, usize, isize) -> LRESULT>(proc_location)
  16. };
  17. new_proc.old_wnd_proc = Some(old_wnd_proc);
  18.  
  19. unsafe { G_SUBCLASSED_PROXY = mem::transmute::<Mutex<SubclassedWndProc>, G_SUBCLASSED_PROXY>(Mutex::new(new_proc)) };
  20. // G_SUBCLASSED_PROXY.set_value(new_proc);
  21. // new_proc
  22. }
  23. }
  24.  
  25. #[no_mangle]
  26. #[allow(private_no_mangle_fns)]
  27. unsafe extern "system" fn wnd_proc(hwnd: HWND, message: u32, w_param: WPARAM, l_param: LPARAM) -> LRESULT {
  28. match message {
  29. // do stuff here
  30. }
  31. CallWindowProcA(G_SUBCLASSED_PROXY.lock().unwrap().old_wnd_proc, hwnd, message, w_param, l_param)
  32. }
  33.  
  34. lazy_static! {
  35. pub static ref G_SUBCLASSED_PROXY: Mutex<SubclassedWndProc> = Mutex::new(SubclassedWndProc {
  36. old_wnd_proc: None,
  37. config: Config::default()
  38. });
  39. }
Add Comment
Please, Sign In to add comment