private static ConnectedDeviceDefinition GetDeviceDefinition(SafeFileHandle defaultInterfaceHandle, string deviceId) { var deviceDefinition = new ConnectedDeviceDefinition(deviceId) { DeviceType = DeviceType.Usb }; var bufferLength = (uint)Marshal.SizeOf(typeof(USB_DEVICE_DESCRIPTOR)); var isSuccess2 = WinUsbApiCalls.WinUsb_GetDescriptor(defaultInterfaceHandle, WinUsbApiCalls.DEFAULT_DESCRIPTOR_TYPE, 0, WinUsbApiCalls.EnglishLanguageID, out var _UsbDeviceDescriptor, bufferLength, out var lengthTransferred); HandleError(isSuccess2, "Couldn't get device descriptor"); if (_UsbDeviceDescriptor.iProduct > 0) { deviceDefinition.ProductName = WinUsbApiCalls.GetDescriptor(defaultInterfaceHandle, _UsbDeviceDescriptor.iProduct, "Couldn't get product name"); } if (_UsbDeviceDescriptor.iSerialNumber > 0) { deviceDefinition.SerialNumber = WinUsbApiCalls.GetDescriptor(defaultInterfaceHandle, _UsbDeviceDescriptor.iSerialNumber, "Couldn't get serial number"); } if (_UsbDeviceDescriptor.iManufacturer > 0) { deviceDefinition.Manufacturer = WinUsbApiCalls.GetDescriptor(defaultInterfaceHandle, _UsbDeviceDescriptor.iManufacturer, "Couldn't get manufacturer"); } deviceDefinition.VendorId = _UsbDeviceDescriptor.idVendor; deviceDefinition.ProductId = _UsbDeviceDescriptor.idProduct; deviceDefinition.WriteBufferSize = _UsbDeviceDescriptor.bMaxPacketSize0; deviceDefinition.ReadBufferSize = _UsbDeviceDescriptor.bMaxPacketSize0; return(deviceDefinition); }
private static ConnectedDeviceDefinition GetDeviceDefinition(SafeFileHandle defaultInterfaceHandle, string deviceId, ILogger logger) { var bufferLength = (uint)Marshal.SizeOf(typeof(USB_DEVICE_DESCRIPTOR)); #pragma warning disable IDE0059 // Unnecessary assignment of a value var isSuccess2 = WinUsbApiCalls.WinUsb_GetDescriptor(defaultInterfaceHandle, WinUsbApiCalls.DEFAULT_DESCRIPTOR_TYPE, 0, WinUsbApiCalls.EnglishLanguageID, out var _UsbDeviceDescriptor, bufferLength, out var lengthTransferred); #pragma warning restore IDE0059 // Unnecessary assignment of a value _ = WindowsHelpers.HandleError(isSuccess2, "Couldn't get device descriptor", logger); string productName = null; string serialNumber = null; string manufacturer = null; if (_UsbDeviceDescriptor.iProduct > 0) { productName = WinUsbApiCalls.GetDescriptor( defaultInterfaceHandle, _UsbDeviceDescriptor.iProduct, "Couldn't get product name", logger); } if (_UsbDeviceDescriptor.iSerialNumber > 0) { serialNumber = WinUsbApiCalls.GetDescriptor( defaultInterfaceHandle, _UsbDeviceDescriptor.iSerialNumber, "Couldn't get serial number", logger); } if (_UsbDeviceDescriptor.iManufacturer > 0) { manufacturer = WinUsbApiCalls.GetDescriptor( defaultInterfaceHandle, _UsbDeviceDescriptor.iManufacturer, "Couldn't get manufacturer", logger); } return(new ConnectedDeviceDefinition( deviceId, DeviceType.Usb, productName: productName, serialNumber: serialNumber, manufacturer: manufacturer, vendorId: _UsbDeviceDescriptor.idVendor, productId: _UsbDeviceDescriptor.idProduct, writeBufferSize: _UsbDeviceDescriptor.bMaxPacketSize0, readBufferSize: _UsbDeviceDescriptor.bMaxPacketSize0 )); }
private void Initialize() { Dispose(); int errorCode; if (string.IsNullOrEmpty(DeviceId)) { throw new WindowsException($"{nameof(Device.Net.DeviceDefinition)} must be specified before {nameof(InitializeAsync)} can be called."); } _DeviceHandle = APICalls.CreateFile(DeviceId, (APICalls.GenericWrite | APICalls.GenericRead), APICalls.FileShareRead | APICalls.FileShareWrite, IntPtr.Zero, APICalls.OpenExisting, APICalls.FileAttributeNormal | APICalls.FileFlagOverlapped, IntPtr.Zero); if (_DeviceHandle.IsInvalid) { //TODO: is error code useful here? errorCode = Marshal.GetLastWin32Error(); if (errorCode > 0) { throw new Exception($"Device handle no good. Error code: {errorCode}"); } } var isSuccess = WinUsbApiCalls.WinUsb_Initialize(_DeviceHandle, out var defaultInterfaceHandle); HandleError(isSuccess, "Couldn't initialize device"); var bufferLength = (uint)Marshal.SizeOf(typeof(USB_DEVICE_DESCRIPTOR)); isSuccess = WinUsbApiCalls.WinUsb_GetDescriptor(defaultInterfaceHandle, WinUsbApiCalls.DEFAULT_DESCRIPTOR_TYPE, 0, EnglishLanguageID, out _UsbDeviceDescriptor, bufferLength, out var lengthTransferred); HandleError(isSuccess, "Couldn't get device descriptor"); byte i = 0; //Get the first (default) interface var defaultInterface = GetInterface(defaultInterfaceHandle); _UsbInterfaces.Add(defaultInterface); while (true) { isSuccess = WinUsbApiCalls.WinUsb_GetAssociatedInterface(defaultInterfaceHandle, i, out var interfacePointer); if (!isSuccess) { errorCode = Marshal.GetLastWin32Error(); if (errorCode == APICalls.ERROR_NO_MORE_ITEMS) { break; } throw new Exception($"Could not enumerate interfaces for device {DeviceId}. Error code: { errorCode}"); } var associatedInterface = GetInterface(interfacePointer); _UsbInterfaces.Add(associatedInterface); i++; } IsInitialized = true; }