private void Initialize() { Dispose(); int errorCode; if (string.IsNullOrEmpty(DeviceId)) { throw new WindowsException($"{nameof(DeviceDefinitionBase)} 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"); ConnectedDeviceDefinition = GetDeviceDefinition(defaultInterfaceHandle, DeviceId); 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++; } }
private void Initialize() { using var logScope = Logger.BeginScope("DeviceId: {deviceId} Call: {call}", DeviceId, nameof(Initialize)); try { Close(); int errorCode; if (string.IsNullOrEmpty(DeviceId)) { throw new ValidationException( $"{nameof(ConnectedDeviceDefinition)} must be specified before {nameof(InitializeAsync)} can be called."); } _DeviceHandle = APICalls.CreateFile(DeviceId, FileAccessRights.GenericWrite | FileAccessRights.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 ApiException($"Device handle no good. Error code: {errorCode}"); } } Logger.LogInformation(Messages.SuccessMessageGotWriteAndReadHandle); var isSuccess = WinUsbApiCalls.WinUsb_Initialize(_DeviceHandle, out var interfaceHandle); _ = WindowsHelpers.HandleError(isSuccess, Messages.ErrorMessageCouldntIntializeDevice, Logger); #pragma warning disable CA2000 //We need to hold on to this handle var defaultInterfaceHandle = new SafeFileHandle(interfaceHandle, false); #pragma warning restore CA2000 var connectedDeviceDefinition = GetDeviceDefinition(defaultInterfaceHandle, DeviceId, Logger); if (!WriteBufferSizeProtected.HasValue) { if (!connectedDeviceDefinition.WriteBufferSize.HasValue) { throw new ValidationException("Write buffer size not specified"); } WriteBufferSizeProtected = (ushort)connectedDeviceDefinition.WriteBufferSize.Value; } if (!ReadBufferSizeProtected.HasValue) { if (!connectedDeviceDefinition.ReadBufferSize.HasValue) { throw new ValidationException("Read buffer size not specified"); } ReadBufferSizeProtected = (ushort)connectedDeviceDefinition.ReadBufferSize.Value; } //Get the first (default) interface #pragma warning disable CA2000 //Ths should be disposed later var defaultInterface = GetInterface(defaultInterfaceHandle); UsbInterfaces.Add(defaultInterface); byte i = 0; 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 ApiException( $"Could not enumerate interfaces for device. Error code: {errorCode}"); } var associatedInterface = GetInterface(interfacePointer); //TODO: this is bad design. The handler should be taking care of this UsbInterfaces.Add(associatedInterface); i++; } RegisterDefaultInterfaces(); #pragma warning restore CA2000 } catch (Exception ex) { Logger.LogError(ex, Messages.ErrorMessageCouldntIntializeDevice); throw; } }
private void Initialize() { try { Close(); int errorCode; if (string.IsNullOrEmpty(DeviceId)) { throw new ValidationException($"{nameof(DeviceDefinitionBase)} must be specified before {nameof(InitializeAsync)} can be called."); } _DeviceHandle = APICalls.CreateFile(DeviceId, FileAccessRights.GenericWrite | FileAccessRights.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 ApiException($"Device handle no good. Error code: {errorCode}"); } } Logger?.Log(Messages.SuccessMessageGotWriteAndReadHandle, nameof(WindowsUsbInterfaceManager), null, LogLevel.Information); var isSuccess = WinUsbApiCalls.WinUsb_Initialize(_DeviceHandle, out var defaultInterfaceHandle); WindowsDeviceBase.HandleError(isSuccess, Messages.ErrorMessageCouldntIntializeDevice); var connectedDeviceDefinition = WindowsUsbDeviceFactory.GetDeviceDefinition(defaultInterfaceHandle, DeviceId); if (!_WriteBufferSize.HasValue) { if (!connectedDeviceDefinition.WriteBufferSize.HasValue) { throw new ValidationException("Write buffer size not specified"); } _WriteBufferSize = (ushort)connectedDeviceDefinition.WriteBufferSize.Value; } if (!_ReadBufferSize.HasValue) { if (!connectedDeviceDefinition.ReadBufferSize.HasValue) { throw new ValidationException("Read buffer size not specified"); } _ReadBufferSize = (ushort)connectedDeviceDefinition.ReadBufferSize.Value; } //Get the first (default) interface var defaultInterface = GetInterface(defaultInterfaceHandle); UsbInterfaces.Add(defaultInterface); byte i = 0; 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 ApiException($"Could not enumerate interfaces for device. Error code: { errorCode}"); } var associatedInterface = GetInterface(interfacePointer); //TODO: this is bad design. The handler should be taking care of this UsbInterfaces.Add(associatedInterface); i++; } RegisterDefaultInterfaces(); } catch (Exception ex) { Logger?.Log($"{nameof(Initialize)} error. DeviceId {DeviceId}", nameof(UsbDevice), ex, LogLevel.Error); throw; } }
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; }