d3d9-offsets.cpp 2.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100
  1. #define _CRT_SECURE_NO_WARNINGS
  2. #include <stdio.h>
  3. #include <windows.h>
  4. #include <d3d9.h>
  5. #include "get-graphics-offsets.h"
  6. typedef HRESULT (WINAPI *d3d9createex_t)(UINT, IDirect3D9Ex**);
  7. struct d3d9_info {
  8. HMODULE module;
  9. HWND hwnd;
  10. IDirect3D9Ex *d3d9ex;
  11. IDirect3DDevice9Ex *device;
  12. IDirect3DSwapChain9 *swap;
  13. };
  14. static inline bool d3d9_init(d3d9_info &info)
  15. {
  16. d3d9createex_t create;
  17. HRESULT hr;
  18. info.hwnd = CreateWindowExA(0, DUMMY_WNDCLASS, "d3d9 get-offset window",
  19. WS_POPUP, 0, 0, 1, 1, nullptr, nullptr,
  20. GetModuleHandleA(nullptr), nullptr);
  21. if (!info.hwnd) {
  22. return false;
  23. }
  24. info.module = LoadLibraryA("d3d9.dll");
  25. if (!info.module) {
  26. return false;
  27. }
  28. create = (d3d9createex_t)GetProcAddress(info.module,
  29. "Direct3DCreate9Ex");
  30. if (!create) {
  31. return false;
  32. }
  33. hr = create(D3D_SDK_VERSION, &info.d3d9ex);
  34. if (FAILED(hr)) {
  35. return false;
  36. }
  37. D3DPRESENT_PARAMETERS pp = {};
  38. pp.Windowed = true;
  39. pp.SwapEffect = D3DSWAPEFFECT_FLIP;
  40. pp.BackBufferFormat = D3DFMT_A8R8G8B8;
  41. pp.BackBufferWidth = 2;
  42. pp.BackBufferHeight = 2;
  43. pp.BackBufferCount = 1;
  44. pp.hDeviceWindow = info.hwnd;
  45. pp.PresentationInterval = D3DPRESENT_INTERVAL_IMMEDIATE;
  46. hr = info.d3d9ex->CreateDeviceEx(D3DADAPTER_DEFAULT, D3DDEVTYPE_HAL,
  47. info.hwnd,
  48. D3DCREATE_HARDWARE_VERTEXPROCESSING |
  49. D3DCREATE_NOWINDOWCHANGES, &pp, nullptr, &info.device);
  50. if (FAILED(hr)) {
  51. return false;
  52. }
  53. hr = info.device->GetSwapChain(0, &info.swap);
  54. if (FAILED(hr)) {
  55. return false;
  56. }
  57. return true;
  58. }
  59. static inline void d3d9_free(d3d9_info &info)
  60. {
  61. if (info.swap)
  62. info.swap->Release();
  63. if (info.device)
  64. info.device->Release();
  65. if (info.d3d9ex)
  66. info.d3d9ex->Release();
  67. if (info.hwnd)
  68. DestroyWindow(info.hwnd);
  69. }
  70. void get_d3d9_offsets(struct d3d9_offsets *offsets)
  71. {
  72. d3d9_info info = {};
  73. bool success = d3d9_init(info);
  74. if (success) {
  75. offsets->present = vtable_offset(info.module, info.device, 17);
  76. offsets->reset = vtable_offset(info.module, info.device, 16);
  77. offsets->present_ex = vtable_offset(info.module, info.device,
  78. 121);
  79. offsets->reset_ex = vtable_offset(info.module, info.device,
  80. 132);
  81. offsets->present_swap = vtable_offset(info.module, info.swap,
  82. 3);
  83. }
  84. d3d9_free(info);
  85. }