public static string GetDeviceDiagnostics()
 {
     var stringBuilder = new StringBuilder();
     uint devices = 0u;
     int listSize = Marshal.SizeOf(typeof(RawInputDeviceList));
     if (GetRawInputDeviceList(IntPtr.Zero, ref devices, (uint)listSize) != 0u)
     {
         throw new Win32Exception(Marshal.GetLastWin32Error());
     }
     var deviceListPtr = Marshal.AllocHGlobal((int)(listSize * devices));
     try
     {
         GetRawInputDeviceList(deviceListPtr, ref devices, (uint)listSize);
         int index = 0;
         while (index < devices)
         {
             uint pcbSize = 0u;
             var rawInputDeviceList = (RawInputDeviceList)Marshal.PtrToStructure(new IntPtr(deviceListPtr.ToInt64() + listSize * index), typeof(RawInputDeviceList));
             GetRawInputDeviceInfo(rawInputDeviceList.hDevice, RawInputDeviceInfo.RIDI_DEVICENAME, IntPtr.Zero, ref pcbSize);
             if (pcbSize <= 0u)
             {
                 stringBuilder.AppendLine("pcbSize: " + pcbSize);
                 stringBuilder.AppendLine(Marshal.GetLastWin32Error().ToString());
                 string result = stringBuilder.ToString();
                 return result;
             }
             var deviceInfoSize = (uint)Marshal.SizeOf(typeof(DeviceInfo));
             var deviceInfo = new DeviceInfo
             {
                 Size = Marshal.SizeOf(typeof(DeviceInfo))
             };
             if (GetRawInputDeviceInfo(rawInputDeviceList.hDevice, 536870923u, ref deviceInfo, ref deviceInfoSize) <= 0u)
             {
                 stringBuilder.AppendLine(Marshal.GetLastWin32Error().ToString());
                 string result = stringBuilder.ToString();
                 return result;
             }
             var deviceInfoPtr = Marshal.AllocHGlobal((int)pcbSize);
             try
             {
                 GetRawInputDeviceInfo(rawInputDeviceList.hDevice, RawInputDeviceInfo.RIDI_DEVICENAME, deviceInfoPtr,
                     ref pcbSize);
                 string device = Marshal.PtrToStringAnsi(deviceInfoPtr);
                 if (rawInputDeviceList.dwType == DeviceType.RimTypekeyboard ||
                     rawInputDeviceList.dwType == DeviceType.RimTypeHid)
                 {
                     string deviceDescription = GetDeviceDescription(device);
                     var rawKeyboardDevice = new RawKeyboardDevice(Marshal.PtrToStringAnsi(deviceInfoPtr),
                         (RawDeviceType)rawInputDeviceList.dwType, rawInputDeviceList.hDevice, deviceDescription);
                     stringBuilder.AppendLine(rawKeyboardDevice.ToString());
                     stringBuilder.AppendLine(deviceInfo.ToString());
                     stringBuilder.AppendLine(deviceInfo.KeyboardInfo.ToString());
                     stringBuilder.AppendLine(deviceInfo.HIDInfo.ToString());
                 }
             }
             finally
             {
                 Marshal.FreeHGlobal(deviceInfoPtr);
             }
             index++;
         }
     }
     finally
     {
         Marshal.FreeHGlobal(deviceListPtr);
     }
     return stringBuilder.ToString();
 }
        public static string GetDeviceDiagnostics()
        {
            var stringBuilder = new StringBuilder();
            var devices       = 0u;
            var listSize      = Marshal.SizeOf(typeof(RawInputDeviceList));

            if (GetRawInputDeviceList(IntPtr.Zero, ref devices, (uint)listSize) != 0u)
            {
                throw new Win32Exception(Marshal.GetLastWin32Error());
            }
            var deviceListPtr = Marshal.AllocHGlobal((int)(listSize * devices));

            try
            {
                GetRawInputDeviceList(deviceListPtr, ref devices, (uint)listSize);
                var index = 0;
                while (index < devices)
                {
                    var pcbSize            = 0u;
                    var rawInputDeviceList =
                        (RawInputDeviceList)
                        Marshal.PtrToStructure(new IntPtr(deviceListPtr.ToInt64() + listSize * index), typeof(RawInputDeviceList));
                    GetRawInputDeviceInfo(rawInputDeviceList.hDevice, RawInputDeviceInfo.RIDI_DEVICENAME, IntPtr.Zero, ref pcbSize);
                    if (pcbSize <= 0u)
                    {
                        stringBuilder.AppendLine("pcbSize: " + pcbSize);
                        stringBuilder.AppendLine(Marshal.GetLastWin32Error().ToString());
                        var result = stringBuilder.ToString();
                        return(result);
                    }
                    var deviceInfoSize = (uint)Marshal.SizeOf(typeof(DeviceInfo));
                    var deviceInfo     = new DeviceInfo
                    {
                        Size = Marshal.SizeOf(typeof(DeviceInfo))
                    };
                    if (GetRawInputDeviceInfo(rawInputDeviceList.hDevice, 536870923u, ref deviceInfo, ref deviceInfoSize) <= 0u)
                    {
                        stringBuilder.AppendLine(Marshal.GetLastWin32Error().ToString());
                        var result = stringBuilder.ToString();
                        return(result);
                    }
                    var deviceInfoPtr = Marshal.AllocHGlobal((int)pcbSize);
                    try
                    {
                        GetRawInputDeviceInfo(rawInputDeviceList.hDevice, RawInputDeviceInfo.RIDI_DEVICENAME, deviceInfoPtr,
                                              ref pcbSize);
                        var device = Marshal.PtrToStringAnsi(deviceInfoPtr);
                        if (rawInputDeviceList.dwType == DeviceType.RimTypekeyboard ||
                            rawInputDeviceList.dwType == DeviceType.RimTypeHid)
                        {
                            var deviceDescription = GetDeviceDescription(device);
                            var rawKeyboardDevice = new RawKeyboardDevice(Marshal.PtrToStringAnsi(deviceInfoPtr),
                                                                          (RawDeviceType)rawInputDeviceList.dwType, rawInputDeviceList.hDevice, deviceDescription);
                            stringBuilder.AppendLine(rawKeyboardDevice.ToString());
                            stringBuilder.AppendLine(deviceInfo.ToString());
                            stringBuilder.AppendLine(deviceInfo.KeyboardInfo.ToString());
                            stringBuilder.AppendLine(deviceInfo.HIDInfo.ToString());
                        }
                    }
                    finally
                    {
                        Marshal.FreeHGlobal(deviceInfoPtr);
                    }
                    index++;
                }
            }
            finally
            {
                Marshal.FreeHGlobal(deviceListPtr);
            }
            return(stringBuilder.ToString());
        }
 public static extern uint GetRawInputDeviceInfo(IntPtr hDevice, uint command, ref DeviceInfo data,
     ref uint dataSize);
 public static extern uint GetRawInputDeviceInfo(IntPtr hDevice, uint command, ref DeviceInfo data,
                                                 ref uint dataSize);