d3d8-offsets.cpp 1.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081
  1. #include <stdio.h>
  2. #include <windows.h>
  3. #include "../d3d8-api/d3d8.h"
  4. #include "get-graphics-offsets.h"
  5. typedef IDirect3D8 *(WINAPI *d3d8create_t)(UINT);
  6. struct d3d8_info {
  7. HMODULE module;
  8. HWND hwnd;
  9. IDirect3D8 *d3d8;
  10. IDirect3DDevice8 *device;
  11. };
  12. static inline bool d3d8_init(d3d8_info &info)
  13. {
  14. d3d8create_t create;
  15. HRESULT hr;
  16. info.hwnd = CreateWindowExA(0, DUMMY_WNDCLASS, "d3d8 get-addr window",
  17. WS_POPUP, 0, 0, 1, 1, nullptr, nullptr,
  18. GetModuleHandleA(nullptr), nullptr);
  19. if (!info.hwnd) {
  20. return false;
  21. }
  22. info.module = LoadLibraryA("d3d8.dll");
  23. if (!info.module) {
  24. return false;
  25. }
  26. create = (d3d8create_t)GetProcAddress(info.module, "Direct3DCreate8");
  27. if (!create) {
  28. return false;
  29. }
  30. info.d3d8 = create(D3D_SDK_VERSION);
  31. if (!info.d3d8) {
  32. return false;
  33. }
  34. D3DPRESENT_PARAMETERS pp = {};
  35. pp.Windowed = true;
  36. pp.SwapEffect = D3DSWAPEFFECT_FLIP;
  37. pp.BackBufferFormat = D3DFMT_A8R8G8B8;
  38. pp.BackBufferWidth = 2;
  39. pp.BackBufferHeight = 2;
  40. pp.BackBufferCount = 1;
  41. pp.hDeviceWindow = info.hwnd;
  42. hr = info.d3d8->CreateDevice(D3DADAPTER_DEFAULT, D3DDEVTYPE_HAL,
  43. info.hwnd, D3DCREATE_HARDWARE_VERTEXPROCESSING, &pp,
  44. &info.device);
  45. if (FAILED(hr)) {
  46. return false;
  47. }
  48. return true;
  49. }
  50. static inline void d3d8_free(d3d8_info &info)
  51. {
  52. if (info.device)
  53. info.device->Release();
  54. if (info.d3d8)
  55. info.d3d8->Release();
  56. if (info.hwnd)
  57. DestroyWindow(info.hwnd);
  58. }
  59. void get_d3d8_offsets(struct d3d8_offsets *offsets)
  60. {
  61. d3d8_info info = {};
  62. bool success = d3d8_init(info);
  63. if (success) {
  64. offsets->present = vtable_offset(info.module, info.device, 15);
  65. }
  66. d3d8_free(info);
  67. }