mirror of https://github.com/duggerd/KFDtool.git
472 lines
16 KiB
C#
472 lines
16 KiB
C#
using System;
|
|
using System.Collections.Generic;
|
|
using System.Linq;
|
|
using System.Runtime.InteropServices;
|
|
using System.Text;
|
|
using System.Threading;
|
|
using System.Threading.Tasks;
|
|
|
|
namespace HidLibrary
|
|
{
|
|
internal static class NativeMethods
|
|
{
|
|
internal struct OVERLAPPED
|
|
{
|
|
public int Internal;
|
|
|
|
public int InternalHigh;
|
|
|
|
public int Offset;
|
|
|
|
public int OffsetHigh;
|
|
|
|
public int hEvent;
|
|
}
|
|
|
|
internal struct SECURITY_ATTRIBUTES
|
|
{
|
|
public int nLength;
|
|
|
|
public IntPtr lpSecurityDescriptor;
|
|
|
|
public bool bInheritHandle;
|
|
}
|
|
|
|
[StructLayout(LayoutKind.Sequential)]
|
|
internal class DEV_BROADCAST_DEVICEINTERFACE
|
|
{
|
|
internal int dbcc_size;
|
|
|
|
internal int dbcc_devicetype;
|
|
|
|
internal int dbcc_reserved;
|
|
|
|
internal Guid dbcc_classguid;
|
|
|
|
internal short dbcc_name;
|
|
}
|
|
|
|
[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Unicode)]
|
|
internal class DEV_BROADCAST_DEVICEINTERFACE_1
|
|
{
|
|
internal int dbcc_size;
|
|
|
|
internal int dbcc_devicetype;
|
|
|
|
internal int dbcc_reserved;
|
|
|
|
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 16, ArraySubType = UnmanagedType.U1)]
|
|
internal byte[] dbcc_classguid;
|
|
|
|
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 255)]
|
|
internal char[] dbcc_name;
|
|
}
|
|
|
|
[StructLayout(LayoutKind.Sequential)]
|
|
internal class DEV_BROADCAST_HANDLE
|
|
{
|
|
internal int dbch_size;
|
|
|
|
internal int dbch_devicetype;
|
|
|
|
internal int dbch_reserved;
|
|
|
|
internal int dbch_handle;
|
|
|
|
internal int dbch_hdevnotify;
|
|
}
|
|
|
|
[StructLayout(LayoutKind.Sequential)]
|
|
internal class DEV_BROADCAST_HDR
|
|
{
|
|
internal int dbch_size;
|
|
|
|
internal int dbch_devicetype;
|
|
|
|
internal int dbch_reserved;
|
|
}
|
|
|
|
internal struct SP_DEVICE_INTERFACE_DATA
|
|
{
|
|
internal int cbSize;
|
|
|
|
internal Guid InterfaceClassGuid;
|
|
|
|
internal int Flags;
|
|
|
|
internal IntPtr Reserved;
|
|
}
|
|
|
|
internal struct SP_DEVINFO_DATA
|
|
{
|
|
internal int cbSize;
|
|
|
|
internal Guid ClassGuid;
|
|
|
|
internal int DevInst;
|
|
|
|
internal IntPtr Reserved;
|
|
}
|
|
|
|
[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Auto)]
|
|
internal struct SP_DEVICE_INTERFACE_DETAIL_DATA
|
|
{
|
|
internal int Size;
|
|
|
|
[MarshalAs(UnmanagedType.ByValTStr, SizeConst = 256)]
|
|
internal string DevicePath;
|
|
}
|
|
|
|
internal struct DEVPROPKEY
|
|
{
|
|
public Guid fmtid;
|
|
|
|
public ulong pid;
|
|
}
|
|
|
|
internal struct HIDD_ATTRIBUTES
|
|
{
|
|
internal int Size;
|
|
|
|
internal ushort VendorID;
|
|
|
|
internal ushort ProductID;
|
|
|
|
internal short VersionNumber;
|
|
}
|
|
|
|
internal struct HIDP_CAPS
|
|
{
|
|
internal short Usage;
|
|
|
|
internal short UsagePage;
|
|
|
|
internal short InputReportByteLength;
|
|
|
|
internal short OutputReportByteLength;
|
|
|
|
internal short FeatureReportByteLength;
|
|
|
|
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 17)]
|
|
internal short[] Reserved;
|
|
|
|
internal short NumberLinkCollectionNodes;
|
|
|
|
internal short NumberInputButtonCaps;
|
|
|
|
internal short NumberInputValueCaps;
|
|
|
|
internal short NumberInputDataIndices;
|
|
|
|
internal short NumberOutputButtonCaps;
|
|
|
|
internal short NumberOutputValueCaps;
|
|
|
|
internal short NumberOutputDataIndices;
|
|
|
|
internal short NumberFeatureButtonCaps;
|
|
|
|
internal short NumberFeatureValueCaps;
|
|
|
|
internal short NumberFeatureDataIndices;
|
|
}
|
|
|
|
internal struct HIDP_VALUE_CAPS
|
|
{
|
|
internal short UsagePage;
|
|
|
|
internal byte ReportID;
|
|
|
|
internal int IsAlias;
|
|
|
|
internal short BitField;
|
|
|
|
internal short LinkCollection;
|
|
|
|
internal short LinkUsage;
|
|
|
|
internal short LinkUsagePage;
|
|
|
|
internal int IsRange;
|
|
|
|
internal int IsStringRange;
|
|
|
|
internal int IsDesignatorRange;
|
|
|
|
internal int IsAbsolute;
|
|
|
|
internal int HasNull;
|
|
|
|
internal byte Reserved;
|
|
|
|
internal short BitSize;
|
|
|
|
internal short ReportCount;
|
|
|
|
internal short Reserved2;
|
|
|
|
internal short Reserved3;
|
|
|
|
internal short Reserved4;
|
|
|
|
internal short Reserved5;
|
|
|
|
internal short Reserved6;
|
|
|
|
internal int LogicalMin;
|
|
|
|
internal int LogicalMax;
|
|
|
|
internal int PhysicalMin;
|
|
|
|
internal int PhysicalMax;
|
|
|
|
internal short UsageMin;
|
|
|
|
internal short UsageMax;
|
|
|
|
internal short StringMin;
|
|
|
|
internal short StringMax;
|
|
|
|
internal short DesignatorMin;
|
|
|
|
internal short DesignatorMax;
|
|
|
|
internal short DataIndexMin;
|
|
|
|
internal short DataIndexMax;
|
|
}
|
|
|
|
internal const int FILE_FLAG_OVERLAPPED = 1073741824;
|
|
|
|
internal const short FILE_SHARE_READ = 1;
|
|
|
|
internal const short FILE_SHARE_WRITE = 2;
|
|
|
|
internal const uint GENERIC_READ = 2147483648u;
|
|
|
|
internal const uint GENERIC_WRITE = 1073741824u;
|
|
|
|
internal const int ACCESS_NONE = 0;
|
|
|
|
internal const int INVALID_HANDLE_VALUE = -1;
|
|
|
|
internal const short OPEN_EXISTING = 3;
|
|
|
|
internal const int WAIT_TIMEOUT = 258;
|
|
|
|
internal const uint WAIT_OBJECT_0 = 0u;
|
|
|
|
internal const uint WAIT_FAILED = uint.MaxValue;
|
|
|
|
internal const int WAIT_INFINITE = 65535;
|
|
|
|
internal const int DBT_DEVICEARRIVAL = 32768;
|
|
|
|
internal const int DBT_DEVICEREMOVECOMPLETE = 32772;
|
|
|
|
internal const int DBT_DEVTYP_DEVICEINTERFACE = 5;
|
|
|
|
internal const int DBT_DEVTYP_HANDLE = 6;
|
|
|
|
internal const int DEVICE_NOTIFY_ALL_INTERFACE_CLASSES = 4;
|
|
|
|
internal const int DEVICE_NOTIFY_SERVICE_HANDLE = 1;
|
|
|
|
internal const int DEVICE_NOTIFY_WINDOW_HANDLE = 0;
|
|
|
|
internal const int WM_DEVICECHANGE = 537;
|
|
|
|
internal const short DIGCF_PRESENT = 2;
|
|
|
|
internal const short DIGCF_DEVICEINTERFACE = 16;
|
|
|
|
internal const int DIGCF_ALLCLASSES = 4;
|
|
|
|
internal const int MAX_DEV_LEN = 1000;
|
|
|
|
internal const int SPDRP_ADDRESS = 28;
|
|
|
|
internal const int SPDRP_BUSNUMBER = 21;
|
|
|
|
internal const int SPDRP_BUSTYPEGUID = 19;
|
|
|
|
internal const int SPDRP_CAPABILITIES = 15;
|
|
|
|
internal const int SPDRP_CHARACTERISTICS = 27;
|
|
|
|
internal const int SPDRP_CLASS = 7;
|
|
|
|
internal const int SPDRP_CLASSGUID = 8;
|
|
|
|
internal const int SPDRP_COMPATIBLEIDS = 2;
|
|
|
|
internal const int SPDRP_CONFIGFLAGS = 10;
|
|
|
|
internal const int SPDRP_DEVICE_POWER_DATA = 30;
|
|
|
|
internal const int SPDRP_DEVICEDESC = 0;
|
|
|
|
internal const int SPDRP_DEVTYPE = 25;
|
|
|
|
internal const int SPDRP_DRIVER = 9;
|
|
|
|
internal const int SPDRP_ENUMERATOR_NAME = 22;
|
|
|
|
internal const int SPDRP_EXCLUSIVE = 26;
|
|
|
|
internal const int SPDRP_FRIENDLYNAME = 12;
|
|
|
|
internal const int SPDRP_HARDWAREID = 1;
|
|
|
|
internal const int SPDRP_LEGACYBUSTYPE = 20;
|
|
|
|
internal const int SPDRP_LOCATION_INFORMATION = 13;
|
|
|
|
internal const int SPDRP_LOWERFILTERS = 18;
|
|
|
|
internal const int SPDRP_MFG = 11;
|
|
|
|
internal const int SPDRP_PHYSICAL_DEVICE_OBJECT_NAME = 14;
|
|
|
|
internal const int SPDRP_REMOVAL_POLICY = 31;
|
|
|
|
internal const int SPDRP_REMOVAL_POLICY_HW_DEFAULT = 32;
|
|
|
|
internal const int SPDRP_REMOVAL_POLICY_OVERRIDE = 33;
|
|
|
|
internal const int SPDRP_SECURITY = 23;
|
|
|
|
internal const int SPDRP_SECURITY_SDS = 24;
|
|
|
|
internal const int SPDRP_SERVICE = 4;
|
|
|
|
internal const int SPDRP_UI_NUMBER = 16;
|
|
|
|
internal const int SPDRP_UI_NUMBER_DESC_FORMAT = 29;
|
|
|
|
internal const int SPDRP_UPPERFILTERS = 17;
|
|
|
|
internal static DEVPROPKEY DEVPKEY_Device_BusReportedDeviceDesc = new DEVPROPKEY
|
|
{
|
|
fmtid = new Guid(1410045054u, 35648, 17852, 168, 162, 106, 11, 137, 76, 189, 162),
|
|
pid = 4
|
|
};
|
|
|
|
internal const short HIDP_INPUT = 0;
|
|
|
|
internal const short HIDP_OUTPUT = 1;
|
|
|
|
internal const short HIDP_FEATURE = 2;
|
|
|
|
[DllImport("kernel32.dll", CharSet = CharSet.Auto, ExactSpelling = true, SetLastError = true)]
|
|
internal static extern bool CancelIo(IntPtr hFile);
|
|
|
|
[DllImport("kernel32.dll", CharSet = CharSet.Auto, ExactSpelling = true, SetLastError = true)]
|
|
internal static extern bool CancelIoEx(IntPtr hFile, IntPtr lpOverlapped);
|
|
|
|
[DllImport("kernel32.dll", CharSet = CharSet.Auto, ExactSpelling = true, SetLastError = true)]
|
|
internal static extern bool CloseHandle(IntPtr hObject);
|
|
|
|
[DllImport("kernel32.dll", CharSet = CharSet.Auto, ExactSpelling = true, SetLastError = true)]
|
|
internal static extern bool CancelSynchronousIo(IntPtr hObject);
|
|
|
|
[DllImport("kernel32.dll", CharSet = CharSet.Auto)]
|
|
internal static extern IntPtr CreateEvent(ref SECURITY_ATTRIBUTES securityAttributes, int bManualReset, int bInitialState, string lpName);
|
|
|
|
[DllImport("kernel32.dll", CharSet = CharSet.Auto, SetLastError = true)]
|
|
internal static extern IntPtr CreateFile(string lpFileName, uint dwDesiredAccess, int dwShareMode, ref SECURITY_ATTRIBUTES lpSecurityAttributes, int dwCreationDisposition, int dwFlagsAndAttributes, int hTemplateFile);
|
|
|
|
[DllImport("kernel32.dll", SetLastError = true)]
|
|
internal static extern bool ReadFile(IntPtr hFile, [Out] byte[] lpBuffer, uint nNumberOfBytesToRead, out uint lpNumberOfBytesRead, [In] ref NativeOverlapped lpOverlapped);
|
|
|
|
[DllImport("kernel32.dll")]
|
|
internal static extern uint WaitForSingleObject(IntPtr hHandle, int dwMilliseconds);
|
|
|
|
[DllImport("kernel32.dll")]
|
|
internal static extern bool WriteFile(IntPtr hFile, byte[] lpBuffer, uint nNumberOfBytesToWrite, out uint lpNumberOfBytesWritten, [In] ref NativeOverlapped lpOverlapped);
|
|
|
|
[DllImport("setupapi.dll")]
|
|
public static extern bool SetupDiGetDeviceRegistryProperty(IntPtr deviceInfoSet, ref SP_DEVINFO_DATA deviceInfoData, int propertyVal, ref int propertyRegDataType, byte[] propertyBuffer, int propertyBufferSize, ref int requiredSize);
|
|
|
|
[DllImport("setupapi.dll", EntryPoint = "SetupDiGetDevicePropertyW", SetLastError = true)]
|
|
public static extern bool SetupDiGetDeviceProperty(IntPtr deviceInfo, ref SP_DEVINFO_DATA deviceInfoData, ref DEVPROPKEY propkey, ref ulong propertyDataType, byte[] propertyBuffer, int propertyBufferSize, ref int requiredSize, uint flags);
|
|
|
|
[DllImport("setupapi.dll")]
|
|
internal static extern bool SetupDiEnumDeviceInfo(IntPtr deviceInfoSet, int memberIndex, ref SP_DEVINFO_DATA deviceInfoData);
|
|
|
|
[DllImport("user32.dll", CharSet = CharSet.Auto)]
|
|
internal static extern IntPtr RegisterDeviceNotification(IntPtr hRecipient, IntPtr notificationFilter, int flags);
|
|
|
|
[DllImport("setupapi.dll")]
|
|
internal static extern int SetupDiCreateDeviceInfoList(ref Guid classGuid, int hwndParent);
|
|
|
|
[DllImport("setupapi.dll")]
|
|
internal static extern int SetupDiDestroyDeviceInfoList(IntPtr deviceInfoSet);
|
|
|
|
[DllImport("setupapi.dll")]
|
|
internal static extern bool SetupDiEnumDeviceInterfaces(IntPtr deviceInfoSet, ref SP_DEVINFO_DATA deviceInfoData, ref Guid interfaceClassGuid, int memberIndex, ref SP_DEVICE_INTERFACE_DATA deviceInterfaceData);
|
|
|
|
[DllImport("setupapi.dll", CharSet = CharSet.Auto)]
|
|
internal static extern IntPtr SetupDiGetClassDevs(ref Guid classGuid, string enumerator, int hwndParent, int flags);
|
|
|
|
[DllImport("setupapi.dll", CharSet = CharSet.Auto, EntryPoint = "SetupDiGetDeviceInterfaceDetail")]
|
|
internal static extern bool SetupDiGetDeviceInterfaceDetailBuffer(IntPtr deviceInfoSet, ref SP_DEVICE_INTERFACE_DATA deviceInterfaceData, IntPtr deviceInterfaceDetailData, int deviceInterfaceDetailDataSize, ref int requiredSize, IntPtr deviceInfoData);
|
|
|
|
[DllImport("setupapi.dll", CharSet = CharSet.Auto)]
|
|
internal static extern bool SetupDiGetDeviceInterfaceDetail(IntPtr deviceInfoSet, ref SP_DEVICE_INTERFACE_DATA deviceInterfaceData, ref SP_DEVICE_INTERFACE_DETAIL_DATA deviceInterfaceDetailData, int deviceInterfaceDetailDataSize, ref int requiredSize, IntPtr deviceInfoData);
|
|
|
|
[DllImport("user32.dll")]
|
|
internal static extern bool UnregisterDeviceNotification(IntPtr handle);
|
|
|
|
[DllImport("hid.dll")]
|
|
internal static extern bool HidD_FlushQueue(IntPtr hidDeviceObject);
|
|
|
|
[DllImport("hid.dll")]
|
|
internal static extern bool HidD_GetAttributes(IntPtr hidDeviceObject, ref HIDD_ATTRIBUTES attributes);
|
|
|
|
[DllImport("hid.dll")]
|
|
internal static extern bool HidD_GetFeature(IntPtr hidDeviceObject, byte[] lpReportBuffer, int reportBufferLength);
|
|
|
|
[DllImport("hid.dll")]
|
|
internal static extern bool HidD_GetInputReport(IntPtr hidDeviceObject, ref byte lpReportBuffer, int reportBufferLength);
|
|
|
|
[DllImport("hid.dll")]
|
|
internal static extern void HidD_GetHidGuid(ref Guid hidGuid);
|
|
|
|
[DllImport("hid.dll")]
|
|
internal static extern bool HidD_GetNumInputBuffers(IntPtr hidDeviceObject, ref int numberBuffers);
|
|
|
|
[DllImport("hid.dll")]
|
|
internal static extern bool HidD_GetPreparsedData(IntPtr hidDeviceObject, ref IntPtr preparsedData);
|
|
|
|
[DllImport("hid.dll")]
|
|
internal static extern bool HidD_FreePreparsedData(IntPtr preparsedData);
|
|
|
|
[DllImport("hid.dll")]
|
|
internal static extern bool HidD_SetFeature(IntPtr hidDeviceObject, byte[] lpReportBuffer, int reportBufferLength);
|
|
|
|
[DllImport("hid.dll")]
|
|
internal static extern bool HidD_SetNumInputBuffers(IntPtr hidDeviceObject, int numberBuffers);
|
|
|
|
[DllImport("hid.dll")]
|
|
internal static extern bool HidD_SetOutputReport(IntPtr hidDeviceObject, byte[] lpReportBuffer, int reportBufferLength);
|
|
|
|
[DllImport("hid.dll")]
|
|
internal static extern int HidP_GetCaps(IntPtr preparsedData, ref HIDP_CAPS capabilities);
|
|
|
|
[DllImport("hid.dll")]
|
|
internal static extern int HidP_GetValueCaps(short reportType, ref byte valueCaps, ref short valueCapsLength, IntPtr preparsedData);
|
|
|
|
[DllImport("hid.dll", CharSet = CharSet.Unicode)]
|
|
internal static extern bool HidD_GetProductString(IntPtr hidDeviceObject, ref byte lpReportBuffer, int ReportBufferLength);
|
|
|
|
[DllImport("hid.dll", CharSet = CharSet.Unicode)]
|
|
internal static extern bool HidD_GetManufacturerString(IntPtr hidDeviceObject, ref byte lpReportBuffer, int ReportBufferLength);
|
|
|
|
[DllImport("hid.dll", CharSet = CharSet.Unicode)]
|
|
internal static extern bool HidD_GetSerialNumberString(IntPtr hidDeviceObject, ref byte lpReportBuffer, int reportBufferLength);
|
|
}
|
|
}
|