Пример #1
0
        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);
        }
Пример #2
0
        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;
        }