499 Commits

Author SHA1 Message Date
jp9000
926b9c5f96 win-capture: Open UWP named objects with helper functions
This detects whether the target process is a UWP process, and then uses
the open_app_* functions for mutexes/events/mapping.  Also slightly
refactors named object open functions.
2016-12-16 14:05:56 -08:00
jp9000
aeb1d7ae1b win-capture: Add ability to open UWP named kernel objects
The only way to open named kernel objects within a UWP "app" is to get
the AppContainer SID, and then open the objects with their full
system namespace names via undocumented NT functions.
2016-12-16 14:05:55 -08:00
jp9000
b5f216ef88 win-capture: Use wide strings for named objects
Prevents from having to mix ansi/wide string usage for opening UWP
programs.
2016-12-16 02:21:10 -08:00
jp9000
c63bb17b08 win-capture: Remove redundant function
This function now already exists elsewhere -- open_event_plus_id.
2016-12-16 02:21:09 -08:00
jp9000
ec4c05f406 win-capture: Don't use "Local\" for game capture shared mem
The "Local\" prefix effectively does nothing.
2016-12-16 02:21:08 -08:00
jp9000
ab9bda52e0 win-capture: Create all named objects within hook
All named objects (including file mapped shared memory) need to be
created within the hook itself due to the fact that UWP programs cannot
access named objects outside of the UWP process.

Because shared memory needs to be created within the hook, the capture
loop cannot start until the shared memory has been filled with valid
data.  Creating an additional "initialize" event fixes this issue.

