diff --git a/plugins/win-capture/CMakeLists.txt b/plugins/win-capture/CMakeLists.txt index af5db8fa6..383097b78 100644 --- a/plugins/win-capture/CMakeLists.txt +++ b/plugins/win-capture/CMakeLists.txt @@ -3,6 +3,7 @@ project(win-capture) set(win-capture_HEADERS obfuscate.h hook-helpers.h + graphics-hook-info.h window-helpers.h dc-capture.h) diff --git a/plugins/win-capture/graphics-hook-info.h b/plugins/win-capture/graphics-hook-info.h new file mode 100644 index 000000000..ea4bbc390 --- /dev/null +++ b/plugins/win-capture/graphics-hook-info.h @@ -0,0 +1,120 @@ +#pragma once + +#include +#include +#include +#include + +#include "hook-helpers.h" + +#define EVENT_CAPTURE_RESTART "CaptureHook_Restart" +#define EVENT_CAPTURE_STOP "CaptureHook_Stop" + +#define EVENT_HOOK_READY "CaptureHook_HookReady" +#define EVENT_HOOK_EXIT "CaptureHook_Exit" + +#define EVENT_HOOK_KEEPALIVE "CaptureHook_KeepAlive" + +#define MUTEX_TEXTURE1 "CaptureHook_TextureMutex1" +#define MUTEX_TEXTURE2 "CaptureHook_TextureMutex2" + +#define SHMEM_HOOK_INFO "Local\\CaptureHook_HookInfo" +#define SHMEM_TEXTURE "Local\\CaptureHook_Texture" + +#define PIPE_NAME "CaptureHook_Pipe" + +#pragma pack(push, 8) + +struct d3d8_offsets { + uint32_t present; + uint32_t reset; +}; + +struct d3d9_offsets { + uint32_t present; + uint32_t present_ex; + uint32_t present_swap; + uint32_t reset; + uint32_t reset_ex; +}; + +struct dxgi_offsets { + uint32_t present; + uint32_t resize; +}; + +struct ddraw_offsets { + uint32_t surface_create; + uint32_t surface_restore; + uint32_t surface_release; + uint32_t surface_unlock; + uint32_t surface_blt; + uint32_t surface_flip; + uint32_t surface_set_palette; + uint32_t palette_set_entries; +}; + +struct shmem_data { + volatile int last_tex; + uint32_t tex1_offset; + uint32_t tex2_offset; +}; + +struct shtex_data { + uint32_t tex_handle; +}; + +enum capture_type { + CAPTURE_TYPE_MEMORY, + CAPTURE_TYPE_TEXTURE +}; + +struct graphics_offsets { + struct d3d8_offsets d3d8; + struct d3d9_offsets d3d9; + struct dxgi_offsets dxgi; + struct ddraw_offsets ddraw; +}; + +struct hook_info { + /* capture info */ + enum capture_type type; + uint32_t window; + uint32_t format; + uint32_t cx; + uint32_t cy; + uint32_t base_cx; + uint32_t base_cy; + uint32_t pitch; + uint32_t map_id; + uint32_t map_size; + bool flip; + + /* additional options */ + uint64_t frame_interval; + bool use_scale; + bool force_shmem; + bool capture_overlay; + + /* hook addresses */ + struct graphics_offsets offsets; +}; + +#pragma pack(pop) + +static inline HANDLE get_hook_info(DWORD id) +{ + HANDLE handle; + char new_name[64]; + sprintf(new_name, "%s%d", SHMEM_HOOK_INFO, id); + + handle = CreateFileMappingA(INVALID_HANDLE_VALUE, NULL, + PAGE_READWRITE, 0, sizeof(struct hook_info), new_name); + + if (!handle && GetLastError() == ERROR_ALREADY_EXISTS) { + handle = OpenFileMappingA(FILE_MAP_ALL_ACCESS, false, + new_name); + } + + return handle; +}