I have an interesting situation here with a game launcher that seems to result in SpecialK terminating a game’s original process and creating a new one. I’m talking about the FFXIVQuickLauncher for Final Fantasy 14: GitHub - goatcorp/FFXIVQuickLauncher: Custom launcher for Final Fantasy XIV
The symptom is that the launcher starts the game process, does some stuff to it, then immediately checks whether it’s still running… and if I have SpecialK loading, it isn’t; the original game process is gone, replaced with a new one. I can prevent this from happening by inserting a sleep at a specific point, but I’d like to understand why that is.
You can see what it’s doing here, starting at line 378. FFXIVQuickLauncher/NativeAclFix.cs at f89c277739ff7a4f19124f2b3774b4818ef9e5ff · goatcorp/FFXIVQuickLauncher · GitHub
- CreateProcess, with CREATE_SUSPENDED
- LookupPrivilegeValue, PrivilegeCheck, and, if necessary, AdjustTokenPrivileges
- Back in Launcher.cs, it calls .Refresh() on the Process object and then checks .HasExited.
This unexpected behavior of the game process exiting and being replaced with a new one occurs between steps 5 and 6. It does not happen if I insert a 1-second sleep after the WaitForInputIdle call and before the SetSecurityInfo one, steps 4 and 5.
I don’t know anything about DACLs or SpecialK’s code, so I can’t even take a guess as to what’s happening, here. Does anyone have any insight on this?