public NTStatus DeviceIOControl(object handle, uint ctlCode, byte[] input, out byte[] output, int maxOutputLength) { if ((IoControlCode)ctlCode == IoControlCode.FSCTL_PIPE_TRANSCEIVE) { return(FsCtlPipeTranscieve(handle, input, out output, maxOutputLength)); } output = null; NTTransactIOCTLRequest subcommand = new NTTransactIOCTLRequest(); subcommand.FID = (ushort)handle; subcommand.FunctionCode = ctlCode; subcommand.IsFsctl = true; subcommand.Data = input; NTTransactRequest request = new NTTransactRequest(); request.Function = subcommand.SubcommandName; request.Setup = subcommand.GetSetup(); request.TransParameters = subcommand.GetParameters(m_client.Unicode); request.TransData = subcommand.GetData(); request.TotalDataCount = (uint)request.TransData.Length; request.TotalParameterCount = (uint)request.TransParameters.Length; request.MaxParameterCount = NTTransactIOCTLResponse.ParametersLength; request.MaxDataCount = (uint)maxOutputLength; TrySendMessage(request); SMB1Message reply = m_client.WaitForMessage(CommandName.SMB_COM_NT_TRANSACT); if (reply != null) { if (reply.Header.Status == NTStatus.STATUS_SUCCESS && reply.Commands[0] is NTTransactResponse) { NTTransactResponse response = (NTTransactResponse)reply.Commands[0]; NTTransactIOCTLResponse subcommandResponse = new NTTransactIOCTLResponse(response.Setup, response.TransData); output = subcommandResponse.Data; } return(reply.Header.Status); } return(NTStatus.STATUS_INVALID_SMB); }
public void DeviceIOControl(NtHandle handle, uint ctlCode, byte[] input, out byte[]?output, int maxOutputLength) { if ((IoControlCode)ctlCode == IoControlCode.FSCTL_PIPE_TRANSCEIVE) { FsCtlPipeTranscieve(handle, input, out output, maxOutputLength); return; } NTTransactIOCTLRequest subcommand = new NTTransactIOCTLRequest { FID = ((Smb1Handle)handle).FID, FunctionCode = ctlCode, IsFsctl = true, Data = input }; NTTransactRequest request = new NTTransactRequest { Function = subcommand.SubcommandName, Setup = subcommand.GetSetup(), TransParameters = subcommand.GetParameters(m_client.Unicode), TransData = subcommand.GetData() }; request.TotalDataCount = (uint)request.TransData.Length; request.TotalParameterCount = (uint)request.TransParameters.Length; request.MaxParameterCount = NTTransactIOCTLResponse.ParametersLength; request.MaxDataCount = (uint)maxOutputLength; TrySendMessage(request); SMB1Message reply = m_client.WaitForMessage(CommandName.SMB_COM_NT_TRANSACT); if (reply.Header.Status != NTStatus.STATUS_SUCCESS || !(reply.Commands[0] is NTTransactResponse ntTransactResponse)) { throw new NtStatusException(reply.Header.Status); } NTTransactIOCTLResponse subcommandResponse = new NTTransactIOCTLResponse(ntTransactResponse.Setup, ntTransactResponse.TransData); output = subcommandResponse.Data; }