Exemplo n.º 1
0
        public void StartIoLoop(CancellationToken token)
        {
            IRawConvertible     response = null;
            IO_CTL_XFER_MESSAGE replyTo  = default;

            while (!token.IsCancellationRequested)
            {
                replyTo  = SendInitRequest(out var nTransferred, out var data, response, replyTo);
                response = HandleRequest(data, replyTo);
            }
        }
        private IO_CTL_XFER_MESSAGE SendInitRequest(out uint nTransferred, out byte[] data,
                                                    IRawConvertible response = null, IO_CTL_XFER_MESSAGE replyTo = default)
        {
            nTransferred = 0;
            data         = default;
            var      outputBuffer       = new byte[MAX_BCNT + IO_CTL_XFER_MESSAGE_LEN];
            var      outputBufferHandle = GCHandle.Alloc(outputBuffer, GCHandleType.Pinned);
            var      outputBufferPtr    = outputBufferHandle.AddrOfPinnedObject();
            var      outputBufferLen    = (uint)outputBuffer.Length;
            GCHandle inputBufferHandle  = default;

            var  inputBufferPtr = IntPtr.Zero;
            uint inputBufferLen = 0;

            if (response != null)
            {
                var reply = new IO_CTL_XFER_MESSAGE();
                reply.cid  = replyTo.cid;
                reply.cmd  = replyTo.cmd;
                reply.bcnt = (short)response.Raw.Length;

                var messageHeader = StructToBytes(reply);

                var inputBuffer = messageHeader.Concat(response.Raw).ToArray();
                inputBufferHandle = GCHandle.Alloc(inputBuffer, GCHandleType.Pinned);
                inputBufferPtr    = inputBufferHandle.AddrOfPinnedObject();
                inputBufferLen    = (uint)inputBuffer.Length;
            }

            var result = DeviceIoControl(
                _device,
                IOCTL_SOFTU2F_FILTER_INIT,
                inputBufferPtr, inputBufferLen,
                outputBufferPtr, outputBufferLen,
                ref nTransferred, IntPtr.Zero);

            if (result == 0)
            {
                return(default);