graphics-hook-info.h 2.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143
  1. #pragma once
  2. #include <assert.h>
  3. #include <stdint.h>
  4. #include <stdbool.h>
  5. #include <string.h>
  6. #include <stdio.h>
  7. #include "hook-helpers.h"
  8. #define EVENT_CAPTURE_RESTART L"CaptureHook_Restart"
  9. #define EVENT_CAPTURE_STOP L"CaptureHook_Stop"
  10. #define EVENT_HOOK_READY L"CaptureHook_HookReady"
  11. #define EVENT_HOOK_EXIT L"CaptureHook_Exit"
  12. #define EVENT_HOOK_INIT L"CaptureHook_Initialize"
  13. #define WINDOW_HOOK_KEEPALIVE L"CaptureHook_KeepAlive"
  14. #define MUTEX_TEXTURE1 L"CaptureHook_TextureMutex1"
  15. #define MUTEX_TEXTURE2 L"CaptureHook_TextureMutex2"
  16. #define SHMEM_HOOK_INFO L"CaptureHook_HookInfo"
  17. #define SHMEM_TEXTURE L"CaptureHook_Texture"
  18. #define PIPE_NAME "CaptureHook_Pipe"
  19. #pragma pack(push, 8)
  20. struct d3d8_offsets {
  21. uint32_t present;
  22. };
  23. struct d3d9_offsets {
  24. uint32_t present;
  25. uint32_t present_ex;
  26. uint32_t present_swap;
  27. uint32_t d3d9_clsoff;
  28. uint32_t is_d3d9ex_clsoff;
  29. };
  30. struct d3d12_offsets {
  31. uint32_t execute_command_lists;
  32. };
  33. struct dxgi_offsets {
  34. uint32_t present;
  35. uint32_t resize;
  36. uint32_t present1;
  37. };
  38. struct dxgi_offsets2 {
  39. uint32_t release;
  40. };
  41. struct ddraw_offsets {
  42. uint32_t surface_create;
  43. uint32_t surface_restore;
  44. uint32_t surface_release;
  45. uint32_t surface_unlock;
  46. uint32_t surface_blt;
  47. uint32_t surface_flip;
  48. uint32_t surface_set_palette;
  49. uint32_t palette_set_entries;
  50. };
  51. struct shmem_data {
  52. volatile int last_tex;
  53. uint32_t tex1_offset;
  54. uint32_t tex2_offset;
  55. };
  56. struct shtex_data {
  57. uint32_t tex_handle;
  58. };
  59. enum capture_type {
  60. CAPTURE_TYPE_MEMORY,
  61. CAPTURE_TYPE_TEXTURE,
  62. };
  63. struct graphics_offsets {
  64. struct d3d8_offsets d3d8;
  65. struct d3d9_offsets d3d9;
  66. struct dxgi_offsets dxgi;
  67. struct ddraw_offsets ddraw;
  68. struct dxgi_offsets2 dxgi2;
  69. struct d3d12_offsets d3d12;
  70. };
  71. struct hook_info {
  72. /* hook version */
  73. uint32_t hook_ver_major;
  74. uint32_t hook_ver_minor;
  75. /* capture info */
  76. enum capture_type type;
  77. uint32_t window;
  78. uint32_t format;
  79. uint32_t cx;
  80. uint32_t cy;
  81. uint32_t UNUSED_base_cx;
  82. uint32_t UNUSED_base_cy;
  83. uint32_t pitch;
  84. uint32_t map_id;
  85. uint32_t map_size;
  86. bool flip;
  87. /* additional options */
  88. uint64_t frame_interval;
  89. bool UNUSED_use_scale;
  90. bool force_shmem;
  91. bool capture_overlay;
  92. bool allow_srgb_alias;
  93. /* hook addresses */
  94. struct graphics_offsets offsets;
  95. uint32_t reserved[126];
  96. };
  97. static_assert(sizeof(struct hook_info) == 648, "ABI compatibility");
  98. #pragma pack(pop)
  99. #define GC_MAPPING_FLAGS (FILE_MAP_READ | FILE_MAP_WRITE)
  100. static inline HANDLE create_hook_info(DWORD id)
  101. {
  102. HANDLE handle = NULL;
  103. wchar_t new_name[64];
  104. const int len = swprintf(new_name, _countof(new_name),
  105. SHMEM_HOOK_INFO L"%lu", id);
  106. if (len > 0) {
  107. handle = CreateFileMappingW(INVALID_HANDLE_VALUE, NULL,
  108. PAGE_READWRITE, 0,
  109. sizeof(struct hook_info), new_name);
  110. }
  111. return handle;
  112. }