NvStreamer是GFE用来实现GameStream功能的串流组件,它可以录制整个屏幕。但是录制屏幕的时候可能回存在版权保护的问题,例如DVD等内容不允许被录制。因此NvStreamer在检测到桌面上存在受保护内容时会拒绝工作。本文章讲述怎么patch相关逻辑,使其可以录制受保护内容。
使用Moonlight串流,被串流的机器写一个程序调用Windows api SetWindowDisplayAffinity. 该API声明某个窗口是被内容保护的,说明如下
This function and GetWindowDisplayAffinity are designed to support the window content protection feature that is new to Windows 7. This feature enables applications to protect their own onscreen window content from being captured or copied through a specific set of public operating system features and APIs. However, it works only when the Desktop Window Manager(DWM) is composing the desktop.
调用此API后,串流立即退出。可以在NvStreamer相关日志(C:\ProgramData\NVIDIA Corporation\NvStream\NvStreamerCurrent.log)观察到
从上面的日志入手,找字符串,找相关代码,逐层向上回溯。这样做那可就麻烦了
换个思路,NvStreamer应该不是真的截不到图,而只是为了跟从相关法规,拒绝截取相关内容。因此,NvStreamer应该要去判断当前桌面上是否存在被保护内容。如何判断呢?依然是Windows API:GetWindowDisplayAffinity.
对它下断点,找到此处逻辑。
图中代码很清晰了,patch掉相关检测步骤,让程序认为当前桌面上没有受保护的内容即可 。