d3d8-offsets.cpp 1.6 KB

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