private unsafe void _PipeIOCallback(uint errorCode, uint numBytes, NativeOverlapped *pOverlapped) { try { Exception error = null; if (errorCode != 0) { error = new Win32Exception((int)errorCode, "Asynchronous operation on WinUSB device failed."); } Overlapped overlapped = Overlapped.Unpack(pOverlapped); WinUSBAsyncResult result = (WinUSBAsyncResult)overlapped.AsyncResult; Overlapped.Free(pOverlapped); pOverlapped = null; result.OnCompletion(false, error, (int)numBytes, true); } finally { if (pOverlapped != null) { Overlapped.Unpack(pOverlapped); Overlapped.Free(pOverlapped); } } }
public void ControlTransferOverlapped(byte requestType, byte request, ushort value, ushort index, ushort length, byte[] data, WinUSBAsyncResult result) { uint bytesReturned = 0; NativeInterface.WINUSB_SETUP_PACKET setupPacket; setupPacket.RequestType = requestType; setupPacket.Request = request; setupPacket.Value = value; setupPacket.Index = index; setupPacket.Length = length; Overlapped overlapped = new Overlapped(); overlapped.AsyncResult = result; unsafe { NativeOverlapped* pOverlapped = null; pOverlapped = overlapped.Pack(_PipeIOCallback, data); bool success = NativeInterface.WinUsb_ControlTransfer(_winUsbHandle, setupPacket, data, length, ref bytesReturned, pOverlapped); _HandleOverlappedAPI(success, "Asynchronous control transfer on WinUSB device failed.", pOverlapped, result, (int)bytesReturned); } }
public void WritePipeOverlapped(int ifaceIndex, byte pipeID, byte[] buffer, int offset, int bytesToWrite, WinUSBAsyncResult result) { Overlapped overlapped = new Overlapped(); overlapped.AsyncResult = result; unsafe { NativeOverlapped *pOverlapped = null; uint bytesWritten; pOverlapped = overlapped.Pack(_PipeIOCallback, buffer); bool success; // Buffer is pinned already by overlapped.Pack fixed(byte *pBuffer = buffer) { success = NativeInterface.WinUsb_WritePipe(_InterfaceHandle(ifaceIndex), pipeID, pBuffer + offset, (uint)bytesToWrite, out bytesWritten, pOverlapped); } _HandleOverlappedAPI(success, "Failed to asynchronously write pipe on WinUSB device.", pOverlapped, result, (int)bytesWritten); } }
private unsafe void _HandleOverlappedAPI(bool success, string errorMessage, NativeOverlapped *pOverlapped, WinUSBAsyncResult result, int bytesTransferred) { if (!success) { if (Marshal.GetLastWin32Error() != NativeInterface.ERROR_IO_PENDING) { Overlapped.Unpack(pOverlapped); Overlapped.Free(pOverlapped); throw new Win32Exception(errorMessage); } } else { // Immediate success! Overlapped.Unpack(pOverlapped); Overlapped.Free(pOverlapped); result.OnCompletion(true, null, bytesTransferred, false); } }
private unsafe void _HandleOverlappedAPI(bool success, string errorMessage, NativeOverlapped* pOverlapped, WinUSBAsyncResult result, int bytesTransferred) { if (!success) { if (Marshal.GetLastWin32Error() != NativeInterface.ERROR_IO_PENDING) { Overlapped.Unpack(pOverlapped); Overlapped.Free(pOverlapped); throw new Win32Exception(errorMessage); } } else { // Immediate success! Overlapped.Unpack(pOverlapped); Overlapped.Free(pOverlapped); result.OnCompletion(true, null, bytesTransferred, false); } }
public void WritePipeOverlapped(int ifaceIndex, byte pipeID, byte[] buffer, int offset, int bytesToWrite, WinUSBAsyncResult result) { Overlapped overlapped = new Overlapped(); overlapped.AsyncResult = result; unsafe { NativeOverlapped* pOverlapped = null; uint bytesWritten; pOverlapped = overlapped.Pack(_PipeIOCallback, buffer); bool success; // Buffer is pinned already by overlapped.Pack fixed (byte* pBuffer = buffer) { success = NativeInterface.WinUsb_WritePipe(_InterfaceHandle(ifaceIndex), pipeID, pBuffer + offset, (uint)bytesToWrite, out bytesWritten, pOverlapped); } _HandleOverlappedAPI(success, "Failed to asynchronously write pipe on WinUSB device.", pOverlapped, result, (int)bytesWritten); } }
public void ControlTransferOverlapped(byte requestType, byte request, ushort value, ushort index, ushort length, byte[] data, WinUSBAsyncResult result) { uint bytesReturned = 0; NativeInterface.WINUSB_SETUP_PACKET setupPacket; setupPacket.RequestType = requestType; setupPacket.Request = request; setupPacket.Value = value; setupPacket.Index = index; setupPacket.Length = length; Overlapped overlapped = new Overlapped(); overlapped.AsyncResult = result; unsafe { NativeOverlapped *pOverlapped = null; pOverlapped = overlapped.Pack(_PipeIOCallback, data); bool success = NativeInterface.WinUsb_ControlTransfer(_winUsbHandle, setupPacket, data, length, ref bytesReturned, pOverlapped); _HandleOverlappedAPI(success, "Asynchronous control transfer on WinUSB device failed.", pOverlapped, result, (int)bytesReturned); } }