Example #1
0
        internal unsafe static bool TryRegisterPS4Controller(IntPtr handle, out Ps4Controller controller, out string product)
        {
            controller = null;
            var devName = GetRawInputDeviceName(handle);

            char[] arr = new char[126];
            product = null;
            var devHandle = CreateFileW(devName, FileAccess.Read, FileShare.ReadWrite, IntPtr.Zero, FileMode.Open, FileAttributes.Normal, IntPtr.Zero);

            fixed(char *p = arr)
            {
                if (HidD_GetProductString(devHandle, p, 126))
                {
                    product = new string(p);
                    var index = product.IndexOf('\0');
                    if (index != -1)
                    {
                        product.Remove(index);
                    }
                }
            }

            if (product == "Wireless Controller")
            {
                var preparsedData = IntPtr.Zero;
                if (!HidD_GetPreparsedData(devHandle, ref preparsedData))
                {
                    devHandle.Close();
                    return(false);
                }

                HidPCaps caps = new HidPCaps();
                if (HidP_GetCaps(preparsedData, ref caps) != NTStatus.Success)
                {
                    HidD_FreePreparsedData(ref preparsedData);
                    devHandle.Close();
                    return(false);
                }

                if (caps.InputReportByteLength == 64)
                {
                    HidD_FreePreparsedData(ref preparsedData);
                    controller = new Ps4Controller(devHandle, caps);
                    return(true);
                }
                else
                {
                    devHandle.Close();
                    return(false);
                }
            }
            devHandle.Close();
            return(false);
        }
Example #2
0
 internal static extern NTStatus HidP_GetCaps(
     [In] IntPtr preparsedData,
     [In, Out] ref HidPCaps caps
     );