private void initDevice(string devicePath) { deviceConnected = false; //create file handles using CT_CreateFile handle = Kernel32.CreateFile(devicePath, Kernel32.GENERIC_READ | Kernel32.GENERIC_WRITE, Kernel32.FILE_SHARE_READ | Kernel32.FILE_SHARE_WRITE, IntPtr.Zero, Kernel32.OPEN_EXISTING, 0, IntPtr.Zero); //get capabilites - use getPreParsedData, and getCaps //store the reportlengths IntPtr ptrToPreParsedData = new IntPtr(); HID.HidD_GetPreparsedData(handle, ref ptrToPreParsedData); capabilities = new HIDP_CAPS(); HID.HidP_GetCaps(ptrToPreParsedData, ref capabilities); HIDD_ATTRIBUTES attributes = new HIDD_ATTRIBUTES(); HID.HidD_GetAttributes(handle, ref attributes); string productName = ""; string SN = ""; string manfString = ""; IntPtr buffer = Marshal.AllocHGlobal(126);//max alloc for string; if (HID.HidD_GetProductString(handle, buffer, 126)) { productName = Marshal.PtrToStringAuto(buffer); } if (HID.HidD_GetSerialNumberString(handle, buffer, 126)) { SN = Marshal.PtrToStringAuto(buffer); } if (HID.HidD_GetManufacturerString(handle, buffer, 126)) { manfString = Marshal.PtrToStringAuto(buffer); } Marshal.FreeHGlobal(buffer); //Call freePreParsedData to release some stuff HID.HidD_FreePreparsedData(ref ptrToPreParsedData); if (handle.IsInvalid) { return; } deviceConnected = true; //If connection was sucsessful, record the values in a global struct productInfo = new InterfaceDetails(); productInfo.devicePath = devicePath; productInfo.manufacturer = manfString; productInfo.product = productName; productInfo.serialNumber = SN; productInfo.PID = (ushort)attributes.ProductID; productInfo.VID = (ushort)attributes.VendorID; productInfo.versionNumber = (ushort)attributes.VersionNumber; productInfo.IN_reportByteLength = (int)capabilities.InputReportByteLength; productInfo.OUT_reportByteLength = (int)capabilities.OutputReportByteLength; }
public static InterfaceDetails[] getConnectedDevices() { InterfaceDetails[] devices = new InterfaceDetails[0]; //Create structs to hold interface information SP_DEVINFO_DATA devInfo = new SP_DEVINFO_DATA(); SP_DEVICE_INTERFACE_DATA devIface = new SP_DEVICE_INTERFACE_DATA(); devInfo.cbSize = (uint)Marshal.SizeOf(devInfo); devIface.cbSize = (uint)(Marshal.SizeOf(devIface)); Guid G = new Guid(); HID.HidD_GetHidGuid(ref G); //Get the guid of the HID device class IntPtr i = SetupAPI.SetupDiGetClassDevs(ref G, IntPtr.Zero, IntPtr.Zero, SetupAPI.DIGCF_DEVICEINTERFACE | SetupAPI.DIGCF_PRESENT); //Loop through all available entries in the device list, until false SP_DEVICE_INTERFACE_DETAIL_DATA didd = new SP_DEVICE_INTERFACE_DETAIL_DATA(); if (IntPtr.Size == 8) // for 64 bit operating systems { didd.cbSize = 8; } else { didd.cbSize = 4 + Marshal.SystemDefaultCharSize; // for 32 bit systems } int j = -1; bool b = true; SafeFileHandle tempHandle; while (b) { ++j; b = SetupAPI.SetupDiEnumDeviceInterfaces(i, IntPtr.Zero, ref G, (uint)j, ref devIface); if (b == false) { break; } uint requiredSize = 0; SetupAPI.SetupDiGetDeviceInterfaceDetail(i, ref devIface, ref didd, 256, out requiredSize, ref devInfo); string devicePath = didd.DevicePath; //create file handles using CT_CreateFile tempHandle = Kernel32.CreateFile(devicePath, Kernel32.GENERIC_READ | Kernel32.GENERIC_WRITE, Kernel32.FILE_SHARE_READ | Kernel32.FILE_SHARE_WRITE, IntPtr.Zero, Kernel32.OPEN_EXISTING, 0, IntPtr.Zero); //get capabilites - use getPreParsedData, and getCaps //store the reportlengths IntPtr ptrToPreParsedData = new IntPtr(); bool ppdSucsess = HID.HidD_GetPreparsedData(tempHandle, ref ptrToPreParsedData); if (ppdSucsess == false) { continue; } HIDP_CAPS capabilities = new HIDP_CAPS(); HID.HidP_GetCaps(ptrToPreParsedData, ref capabilities); HIDD_ATTRIBUTES attributes = new HIDD_ATTRIBUTES(); HID.HidD_GetAttributes(tempHandle, ref attributes); string productName = ""; string SN = ""; string manfString = ""; IntPtr buffer = Marshal.AllocHGlobal(126);//max alloc for string; if (HID.HidD_GetProductString(tempHandle, buffer, 126)) { productName = Marshal.PtrToStringAuto(buffer); } if (HID.HidD_GetSerialNumberString(tempHandle, buffer, 126)) { SN = Marshal.PtrToStringAuto(buffer); } if (HID.HidD_GetManufacturerString(tempHandle, buffer, 126)) { manfString = Marshal.PtrToStringAuto(buffer); } Marshal.FreeHGlobal(buffer); //Call freePreParsedData to release some stuff HID.HidD_FreePreparsedData(ref ptrToPreParsedData); //If connection was sucsessful, record the values in a global struct InterfaceDetails productInfo = new InterfaceDetails(); productInfo.devicePath = devicePath; productInfo.manufacturer = manfString; productInfo.product = productName; productInfo.PID = (ushort)attributes.ProductID; productInfo.VID = (ushort)attributes.VendorID; productInfo.versionNumber = (ushort)attributes.VersionNumber; productInfo.IN_reportByteLength = (int)capabilities.InputReportByteLength; productInfo.OUT_reportByteLength = (int)capabilities.OutputReportByteLength; productInfo.serialNumber = SN; //Check that serial number is actually a number int newSize = devices.Length + 1; Array.Resize(ref devices, newSize); devices[newSize - 1] = productInfo; } SetupAPI.SetupDiDestroyDeviceInfoList(i); return(devices); }
public static InterfaceDetails[] getConnectedDevices() { InterfaceDetails[] devices = new InterfaceDetails[0]; //Create structs to hold interface information SP_DEVINFO_DATA devInfo = new SP_DEVINFO_DATA(); devInfo.cbSize = (uint)Marshal.SizeOf(devInfo); SP_DEVICE_INTERFACE_DATA devIface = new SP_DEVICE_INTERFACE_DATA(); devIface.cbSize = (uint)(Marshal.SizeOf(devIface)); Guid G = Guid.Empty; HID.HidD_GetHidGuid(ref G); //Get the guid of the HID device class IntPtr deviceInfo = SetupAPI.SetupDiGetClassDevs(ref G, IntPtr.Zero, IntPtr.Zero, SetupAPI.DIGCF_DEVICEINTERFACE | SetupAPI.DIGCF_PRESENT); //Loop through all available entries in the device list, until false int j = 0; while (true) { if (!SetupAPI.SetupDiEnumDeviceInterfaces(deviceInfo, IntPtr.Zero, ref G, (uint)j, ref devIface)) { break; } uint requiredSize = 0; IntPtr detailMemory = Marshal.AllocHGlobal((int)requiredSize); SP_DEVICE_INTERFACE_DETAIL_DATA functionClassDeviceData = (SP_DEVICE_INTERFACE_DETAIL_DATA)Marshal.PtrToStructure(detailMemory, Typeof <SP_DEVICE_INTERFACE_DETAIL_DATA>()); functionClassDeviceData.cbSize = Marshal.SizeOf(functionClassDeviceData); if (!SetupAPI.SetupDiGetDeviceInterfaceDetail(deviceInfo, ref devIface, ref functionClassDeviceData, requiredSize, out requiredSize, ref devInfo)) { Marshal.FreeHGlobal(detailMemory); break; } string devicePath = functionClassDeviceData.DevicePath; Marshal.FreeHGlobal(detailMemory); //create file handles using CT_CreateFile uint desiredAccess = Kernel32.GENERIC_READ | Kernel32.GENERIC_WRITE; uint shareMode = Kernel32.FILE_SHARE_READ | Kernel32.FILE_SHARE_WRITE; SafeFileHandle tempHandle = Kernel32.CreateFile(devicePath, desiredAccess, shareMode, IntPtr.Zero, Kernel32.OPEN_EXISTING, 0, IntPtr.Zero); //get capabilites - use getPreParsedData, and getCaps //store the reportlengths IntPtr ptrToPreParsedData = new IntPtr(); bool ppdSucsess = HID.HidD_GetPreparsedData(tempHandle, ref ptrToPreParsedData); if (!ppdSucsess) { continue; } HIDP_CAPS capability = new HIDP_CAPS(); HID.HidP_GetCaps(ptrToPreParsedData, ref capability); HIDD_ATTRIBUTES attributes = new HIDD_ATTRIBUTES(); HID.HidD_GetAttributes(tempHandle, ref attributes); string productName = EMPTY; string SN = EMPTY; string manfString = EMPTY; const int bufferLen = 128; IntPtr buffer = Marshal.AllocHGlobal(bufferLen); if (HID.HidD_GetProductString(tempHandle, buffer, bufferLen)) { productName = Marshal.PtrToStringAuto(buffer); } if (HID.HidD_GetSerialNumberString(tempHandle, buffer, bufferLen)) { SN = Marshal.PtrToStringAuto(buffer); } if (HID.HidD_GetManufacturerString(tempHandle, buffer, bufferLen)) { manfString = Marshal.PtrToStringAuto(buffer); } Marshal.FreeHGlobal(buffer); //Call freePreParsedData to release some stuff HID.HidD_FreePreparsedData(ref ptrToPreParsedData); //If connection was sucsessful, record the values in a global struct InterfaceDetails productInfo = new InterfaceDetails(); productInfo.devicePath = devicePath; productInfo.manufacturer = manfString; productInfo.product = productName; productInfo.PID = (ushort)attributes.ProductID; productInfo.VID = (ushort)attributes.VendorID; productInfo.versionNumber = (ushort)attributes.VersionNumber; productInfo.IN_reportByteLength = capability.InputReportByteLength; productInfo.OUT_reportByteLength = capability.OutputReportByteLength; productInfo.serialNumber = SN; //Check that serial number is actually a number int newSize = devices.Length + 1; Array.Resize(ref devices, newSize); devices[newSize - 1] = productInfo; ++j; } SetupAPI.SetupDiDestroyDeviceInfoList(deviceInfo); return(devices); }