d3d8-offsets.cpp 1.7 KB

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