d3d9-offsets.cpp 2.2 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697
  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->present_ex = vtable_offset(info.module, info.device,
  77. 121);
  78. offsets->present_swap = vtable_offset(info.module, info.swap,
  79. 3);
  80. }
  81. d3d9_free(info);
  82. }