private unsafe void HandleOverlappedAPI(bool success, string errorMessage, NativeOverlapped *pOverlapped, USBAsyncResult result, int bytesTransfered) { if (!success) { if (Marshal.GetLastWin32Error() != Kernel32.ERROR_IO_PENDING) { Overlapped.Unpack(pOverlapped); Overlapped.Free(pOverlapped); throw new Exception(errorMessage); } } else { // Immediate success! Overlapped.Unpack(pOverlapped); Overlapped.Free(pOverlapped); result.OnCompletion(true, null, bytesTransfered, false); // is the callback still called in this case?? todo } }
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); }