private void SendIoctlPayload( Smb2Client client, CtlCode_Values code, byte[] payload, Packet_Header_Flags_Values headerFlags, ulong messageId, uint treeId, ulong sessionId, FILEID fileId) { if (client == null) { throw new InvalidOperationException("The transport is not connected."); } if (payload == null) { throw new ArgumentNullException("payload"); } var request = new Smb2IOCtlRequestPacket(); request.Header.CreditCharge = 1; request.Header.Command = Smb2Command.IOCTL; request.Header.CreditRequestResponse = 1; request.Header.Flags = headerFlags; request.Header.MessageId = messageId; request.Header.TreeId = treeId; request.Header.SessionId = sessionId; request.PayLoad.CtlCode = code; if (code == CtlCode_Values.FSCTL_DFS_GET_REFERRALS || code == CtlCode_Values.FSCTL_DFS_GET_REFERRALS_EX) { request.PayLoad.FileId = FILEID.Invalid; } else { request.PayLoad.FileId = fileId; } if (payload.Length > 0) { request.PayLoad.InputOffset = request.BufferOffset; request.PayLoad.InputCount = (ushort)payload.Length; request.Buffer = payload; } request.PayLoad.MaxInputResponse = 0; request.PayLoad.MaxOutputResponse = 4096; request.PayLoad.Flags = IOCTL_Request_Flags_Values.SMB2_0_IOCTL_IS_FSCTL; ioctlRequestMessageIds.Enqueue(request.Header.MessageId); client.SendPacket(request); }