//---#+************************************************************************ //---NOTATION: //- int CT_SetupDiEnumDeviceInterfaces(int memberIndex) //- //--- DESCRIPTION: //-- results = 1 iin the second pass of the routine is success //- DeviceInterfaceDetailDataSize parameter (RequiredSize) came from the first pass // // Autor: F.L. //-*************************************************************************+#* public unsafe int CT_SetupDiGetDeviceInterfaceDetailx(ref int RequiredSize, int DeviceInterfaceDetailDataSize) { myPSP_DEVICE_INTERFACE_DETAIL_DATA = new PSP_DEVICE_INTERFACE_DETAIL_DATA(); // // This part needs some work // if I use the following line of code // myPSP_DEVICE_INTERFACE_DETAIL_DATA.cbSize = sizeof(PSP_DEVICE_INTERFACE_DETAIL_DATA); // I get the following error // !! Cannot take the address or size of a variable of a managed type ('USBSharp.USBSharp.PSP_DEVICE_INTERFACE_DETAIL_DATA') // // As a result.. this is hard coded for now !!! // for the c struct PSP_DEVICE_INTERFACE_DETAIL_DATA dizeof = DWORD cbSize (size 4) + Char[0] (size 1) = Total size 5 ? // myPSP_DEVICE_INTERFACE_DETAIL_DATA.cbSize = 5; int results = SetupDiGetDeviceInterfaceDetail( hDevInfo, // IN HDEVINFO DeviceInfoSet, ref mySP_DEVICE_INTERFACE_DATA, // IN PSP_DEVICE_INTERFACE_DATA DeviceInterfaceData, ref myPSP_DEVICE_INTERFACE_DETAIL_DATA, // DeviceInterfaceDetailData, OPTIONAL DeviceInterfaceDetailDataSize, // IN DWORD DeviceInterfaceDetailDataSize, ref RequiredSize, // OUT PDWORD RequiredSize, OPTIONAL null); // DevicePathName = myPSP_DEVICE_INTERFACE_DETAIL_DATA.DevicePath; return(results); }
private static extern unsafe int SetupDiGetDeviceInterfaceDetail( int DeviceInfoSet, ref SP_DEVICE_INTERFACE_DATA lpDeviceInterfaceData, ref PSP_DEVICE_INTERFACE_DETAIL_DATA myPSP_DEVICE_INTERFACE_DETAIL_DATA, int detailSize, ref int requiredSize, int *bPtr);
public static extern int SetupDiGetDeviceInterfaceDetail( int DeviceInfoSet, ref SP_DEVICE_INTERFACE_DATA lpDeviceInterfaceData, ref PSP_DEVICE_INTERFACE_DETAIL_DATA myPSP_DEVICE_INTERFACE_DETAIL_DATA, int detailSize, ref int requiredSize, IntPtr bPtr);
private unsafe void _Init(string devicePath, bool throwNotFoundError) { int result; int deviceCount = 0; int size = 0; int requiredSize = 0; _guid = new GUID(); HidD_GetHidGuid(ref _guid); _hDeviceInfo = SetupDiGetClassDevs(ref _guid, null, null, DIGCF_INTERFACEDEVICE | DIGCF_PRESENT); do { _SP_DEVICE_INTERFACE_DATA = new SP_DEVICE_INTERFACE_DATA(); _SP_DEVICE_INTERFACE_DATA.cbSize = Marshal.SizeOf(_SP_DEVICE_INTERFACE_DATA); result = SetupDiEnumDeviceInterfaces(_hDeviceInfo, 0, ref _guid, deviceCount, ref _SP_DEVICE_INTERFACE_DATA); SetupDiGetDeviceInterfaceDetail(_hDeviceInfo, ref _SP_DEVICE_INTERFACE_DATA, null, 0, ref requiredSize, null); size = requiredSize; _PSP_DEVICE_INTERFACE_DETAIL_DATA = new PSP_DEVICE_INTERFACE_DETAIL_DATA(); _PSP_DEVICE_INTERFACE_DETAIL_DATA.cbSize = 5; SetupDiGetDeviceInterfaceDetail(_hDeviceInfo, ref _SP_DEVICE_INTERFACE_DATA, ref _PSP_DEVICE_INTERFACE_DETAIL_DATA, size, ref requiredSize, null); _devicePath = _PSP_DEVICE_INTERFACE_DETAIL_DATA.DevicePath; if (_devicePath == devicePath) { _found = true; _SP_DEVICE_INTERFACE_DATA = new SP_DEVICE_INTERFACE_DATA(); _SP_DEVICE_INTERFACE_DATA.cbSize = Marshal.SizeOf(_SP_DEVICE_INTERFACE_DATA); SetupDiEnumDeviceInterfaces(_hDeviceInfo, 0, ref _guid, deviceCount, ref _SP_DEVICE_INTERFACE_DATA); size = 0; requiredSize = 0; SetupDiGetDeviceInterfaceDetail(_hDeviceInfo, ref _SP_DEVICE_INTERFACE_DATA, null, size, ref requiredSize, null); SetupDiGetDeviceInterfaceDetail(_hDeviceInfo, ref _SP_DEVICE_INTERFACE_DATA, null, size, ref requiredSize, null); _hidHandle = CreateFile(_devicePath, GENERIC_READ | GENERIC_WRITE, FILE_SHARE_READ | FILE_SHARE_WRITE, 0, OPEN_EXISTING, 0, 0); break; } deviceCount++; } while (result != 0); if (!_found) { if (throwNotFoundError) { throw new InvalidOperationException("Device not found"); } } else { _dataReadingThread = new Thread(new ThreadStart(_ReadDataThread)); _dataReadingThread.Start(); } }
//---#+************************************************************************ //---NOTATION: //- int CT_SetupDiEnumDeviceInterfaces(int memberIndex) //- //--- DESCRIPTION: //-- results = 1 iin the second pass of the routine is success //- DeviceInterfaceDetailDataSize parameter (RequiredSize) came from the first pass // // Autor: F.L. //-*************************************************************************+#* public unsafe int CT_SetupDiGetDeviceInterfaceDetailx(ref string devicePath, ref int RequiredSize, int DeviceInterfaceDetailDataSize) { myPSP_DEVICE_INTERFACE_DETAIL_DATA = new PSP_DEVICE_INTERFACE_DETAIL_DATA(); myPSP_DEVICE_INTERFACE_DETAIL_DATA.cbSize = 5; int results = SetupDiGetDeviceInterfaceDetail( hDevInfo, // IN HDEVINFO DeviceInfoSet, ref mySP_DEVICE_INTERFACE_DATA, // IN PSP_DEVICE_INTERFACE_DATA DeviceInterfaceData, ref myPSP_DEVICE_INTERFACE_DETAIL_DATA, // DeviceInterfaceDetailData, OPTIONAL DeviceInterfaceDetailDataSize, // IN DWORD DeviceInterfaceDetailDataSize, ref RequiredSize, // OUT PDWORD RequiredSize, OPTIONAL null); // DevicePathName = myPSP_DEVICE_INTERFACE_DETAIL_DATA.DevicePath; devicePath = myPSP_DEVICE_INTERFACE_DETAIL_DATA.DevicePath; return(results); }
//---#+************************************************************************ //---NOTATION: //- int CT_SetupDiEnumDeviceInterfaces(int memberIndex) //- //--- DESCRIPTION: //-- results = 1 iin the second pass of the routine is success //- DeviceInterfaceDetailDataSize parameter (RequiredSize) came from the first pass // // Autor: F.L. //-*************************************************************************+#* public unsafe int CT_SetupDiGetDeviceInterfaceDetailx(ref int RequiredSize, int DeviceInterfaceDetailDataSize) { myPSP_DEVICE_INTERFACE_DETAIL_DATA = new PSP_DEVICE_INTERFACE_DETAIL_DATA(); // // This part needs some work // if I use the following line of code // myPSP_DEVICE_INTERFACE_DETAIL_DATA.cbSize = sizeof(PSP_DEVICE_INTERFACE_DETAIL_DATA); // I get the following error // !! Cannot take the address or size of a variable of a managed type ('USBSharp.USBSharp.PSP_DEVICE_INTERFACE_DETAIL_DATA') // // As a result.. this is hard coded for now !!! // for the c struct PSP_DEVICE_INTERFACE_DETAIL_DATA dizeof = DWORD cbSize (size 4) + Char[0] (size 1) = Total size 5 ? // myPSP_DEVICE_INTERFACE_DETAIL_DATA.cbSize = 5; int results = SetupDiGetDeviceInterfaceDetail( hDevInfo, // IN HDEVINFO DeviceInfoSet, ref mySP_DEVICE_INTERFACE_DATA, // IN PSP_DEVICE_INTERFACE_DATA DeviceInterfaceData, ref myPSP_DEVICE_INTERFACE_DETAIL_DATA, // DeviceInterfaceDetailData, OPTIONAL DeviceInterfaceDetailDataSize, // IN DWORD DeviceInterfaceDetailDataSize, ref RequiredSize, // OUT PDWORD RequiredSize, OPTIONAL null); // DevicePathName = myPSP_DEVICE_INTERFACE_DETAIL_DATA.DevicePath; return results; }
static extern unsafe int SetupDiGetDeviceInterfaceDetail( int DeviceInfoSet, ref SP_DEVICE_INTERFACE_DATA lpDeviceInterfaceData, ref PSP_DEVICE_INTERFACE_DETAIL_DATA myPSP_DEVICE_INTERFACE_DETAIL_DATA, int detailSize, ref int requiredSize, int* bPtr);
private unsafe void _Init(int vendorId, int productId, bool throwNotFoundError) { int result; int deviceCount = 0; int size = 0; int requiredSize = 0; _guid = new GUID(); HidD_GetHidGuid(ref _guid); _hDeviceInfo = SetupDiGetClassDevs(ref _guid, null, null, DIGCF_INTERFACEDEVICE | DIGCF_PRESENT); do { _SP_DEVICE_INTERFACE_DATA = new SP_DEVICE_INTERFACE_DATA(); _SP_DEVICE_INTERFACE_DATA.cbSize = Marshal.SizeOf(_SP_DEVICE_INTERFACE_DATA); result = SetupDiEnumDeviceInterfaces(_hDeviceInfo, 0, ref _guid, deviceCount, ref _SP_DEVICE_INTERFACE_DATA); SetupDiGetDeviceInterfaceDetail(_hDeviceInfo, ref _SP_DEVICE_INTERFACE_DATA, null, 0, ref requiredSize, null); size = requiredSize; _PSP_DEVICE_INTERFACE_DETAIL_DATA = new PSP_DEVICE_INTERFACE_DETAIL_DATA(); _PSP_DEVICE_INTERFACE_DETAIL_DATA.cbSize = 5; SetupDiGetDeviceInterfaceDetail(_hDeviceInfo, ref _SP_DEVICE_INTERFACE_DATA, ref _PSP_DEVICE_INTERFACE_DETAIL_DATA, size, ref requiredSize, null); _devicePath = _PSP_DEVICE_INTERFACE_DETAIL_DATA.DevicePath; string deviceID = "vid_" + vendorId.ToString("x4") + "&pid_" + productId.ToString("x4"); if (_devicePath.IndexOf(deviceID) > 0) { _found = true; _SP_DEVICE_INTERFACE_DATA = new SP_DEVICE_INTERFACE_DATA(); _SP_DEVICE_INTERFACE_DATA.cbSize = Marshal.SizeOf(_SP_DEVICE_INTERFACE_DATA); SetupDiEnumDeviceInterfaces(_hDeviceInfo, 0, ref _guid, deviceCount, ref _SP_DEVICE_INTERFACE_DATA); size = 0; requiredSize = 0; SetupDiGetDeviceInterfaceDetail(_hDeviceInfo, ref _SP_DEVICE_INTERFACE_DATA, null, size, ref requiredSize, null); SetupDiGetDeviceInterfaceDetail(_hDeviceInfo, ref _SP_DEVICE_INTERFACE_DATA, null, size, ref requiredSize, null); _hidHandle = CreateFile(_devicePath, GENERIC_READ | GENERIC_WRITE, FILE_SHARE_READ | FILE_SHARE_WRITE, 0, OPEN_EXISTING, 0, 0); break; } deviceCount++; } while (result != 0); if (!_found) { if (throwNotFoundError) throw new InvalidOperationException("Device not found"); } else { _dataReadingThread = new Thread(new ThreadStart(_ReadDataThread)); _dataReadingThread.Start(); } }
public static unsafe List <string> GetAllDevices(int?vendorId, int?productId) { int result; int deviceCount = 0; int size = 0; int requiredSize = 0; var ret = new List <string>(); var guid = new GUID(); HidD_GetHidGuid(ref guid); var hDeviceInfo = SetupDiGetClassDevs(ref guid, null, null, DIGCF_INTERFACEDEVICE | DIGCF_PRESENT); do { var SP_DEVICE_INTERFACE_DATA = new SP_DEVICE_INTERFACE_DATA(); SP_DEVICE_INTERFACE_DATA.cbSize = Marshal.SizeOf(SP_DEVICE_INTERFACE_DATA); result = SetupDiEnumDeviceInterfaces(hDeviceInfo, 0, ref guid, deviceCount, ref SP_DEVICE_INTERFACE_DATA); SetupDiGetDeviceInterfaceDetail(hDeviceInfo, ref SP_DEVICE_INTERFACE_DATA, null, 0, ref requiredSize, null); size = requiredSize; var PSP_DEVICE_INTERFACE_DETAIL_DATA = new PSP_DEVICE_INTERFACE_DETAIL_DATA(); PSP_DEVICE_INTERFACE_DETAIL_DATA.cbSize = 5; SetupDiGetDeviceInterfaceDetail(hDeviceInfo, ref SP_DEVICE_INTERFACE_DATA, ref PSP_DEVICE_INTERFACE_DETAIL_DATA, size, ref requiredSize, null); var devicePath = PSP_DEVICE_INTERFACE_DETAIL_DATA.DevicePath; string deviceID = String.Empty; if (vendorId.HasValue) { deviceID += "vid_" + vendorId.Value.ToString("x4"); } if (productId.HasValue) { if (!String.IsNullOrEmpty(deviceID)) { deviceID += "&"; } deviceID += "pid_" + productId.Value.ToString("x4"); } if (String.IsNullOrEmpty(deviceID) || devicePath.IndexOf(deviceID) > 0) { SP_DEVICE_INTERFACE_DATA = new SP_DEVICE_INTERFACE_DATA(); SP_DEVICE_INTERFACE_DATA.cbSize = Marshal.SizeOf(SP_DEVICE_INTERFACE_DATA); SetupDiEnumDeviceInterfaces(hDeviceInfo, 0, ref guid, deviceCount, ref SP_DEVICE_INTERFACE_DATA); size = 0; requiredSize = 0; SetupDiGetDeviceInterfaceDetail(hDeviceInfo, ref SP_DEVICE_INTERFACE_DATA, null, size, ref requiredSize, null); SetupDiGetDeviceInterfaceDetail(hDeviceInfo, ref SP_DEVICE_INTERFACE_DATA, null, size, ref requiredSize, null); //var hidHandle = CreateFile(devicePath, GENERIC_READ | GENERIC_WRITE, FILE_SHARE_READ | FILE_SHARE_WRITE, 0, OPEN_EXISTING, 0, 0); ret.Add(devicePath); //CloseHandle(hidHandle); } deviceCount++; } while (result != 0); SetupDiDestroyDeviceInfoList(hDeviceInfo); return(ret); }