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);