Beispiel #1
0
        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);
                }
            }
        }
Beispiel #2
0
        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);
              }
        }
Beispiel #3
0
        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);
            }
        }
Beispiel #4
0
        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);
            }
        }
Beispiel #5
0
        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);
              }
        }
Beispiel #6
0
        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);
              }
        }
Beispiel #7
0
        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);
            }
        }