Advertisement
Guest User

Untitled

a guest
Dec 11th, 2019
131
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 2.84 KB | None | 0 0
  1. #pragma content(lib, "d3d9.lib")
  2. #pragma content(lib, "d3dx9.lib")
  3. #pragma content(lib, "detours.lib")
  4.  
  5. #include <Windows.h>
  6. #include <iostream>
  7. #include <string>
  8. #include <Detours.h>
  9. #include <imgui.h>
  10. #include "imgui.h"
  11. #include "imgui_impl_dx9.h"
  12. #include "imgui_impl_win32.h"
  13. #include <d3d9.h>
  14. #include <d3dx9.h>
  15.  
  16. typedef HRESULT(_stdcall* EndScene)(LPDIRECT3DDEVICE9 pDevice);
  17. HRESULT _stdcall hkEndScene(LPDIRECT3DDEVICE9 pDevice);
  18. EndScene oEndScene;
  19.  
  20. LPDIRECT3DDEVICE9 g_pd3dDevice = NULL;
  21. IDirect3D9* g_pD3D = NULL;
  22. HWND window = NULL;
  23.  
  24. BOOL CALLBACK EnumWindowsCallback(HWND handle, LPARAM lParam)
  25. {
  26. DWORD wndProcID;
  27. GetWindowThreadProcessId(handle, &wndProcID);
  28.  
  29. if (GetCurrentProcessId() != wndProcID)
  30. {
  31. return TRUE;
  32. }
  33.  
  34. window = handle;
  35. return FALSE;
  36. }
  37.  
  38. HWND GetProcessWindow()
  39. {
  40. EnumWindows(EnumWindowsCallback, NULL);
  41. return window;
  42. }
  43.  
  44. bool GetD3D9Device(void** pTable, size_t size)
  45. {
  46. if (!pTable)
  47. {
  48. return false;
  49. }
  50.  
  51. g_pD3D = Direct3DCreate9(D3D_SDK_VERSION);
  52.  
  53. if (!g_pD3D)
  54. {
  55. return false;
  56. }
  57.  
  58. D3DPRESENT_PARAMETERS d3dpp = {};
  59. d3dpp.SwapEffect = D3DSWAPEFFECT_DISCARD;
  60. d3dpp.hDeviceWindow = GetProcessWindow();
  61. d3dpp.Windowed = false;
  62.  
  63. g_pD3D->CreateDevice(D3DADAPTER_DEFAULT, D3DDEVTYPE_HAL, d3dpp.hDeviceWindow,
  64. D3DCREATE_HARDWARE_VERTEXPROCESSING, &d3dpp, &g_pd3dDevice);
  65.  
  66. if (!g_pd3dDevice)
  67. {
  68. g_pD3D->Release();
  69. return false;
  70. }
  71.  
  72. memcpy(pTable, *reinterpret_cast<void***>(g_pd3dDevice), size);
  73. g_pd3dDevice->Release();
  74. g_pD3D->Release();
  75. return true;
  76. }
  77.  
  78. void CleanupDeviceD3D()
  79. {
  80. if (g_pd3dDevice)
  81. {
  82. g_pd3dDevice->Release();
  83. g_pd3dDevice = NULL;
  84. }
  85.  
  86. if (g_pD3D)
  87. {
  88. g_pD3D->Release();
  89. g_pD3D = NULL;
  90. }
  91. }
  92.  
  93. HRESULT _stdcall hkEndScene(LPDIRECT3DDEVICE9 pDevice)
  94. {
  95. static bool init = false;
  96.  
  97. if (!init)
  98. {
  99. MessageBoxA(0, "Hello!", "Hello from inside endscene!)", 0);
  100. init = true;
  101. }
  102.  
  103. return oEndScene(pDevice);
  104. }
  105.  
  106. DWORD WINAPI mainThread(PVOID base)
  107. {
  108. void* d3d9Device[119];
  109.  
  110. if (GetD3D9Device(d3d9Device, sizeof(d3d9Device)))
  111. {
  112. oEndScene = (EndScene)Detours::X86::DetourFunction((Detours::uint8_t*)d3d9Device[42], (Detours::uint8_t*)hkEndScene);
  113. while (true)
  114. {
  115. if (GetAsyncKeyState(VK_F10))
  116. {
  117. CleanupDeviceD3D();
  118. FreeLibraryAndExitThread(static_cast<HMODULE>(base), 1);
  119. }
  120. }
  121. }
  122.  
  123. FreeLibraryAndExitThread(static_cast<HMODULE>(base), 1);
  124. }
  125.  
  126. BOOL APIENTRY DllMain( HMODULE hModule,
  127. DWORD ul_reason_for_call,
  128. LPVOID lpReserved
  129. )
  130. {
  131. switch (ul_reason_for_call)
  132. {
  133. case DLL_PROCESS_ATTACH:
  134. CreateThread(nullptr, NULL, mainThread, hModule, NULL, nullptr);
  135. case DLL_THREAD_ATTACH:
  136. case DLL_THREAD_DETACH:
  137. case DLL_PROCESS_DETACH:
  138. break;
  139. }
  140. return TRUE;
  141. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement