graphics-hook-info.h 2.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119
  1. #pragma once
  2. #include <stdint.h>
  3. #include <stdbool.h>
  4. #include <string.h>
  5. #include <stdio.h>
  6. #include "hook-helpers.h"
  7. #define EVENT_CAPTURE_RESTART "CaptureHook_Restart"
  8. #define EVENT_CAPTURE_STOP "CaptureHook_Stop"
  9. #define EVENT_HOOK_READY "CaptureHook_HookReady"
  10. #define EVENT_HOOK_EXIT "CaptureHook_Exit"
  11. #define EVENT_HOOK_KEEPALIVE "CaptureHook_KeepAlive"
  12. #define MUTEX_TEXTURE1 "CaptureHook_TextureMutex1"
  13. #define MUTEX_TEXTURE2 "CaptureHook_TextureMutex2"
  14. #define SHMEM_HOOK_INFO "Local\\CaptureHook_HookInfo"
  15. #define SHMEM_TEXTURE "Local\\CaptureHook_Texture"
  16. #define PIPE_NAME "CaptureHook_Pipe"
  17. #pragma pack(push, 8)
  18. struct d3d8_offsets {
  19. uint32_t present;
  20. };
  21. struct d3d9_offsets {
  22. uint32_t present;
  23. uint32_t present_ex;
  24. uint32_t present_swap;
  25. uint32_t d3d9_clsoff;
  26. uint32_t is_d3d9ex_clsoff;
  27. };
  28. struct dxgi_offsets {
  29. uint32_t present;
  30. uint32_t resize;
  31. };
  32. struct ddraw_offsets {
  33. uint32_t surface_create;
  34. uint32_t surface_restore;
  35. uint32_t surface_release;
  36. uint32_t surface_unlock;
  37. uint32_t surface_blt;
  38. uint32_t surface_flip;
  39. uint32_t surface_set_palette;
  40. uint32_t palette_set_entries;
  41. };
  42. struct shmem_data {
  43. volatile int last_tex;
  44. uint32_t tex1_offset;
  45. uint32_t tex2_offset;
  46. };
  47. struct shtex_data {
  48. uint32_t tex_handle;
  49. };
  50. enum capture_type {
  51. CAPTURE_TYPE_MEMORY,
  52. CAPTURE_TYPE_TEXTURE
  53. };
  54. struct graphics_offsets {
  55. struct d3d8_offsets d3d8;
  56. struct d3d9_offsets d3d9;
  57. struct dxgi_offsets dxgi;
  58. struct ddraw_offsets ddraw;
  59. };
  60. struct hook_info {
  61. /* capture info */
  62. enum capture_type type;
  63. uint32_t window;
  64. uint32_t format;
  65. uint32_t cx;
  66. uint32_t cy;
  67. uint32_t base_cx;
  68. uint32_t base_cy;
  69. uint32_t pitch;
  70. uint32_t map_id;
  71. uint32_t map_size;
  72. bool flip;
  73. /* additional options */
  74. uint64_t frame_interval;
  75. bool use_scale;
  76. bool force_shmem;
  77. bool capture_overlay;
  78. /* hook addresses */
  79. struct graphics_offsets offsets;
  80. };
  81. #pragma pack(pop)
  82. static inline HANDLE get_hook_info(DWORD id)
  83. {
  84. HANDLE handle;
  85. char new_name[64];
  86. sprintf(new_name, "%s%lu", SHMEM_HOOK_INFO, id);
  87. handle = CreateFileMappingA(INVALID_HANDLE_VALUE, NULL,
  88. PAGE_READWRITE, 0, sizeof(struct hook_info), new_name);
  89. if (!handle && GetLastError() == ERROR_ALREADY_EXISTS) {
  90. handle = OpenFileMappingA(FILE_MAP_ALL_ACCESS, false,
  91. new_name);
  92. }
  93. return handle;
  94. }