[Shield General] cgutman:
Game streaming via GFE is only officially supported for GTX 600 series desktop GPUs. I want to see what we can do about that. I'll be detailing a bunch of things I've tried and learned during my experience messing with getting this to work.

Update for GFE 2.x.x

p1gl3t has developed a new hack for modern GFE versions. I was able to stream with GFE 2.2.3 from a GT 650M laptop with Optimus - something I couldn't do with my original hack because Optimus was unsupported at the time. I followed the steps from this and this. In addition to what the tutorial said, I had to "net stop nvstreamsvc" and "net start nvstreamsvc" after starting the server for it to work but YMMV.

Update for GFE 1.6.1

GFE 1.6.1 added countermeasures for the original registry hack that broke it for machines that had it working with GFE 1.6.0. Fortunately they were not difficult to work around and I've developed another registry hack that works on GFE 1.6.1+. This supersedes the original registry hack and works for both GFE 1.6.0 and 1.6.1. I've updated the link in this post to point to the new hack. Note that laptops with Optimus still don't work with Shield Streaming http://xdaforums.com/showpost.php?p=45599322&postcount=66

Update

For those running Kepler-based desktop and mobile GPUs without Optimus, the DisableStreamingCheck hack enables streaming to the Shield (the attachment from this post). Note: Not all 600/700 series GPUs are Kepler-based.

For Optimus users, it's still not working.

General Info on Executables

First, the GFE game streaming code lives in C:\Program Files\NVIDIA Corporation\NvStreamSvc. The 2 main executables are NvStreamSvc.exe and NvStreamer.exe.

NvStreamSvc.exe is installed as a Windows service set to auto-start. It is responsible for several (known) things:

- Enumerating installed games via GFE Ops Manager

- Enumerating the NVIDIA GPU hardware

- Registering _nvstream._tcp with the MDNS responder that allows Shield to see the computer.

- Handling incoming streaming requests and starting NvStreamer.exe

NvStreamer.exe is the streaming program used to broadcast the game to the Shield.

There's also another file rxinput.dll which appears to be loaded by every process on the machine, presumably to do input injection for the controller.

Reverse Engineering

To gain some initial insight into GFE, I downloaded and started Process Explorer. I limited the events to those from nvstreamer.exe and nvstreamsvc.exe, while concentrating on registry events. I found that there is definitely some enumeration of video adapters going on, particularly interesting was that it was querying the HardwareID value, presumably to check against a blacklist/whitelist.

I also noticed a peculiar little registry query that piqued my interest. I saw nvstreamsvc.exe do a query on HKLM\SOFTWARE\Nvidia Corporation\NvStream\DisableStreamingCheck. Could it be too good to be true? Yes and no.

When I created a DWORD value there, set it to 1, and restarted the NVIDIA streaming service, my Shield now could see my computer and browse my library of Steam games. Sadly, I was still unable to start streaming them. When I tried, my Shield displayed "Cannot launch the game because NVFBC is not supported".

I continued looking at registry accesses and stumbled upon another curious one: HKLM\SOFTWARE\Nvidia Corporation\NvStream\EnableLogging. When I created that DWORD value, set it to 1, and restarting the NVIDIA streaming service, nvstreamsvc.exe began writing a log file which I found after looking at disk accesses in Process Explorer. The log is located in: C:\Windows\System32\config\systemprofile\AppData\Local\NVIDIA Corporation\nvstreamsvc. Note: You may have to manually traverse this path because several folders are only browsable with admin permissions which prevent explorer from going directly to that path (it will say it doesn't exist).

The log file gave some insight into the problem, but not enough to make much headway. I've pasted some relevant portions:

[05.08.13 23:25:35:64 DEBUG] NVIDIA GPU's = {
[05.08.13 23:25:35:66 DEBUG]	{
[05.08.13 23:25:35:69 DEBUG]	FriendlyName=GeForce GT 650M
[05.08.13 23:25:35:71 DEBUG]	IsStreamingSupported=0
[05.08.13 23:25:35:73 DEBUG]	}
[05.08.13 23:25:35:75 DEBUG]	{
[05.08.13 23:25:35:77 DEBUG]	FriendlyName=INTEL(R) HD GRAPHICS 4000
[05.08.13 23:25:35:79 DEBUG]	IsStreamingSupported=0
[05.08.13 23:25:35:81 DEBUG]	}
[05.08.13 23:25:35:83 DEBUG] }

....

[05.08.13 23:36:40:538 INFO] HTTP LOG Entering s_handleAppLaunch 14

[05.08.13 23:36:40:541 ERR0R] ServiceUtil::EnableNvFBC() failed since NvAPI_D3D9_NVFBC_GetStatus() failed with RET=0xfffffffa
[05.08.13 23:36:40:544 ERR0R] Failed to enable FBC
[05.08.13 23:36:40:546 INFO] StreamerProcessWrapper::FindAndKillStreamer
[05.08.13 23:36:40:563 INFO] StreamerProcessWrapper::StartStreamerProcess
[05.08.13 23:36:40:567 INFO] Streamer path: C:\Program Files\NVIDIA Corporation\NvStreamSrv\nvstreamer.exe

[05.08.13 23:36:40:574 INFO] Failed to find management Ip address. Reverting to default

[05.08.13 23:36:40:577 INFO] NvSCI Server IP=192.168.56.1

[05.08.13 23:36:41:115 DEBUG] Streamer thread started
[05.08.13 23:36:41:121 INFO] Event: NOP: NOP

[05.08.13 23:36:41:121 INFO] StreamerWrapper thread started.
[05.08.13 23:36:41:126 DEBUG] NvFBC NOT Supported
[05.08.13 23:36:41:132 DEBUG] session=1375770993&appid=56731104 response:
[05.08.13 23:36:41:140 DEBUG] <?xml version="1.0" encoding="utf-16"?><root protocol_version="0.1" query="launch" status_code="529" status_message="Cannot launch the game since NVFBC is not supported."><gamesession>1375770993</gamesession><winlogon>0</winlogon></root>
[05.08.13 23:36:41:148 INFO] HTTP LOG Exiting s_handleAppLaunch 14

This is the point where I'm now stuck. I can't figure out how to get that NvFBC unsupported error solved. Hopefully we can figure this one out and liberate the Shields! :D