Additionally, changed the way that named kernel objects are
opened/created.  Before, there were functions that would first try to
open named objects and then implicitly create them if opening failed
(assuming that if the hook didn't create it first, game capture would),
now it's been changed so that you can only either explicitly open or
create.
2016-12-16 02:21:07 -08:00
jp9000
d19342442f win-capture: Use window for keepalive check
To check to make sure game capture is still active in the capture
program, it currently uses a named event, and then it checks to see if
that named event exists.  However with UWP programs, you can't open a
named event outside of the UWP process.  FindWindow on the other hand
does work, so instead of checking to see if a named kernel object
exists, create a window and check to see if that window exists.
2016-12-16 02:21:06 -08:00
jp9000
1e48b522fa win-capture: Fix getting proper UWP window handles
The "main" windows detected for UWP programs are basically to help
sandbox the programs -- they run in the ApplicationFrameHost process and
help reduce the possibility of other programs trying to access the
actual process window, which is a child window.

To bypass this, go through the list of child windows for the
ApplicationFrameHost window, and then find the one that's attached to
a different process; that different process will always be the target,
and will allows us to open the actual process of the UWP program.
2016-12-16 02:21:05 -08:00
jp9000
4ec1033741 win-capture: Do not require pipe/mutex within hook
Named pipes cannot be used within UWP programs, so make them optional.
2016-12-15 13:03:44 -08:00
jp9000
746061fb3a win-capture: Always use minimal access rights within hook
This prevents issues with opening handles to objects within UWP
programs, which have increased security limitations.
2016-12-15 13:03:42 -08:00
jp9000
e148087636 win-capture: Only duplicate to get cur thread handle
Instead of calling OpenThread, use DuplicateHandle with the minimal
access rights (SYNCHRONIZE) to be able to get the current thread handle
within a UWP program.
2016-12-12 08:10:06 -08:00
jp9000
ca607f8b35 cmake: Add _CRT_SECURE_NO_WARNINGS to all projects
This prevents issues with using standard C functions, where microsoft
would otherwise spit out pointless warnings to encourage using
microsoft-specific functions instead.
2016-12-08 03:27:36 -08:00
jp9000
2f305cb550 win-capture: Use static runtimes for hooks/helpers
(Note: This commit also modifies the ipc-util/seg-service modules)

When compiling the final project, always compile
ipc-util/get-graphics-offsets/graphics-hook/inject-helper/seg-service
with static MSVC runtimes to prevent the need of requiring the MSVC
runtimes for both architectures.
2016-11-23 06:03:00 -08:00
Gol-D-Ace
90e805ad9b Update translations from CrowdIn 2016-11-16 00:32:47 +01:00
jp9000
eaa32c20be win-capture: Defer hook offset loading to separate thread
Boosts startup time significantly to defer this to a separate thread.
2016-11-14 17:34:44 -08:00
jp9000
35285a26b7 win-capture: Do not load 64bit hook offsets on 32bit systems 2016-11-14 17:34:32 -08:00
jp9000
ed85b22534 Update translations from CrowdIn 2016-11-03 13:32:52 -07:00
jp9000
0b27b51294 win-capture: Add D3D12 capture support
Currently only supports shared texture capture, and doesn't support
rescaling.
2016-11-03 12:13:42 -07:00
jp9000
f49065b1e6 win-capture: Use IUnknown for getting swap backbuffers
Using IDXGIResource doesn't work with D3D12.  D3D12 textures are not a
subclass of that class.
2016-11-03 09:28:32 -07:00
jp9000
81ab13a2a4 win-capture: Cache cursor textures to prevent reallocation
Whenever a cursor is captured and the cursor icon changes, it creates a
new texture.  This isn't particularly optimal, so instead just store a
cache of cursor textures (based on size), and make the textures dynamic.
Doing this will prevent unnecessary texture reallocation.
2016-11-03 09:23:25 -07:00
Gol-D-Ace
aadc7263c0 Update translations from Crowdin 2016-09-28 01:17:24 +02:00
jp9000
6d33f7e091 win-capture: Add trick to ensure game cap. shared tex support
This new trick forgoes the use of patches and allows the ability to use
shared GPU resources despite being a Direct3D 9.0c context.
2016-08-12 18:44:54 -07:00
jp9000
83a042f95c win-capture: Add missing game capture "Mode" string 2016-08-08 16:03:33 -07:00
Gol-D-Ace
cb036b2713 Update translations from Crowdin 2016-08-08 16:21:48 +02:00
jp9000
2c531f04df win-capture: Fix game capture hotkey activating immediately
When game capture was set to hotkey mode by the user, it would try to
activate the capture right away without waiting for the user to press a
hotkey.
2016-08-08 04:57:10 -07:00
jp9000
06b42f4f27 win-capture: Always allow conf. of game capture hotkey
Even if the hotkey is not enabled, always allow configuration of the
hotkey.  Fixes a bug where the hotkey configuration settings would not
save if the settings were changed.

Annoyingly this means that the hotkey will still be shown to the user,
possibly confusing the user as to whether they can use it, but for the
time being it's better than having their hotkey configuration removed
each time they change the mode.
2016-08-06 20:17:29 -07:00
jp9000
571c3a6859 win-capture: Update D3D9 patches
Fixes performance issues with windows 10.0.14393.0
2016-08-06 15:27:33 -07:00
jp9000
183ee11e24 win-capture: Fix lookup order for d3d9 patch
It's supposed to look for patch segments in ascending order, from the
smallest offset to the largest offset.  Patch type/comparison is
identical to the one it's being swapped with, so only the offsets need
to be swapped.
2016-08-06 15:27:33 -07:00
jp9000
8fe01f2de1 win-capture: Do not blacklist league lobby window
The league lobby window can apparently be captured by game capture, and
may actually be useful to capture for some people.
2016-08-05 18:59:37 -07:00
jp9000
bf166c07f4 win-capture: Blacklist specific executables from game capture
Prevents the common problem of injecting in to certain processes and
getting the hook DLL "stuck":
- windows explorer
- steam
- battle.net
- gog galaxy
- skype
- uplay
- origin
- microsoft visual studio
- task manager
- league of legends lobby window
- windows 10 system settings window
2016-07-30 13:04:53 -07:00
jp9000
17667b8b9d win-capture: Add game capture hotkey support
Changed the first property of game capture to be a "mode" list (with
"any fullscreen window", "specific window", and "hotkey").

When hotkey mode is set, it'll add a hotkey pair to hotkey settings to
activate/deactivate game capture.  When the hotkey to activate is
pressed, it'll treat the current foreground window as the target window
similar to "selected window" mode; it'll keep trying to capture the same
window even if the window or its application closes/reopens, and will
continue to do so until deactivated via the deactivate hotkey, or until
a new window is set via the activate hotkey.
2016-07-30 13:04:53 -07:00
jp9000
383c96744e win-capture: Expose helper funcs to get win. class/title 2016-07-30 11:24:39 -07:00
jp9000
7feb21572f win-capture: Update D3D9 shared texture patches 2016-07-15 13:00:21 -07:00
jp9000
d7ed0f1976 Revert "win-capture: Track gl "swap" invocations to prevent duplicate work"
This reverts commit 4c505e7030f2f0b7dab9c51125ac45cf3c28adb1.

Reverting this for the time being due to issues with quakelive.  This
will be more thoroughly tested and hopefully added again.
2016-07-10 00:38:15 -07:00
Gol-D-Ace
81adb13f59 Update translations from Crowdin 2016-07-06 01:18:27 +02:00
Palana
4c505e7030 win-capture: Track gl "swap" invocations to prevent duplicate work
Tested using FTL (steam): SwapBuffers ultimately calls wgl_swap_buffers
causing an additional copy which just isn't necessary

This also causes game capture to sometimes capture overlays even when
not intended
2016-07-03 13:18:23 -07:00
jp9000
b012c7280a win-capture/graphics-hook: Fix vs2015 internal compiler error
Removing this union fixes the internal compile error that would occur on
visual studio 2015 update 2 and above when these variables were all in a
union.
2016-06-22 14:40:54 -07:00
jp9000
d32424e5ad win-capture: Reset d3d9 capture if device recreated
Fixes a bug where if a D3D9 program recreates its device the capture
would become invalid.  Certain games (especially blizzard games) will
completely recreate their Direct3D device if a critical D3D9 error
occurs.
2016-06-11 12:27:06 -07:00
jp9000
6ca3cd3504 win-capture: Fix VS2015 update 2 compiler error
Having volatile variables inside of a union causes a C1001 compiler
error in visual studio 2015 update 2.

Closes jp9000/obs-studio#544
2016-05-28 09:40:49 -07:00
jp9000
b101868e47 Revert "win-capture: Don't draw window if minimized"
This reverts commit 997f05f10ee7eec250c318f4c4e31d00cebcde57.
2016-05-15 06:14:18 -07:00
jp9000
997f05f10e win-capture: Don't draw window if minimized 2016-05-15 04:35:29 -07:00
jp9000
5a5b8b20e3 win-capture: Clear window capture if window no longer exists 2016-05-15 04:35:01 -07:00
jp9000
d24a81868e win-capture: Do not render game capture if not active 2016-05-15 04:20:39 -07:00
jp9000
2707f05c46 Revert "win-capture: Allow window capturing of current process"
This reverts commit 8d520b970d3552417005f6dab4f0892485cd14ce.

This can actually cause a hard lock due to the windows API when
destroying window capture.  When the graphics thread locks the source
list for doing tick or render, and then the UI thread tries to destroy a
source, the UI thread will wait for the graphics thread to complete
rendering/ticking of sources.  The video_tick of window capture would
then check windows in the same process and try to query the window's
name via GetWindowText.  However, GetWindowText is synchronous, and will
not return until the window event has been processed by the UI thread,
so it will perpetually lock because the two threads are waiting for each
other to finish.
2016-05-13 04:21:39 -07:00
jp9000
8d520b970d win-capture: Allow window capturing of current process
Allows window capture to capture windows of the current process, and
adds windows of the current process to the end of the window list.
2016-05-13 02:14:24 -07:00
jp9000
bd9980a206 win-capture: Reset game cap. wait_for_target_startup on update
This flag should be reset when the user changes the game capture
settings.
2016-05-12 19:42:00 -07:00
jp9000
94e22dae49 win-capture: Instantly capture already-hooked processes
If a process is already hooked, immediately initialize the capture
rather than wait for the processes to initialize or wait for the timer
to trigger.
2016-05-12 19:38:46 -07:00
jp9000
8681baeec3 win-capture: Shut down game cap. when not showing
Prevents game capture from acting as a global source.  This fixes an
issue where a game capture in another scene could capture a window and
prevent a separate game capture in the current scene from being able to
capture that same window.
2016-05-12 19:36:33 -07:00
jp9000
9493095c25 win-capture: Shut down win8 monitor capture when not showing
Completely shut down monitor capture when it's not being shown in the
program (for example in a different scene).  This fixes an issue where
it would cause lag when a game enters fullscreen mode.
2016-05-12 17:59:01 -07:00
Richard Stanway
e5e5189c7b
win-capture: Make sure we don't try to hook ourselves
Can trigger when using "Hook any fullscreen application" is enabled and
the projector is active.
2016-04-25 23:46:20 +02:00