private IAsyncResult BeginWrite(byte endpoint, byte[] buffer, int length, AsyncCallback userCallback, object stateObject) { var result = new USBAsyncResult(userCallback, stateObject); try { var overlapped = new Overlapped(); overlapped.AsyncResult = result; unsafe { NativeOverlapped *pOverlapped = null; int bytesWritten; pOverlapped = overlapped.Pack(PipeIOCallback, buffer); bool success; // Buffer is pinned already by overlapped.Pack fixed(byte *pBuffer = buffer) { success = WinUsb.NativeMethods.WinUsb_WritePipe(winUsbHandle, endpoint, buffer, length, out bytesWritten, (IntPtr)pOverlapped); } HandleOverlappedAPI(success, "Failed to asynchronously write pipe on WinUSB device.", pOverlapped, result, bytesWritten); } } catch (Exception e) { if (result != null) { result.Dispose(); } Close(); // Transfer exceptions are fatal; close the connection. } return(result); }
private IAsyncResult BeginRead(byte endpoint, byte[] buffer, int length, AsyncCallback userCallback, object stateObject) { var result = new USBAsyncResult(userCallback, stateObject); try { var overlapped = new Overlapped(); overlapped.AsyncResult = result; unsafe { NativeOverlapped *pOverlapped = null; int bytesRead; pOverlapped = overlapped.Pack(PipeIOCallback, buffer); bool success; // Buffer is pinned already by overlapped.Pack success = WinUsb.NativeMethods.WinUsb_ReadPipe(winUsbHandle, endpoint, buffer, length, out bytesRead, (IntPtr)pOverlapped); HandleOverlappedAPI(success, "Failed to asynchronously read pipe on WinUSB device.", pOverlapped, result, bytesRead); } } catch (Exception e) { if (result != null) { result.Dispose(); } throw new Exception("Failed to read from pipe.", e); } return(result); }