my "fix" is more or less client/library/os documentation regarding the issue and where the source of it lies. also, there's 2 primary issues with older clients and modern os's: 1) DirectInput (invalid parameter), and 2) PEB header issue (process hang/crash).
my tutorial explains one way to bypass the apiloader checks, which will allow yourself to inject custom dinput8 dll's into your client rather than loading the original. alternatively, the better way to do this is by using winapi hooks. however, the dinput8 dll itself won't fix the issue, you need to hook dinput8 functions as well so that you can fix the source of the error and never return an invalid value back to the client.
as for the hanging issue, i also explained that the source of the issue comes from checks in CWvsApp::SetUp (invalid peb headers across os's). however, the checks are ignored if you never hide any of the dll's (via HideDll). so, if you use aobs to find yourself the HideDll function and modify the initial instruction to force return (retn), it'll ignore the checks below it's call in CWvsApp::SetUp. since CWvsApp::SetUp is vmed heavily, finding HideDll is the better option. if you have a unvmed localhost, then you can go ahead and just nop the function (and even the checks) inside of CWvsApp::SetUp and be done. usually this isn't the case though. this as well can be done by injecting your custom dinput8.dll into the client and writing to the process memory, just find the address itself from a unpack/mem dump in IDA.