示例#1
0
 public static async Task <string> ReadAsciiString(this Stream stream)
 {
     return(LittleEndianConverter.ConvertToAsciiString(await stream.ReadBytes(4)));
 }
示例#2
0
 public QueryFileEaInfo(byte[] buffer, int offset)
 {
     EaSize = LittleEndianConverter.ToUInt32(buffer, offset);
 }
 public Transaction2QueryPathInformationResponse(byte[] parameters, byte[] data)
 {
     EaErrorOffset    = LittleEndianConverter.ToUInt16(parameters, 0);
     InformationBytes = data;
 }
 public override byte[] GetSetup()
 {
     return(LittleEndianConverter.GetBytes((ushort)SubcommandName));
 }
示例#5
0
        public static ushort GetPDULength(byte[] buffer, int offset)
        {
            ushort fragmentLength = LittleEndianConverter.ToUInt16(buffer, offset + 8);

            return(fragmentLength);
        }
示例#6
0
        public TransactionCallNamedPipeRequest(byte[] setup, byte[] data) : base()
        {
            Priority = LittleEndianConverter.ToUInt16(setup, 2);

            WriteData = data;
        }
示例#7
0
 public NTTransactQuerySecurityDescriptorRequest(byte[] parameters)
 {
     FID                = LittleEndianConverter.ToUInt16(parameters, 0);
     Reserved           = LittleEndianConverter.ToUInt16(parameters, 2);
     SecurityInfoFields = (SecurityInformation)LittleEndianConverter.ToUInt32(parameters, 4);
 }
 public PtypObjectRecord(byte[] buffer)
 {
     Nid    = new NodeID(buffer, 0x00);
     ulSize = LittleEndianConverter.ToUInt32(buffer, 0x04);
 }
示例#9
0
        public static SMB2Command ReadResponse(byte[] buffer, int offset)
        {
            SMB2CommandName commandName   = (SMB2CommandName)LittleEndianConverter.ToUInt16(buffer, offset + 12);
            ushort          structureSize = LittleEndianConverter.ToUInt16(buffer, offset + SMB2Header.Length + 0);

            switch (commandName)
            {
            case SMB2CommandName.Negotiate:
            {
                if (structureSize == NegotiateResponse.DeclaredSize)
                {
                    return(new NegotiateResponse(buffer, offset));
                }
                else if (structureSize == ErrorResponse.DeclaredSize)
                {
                    return(new ErrorResponse(buffer, offset));
                }
                else
                {
                    throw new InvalidDataException();
                }
            }

            case SMB2CommandName.SessionSetup:
            {
                // SESSION_SETUP Response and ERROR Response have the same declared StructureSize of 9.
                if (structureSize == SessionSetupResponse.DeclaredSize)
                {
                    NTStatus status = (NTStatus)LittleEndianConverter.ToUInt32(buffer, offset + 8);
                    if (status == NTStatus.STATUS_SUCCESS || status == NTStatus.STATUS_MORE_PROCESSING_REQUIRED)
                    {
                        return(new SessionSetupResponse(buffer, offset));
                    }
                    else
                    {
                        return(new ErrorResponse(buffer, offset));
                    }
                }
                else
                {
                    throw new InvalidDataException();
                }
            }

            case SMB2CommandName.Logoff:
            {
                if (structureSize == LogoffResponse.DeclaredSize)
                {
                    return(new LogoffResponse(buffer, offset));
                }
                else if (structureSize == ErrorResponse.DeclaredSize)
                {
                    return(new ErrorResponse(buffer, offset));
                }
                else
                {
                    throw new InvalidDataException();
                }
            }

            case SMB2CommandName.TreeConnect:
            {
                if (structureSize == TreeConnectResponse.DeclaredSize)
                {
                    return(new TreeConnectResponse(buffer, offset));
                }
                else if (structureSize == ErrorResponse.DeclaredSize)
                {
                    return(new ErrorResponse(buffer, offset));
                }
                else
                {
                    throw new InvalidDataException();
                }
            }

            case SMB2CommandName.TreeDisconnect:
            {
                if (structureSize == TreeDisconnectResponse.DeclaredSize)
                {
                    return(new TreeDisconnectResponse(buffer, offset));
                }
                else if (structureSize == ErrorResponse.DeclaredSize)
                {
                    return(new ErrorResponse(buffer, offset));
                }
                else
                {
                    throw new InvalidDataException();
                }
            }

            case SMB2CommandName.Create:
            {
                if (structureSize == CreateResponse.DeclaredSize)
                {
                    return(new CreateResponse(buffer, offset));
                }
                else if (structureSize == ErrorResponse.DeclaredSize)
                {
                    return(new ErrorResponse(buffer, offset));
                }
                else
                {
                    throw new InvalidDataException();
                }
            }

            case SMB2CommandName.Close:
            {
                if (structureSize == CloseResponse.DeclaredSize)
                {
                    return(new CloseResponse(buffer, offset));
                }
                else if (structureSize == ErrorResponse.DeclaredSize)
                {
                    return(new ErrorResponse(buffer, offset));
                }
                else
                {
                    throw new InvalidDataException();
                }
            }

            case SMB2CommandName.Flush:
            {
                if (structureSize == FlushResponse.DeclaredSize)
                {
                    return(new FlushResponse(buffer, offset));
                }
                else if (structureSize == ErrorResponse.DeclaredSize)
                {
                    return(new ErrorResponse(buffer, offset));
                }
                else
                {
                    throw new InvalidDataException();
                }
            }

            case SMB2CommandName.Read:
            {
                if (structureSize == SMB2.ReadResponse.DeclaredSize)
                {
                    return(new ReadResponse(buffer, offset));
                }
                else if (structureSize == ErrorResponse.DeclaredSize)
                {
                    return(new ErrorResponse(buffer, offset));
                }
                else
                {
                    throw new InvalidDataException();
                }
            }

            case SMB2CommandName.Write:
            {
                if (structureSize == WriteResponse.DeclaredSize)
                {
                    return(new WriteResponse(buffer, offset));
                }
                else if (structureSize == ErrorResponse.DeclaredSize)
                {
                    return(new ErrorResponse(buffer, offset));
                }
                else
                {
                    throw new InvalidDataException();
                }
            }

            case SMB2CommandName.Lock:
            {
                if (structureSize == LockResponse.DeclaredSize)
                {
                    return(new LockResponse(buffer, offset));
                }
                else if (structureSize == ErrorResponse.DeclaredSize)
                {
                    return(new ErrorResponse(buffer, offset));
                }
                else
                {
                    throw new InvalidDataException();
                }
            }

            case SMB2CommandName.IOCtl:
            {
                if (structureSize == IOCtlResponse.DeclaredSize)
                {
                    return(new IOCtlResponse(buffer, offset));
                }
                else if (structureSize == ErrorResponse.DeclaredSize)
                {
                    return(new ErrorResponse(buffer, offset));
                }
                else
                {
                    throw new InvalidDataException();
                }
            }

            case SMB2CommandName.Cancel:
            {
                if (structureSize == ErrorResponse.DeclaredSize)
                {
                    return(new ErrorResponse(buffer, offset));
                }
                else
                {
                    throw new InvalidDataException();
                }
            }

            case SMB2CommandName.Echo:
            {
                if (structureSize == EchoResponse.DeclaredSize)
                {
                    return(new EchoResponse(buffer, offset));
                }
                else if (structureSize == ErrorResponse.DeclaredSize)
                {
                    return(new ErrorResponse(buffer, offset));
                }
                else
                {
                    throw new InvalidDataException();
                }
            }

            case SMB2CommandName.QueryDirectory:
            {
                // QUERY_DIRECTORY Response and ERROR Response have the same declared StructureSize of 9.
                if (structureSize == QueryDirectoryResponse.DeclaredSize)
                {
                    NTStatus status = (NTStatus)LittleEndianConverter.ToUInt32(buffer, offset + 8);
                    if (status == NTStatus.STATUS_SUCCESS)
                    {
                        return(new QueryDirectoryResponse(buffer, offset));
                    }
                    else
                    {
                        return(new ErrorResponse(buffer, offset));
                    }
                }
                else
                {
                    throw new InvalidDataException();
                }
            }

            case SMB2CommandName.ChangeNotify:
            {
                // CHANGE_NOTIFY Response and ERROR Response have the same declared StructureSize of 9.
                if (structureSize == ChangeNotifyResponse.DeclaredSize)
                {
                    NTStatus status = (NTStatus)LittleEndianConverter.ToUInt32(buffer, offset + 8);
                    if (status == NTStatus.STATUS_SUCCESS ||
                        status == NTStatus.STATUS_NOTIFY_CLEANUP ||
                        status == NTStatus.STATUS_NOTIFY_ENUM_DIR)
                    {
                        return(new ChangeNotifyResponse(buffer, offset));
                    }
                    else
                    {
                        return(new ErrorResponse(buffer, offset));
                    }
                }
                else
                {
                    throw new InvalidDataException();
                }
            }

            case SMB2CommandName.QueryInfo:
            {
                // QUERY_INFO Response and ERROR Response have the same declared StructureSize of 9.
                if (structureSize == QueryInfoResponse.DeclaredSize)
                {
                    NTStatus status = (NTStatus)LittleEndianConverter.ToUInt32(buffer, offset + 8);
                    if (status == NTStatus.STATUS_SUCCESS || status == NTStatus.STATUS_BUFFER_OVERFLOW)
                    {
                        return(new QueryInfoResponse(buffer, offset));
                    }
                    else
                    {
                        return(new ErrorResponse(buffer, offset));
                    }
                }
                else
                {
                    throw new InvalidDataException();
                }
            }

            case SMB2CommandName.SetInfo:
            {
                if (structureSize == SetInfoResponse.DeclaredSize)
                {
                    return(new SetInfoResponse(buffer, offset));
                }
                else if (structureSize == ErrorResponse.DeclaredSize)
                {
                    return(new ErrorResponse(buffer, offset));
                }
                else
                {
                    throw new InvalidDataException();
                }
            }

            default:
                throw new InvalidDataException("Invalid SMB2 command 0x" + ((ushort)commandName).ToString("X4"));
            }
        }
示例#10
0
        public static DateTime ReadUTime(byte[] buffer, int offset)
        {
            uint span = LittleEndianConverter.ToUInt32(buffer, offset);

            return(MinUTimeValue.AddSeconds(span));
        }
示例#11
0
 public EchoResponse(byte[] buffer, int offset) : base(buffer, offset, false)
 {
     SequenceNumber = LittleEndianConverter.ToUInt16(this.SMBParameters, 0);
 }
示例#12
0
        /// <summary>
        /// When setting file attributes, a value of -1 indicates to the server that it MUST NOT change this attribute for all subsequent operations on the same file handle.
        /// </summary>
        public static SetFileTime ReadSetFileTime(byte[] buffer, int offset)
        {
            long span = LittleEndianConverter.ToInt64(buffer, offset);

            return(SetFileTime.FromFileTimeUtc(span));
        }
示例#13
0
 public static async Task <short> ReadInt16(this Stream stream)
 {
     return(LittleEndianConverter.ConvertToInt16(await stream.ReadBytes(2)));
 }
示例#14
0
 public static async Task <string> ReadString(this Stream stream, int length)
 {
     return(LittleEndianConverter.ConvertToIso88591String(await stream.ReadBytes(length)));
 }
示例#15
0
 public TransactionWriteNamedPipeResponse(byte[] parameters) : base()
 {
     BytesWritten = LittleEndianConverter.ToUInt16(parameters, 0);
 }
示例#16
0
        public static SMB2Command ReadRequest(byte[] buffer, int offset)
        {
            SMB2CommandName commandName = (SMB2CommandName)LittleEndianConverter.ToUInt16(buffer, offset + 12);

            switch (commandName)
            {
            case SMB2CommandName.Negotiate:
                return(new NegotiateRequest(buffer, offset));

            case SMB2CommandName.SessionSetup:
                return(new SessionSetupRequest(buffer, offset));

            case SMB2CommandName.Logoff:
                return(new LogoffRequest(buffer, offset));

            case SMB2CommandName.TreeConnect:
                return(new TreeConnectRequest(buffer, offset));

            case SMB2CommandName.TreeDisconnect:
                return(new TreeDisconnectRequest(buffer, offset));

            case SMB2CommandName.Create:
                return(new CreateRequest(buffer, offset));

            case SMB2CommandName.Close:
                return(new CloseRequest(buffer, offset));

            case SMB2CommandName.Flush:
                return(new FlushRequest(buffer, offset));

            case SMB2CommandName.Read:
                return(new ReadRequest(buffer, offset));

            case SMB2CommandName.Write:
                return(new WriteRequest(buffer, offset));

            case SMB2CommandName.Lock:
                return(new LockRequest(buffer, offset));

            case SMB2CommandName.IOCtl:
                return(new IOCtlRequest(buffer, offset));

            case SMB2CommandName.Cancel:
                return(new CancelRequest(buffer, offset));

            case SMB2CommandName.Echo:
                return(new EchoRequest(buffer, offset));

            case SMB2CommandName.QueryDirectory:
                return(new QueryDirectoryRequest(buffer, offset));

            case SMB2CommandName.ChangeNotify:
                return(new ChangeNotifyRequest(buffer, offset));

            case SMB2CommandName.QueryInfo:
                return(new QueryInfoRequest(buffer, offset));

            case SMB2CommandName.SetInfo:
                return(new SetInfoRequest(buffer, offset));

            default:
                throw new InvalidDataException("Invalid SMB2 command 0x" + ((ushort)commandName).ToString("X4"));
            }
        }
示例#17
0
 public override byte[] GetParameters(bool isUnicode)
 {
     return(LittleEndianConverter.GetBytes(BytesWritten));
 }
示例#18
0
        public TransactionRawWriteNamedPipeRequest(byte[] setup, byte[] data) : base()
        {
            FID = LittleEndianConverter.ToUInt16(setup, 2);

            WriteData = data;
        }
示例#19
0
        public static TransactionSubcommand GetSubcommandRequest(byte[] setup, byte[] parameters, byte[] data, bool isUnicode)
        {
            if (setup.Length == 4)
            {
                TransactionSubcommandName subcommandName = (TransactionSubcommandName)LittleEndianConverter.ToUInt16(setup, 0);
                switch (subcommandName)
                {
                case TransactionSubcommandName.TRANS_SET_NMPIPE_STATE:
                    return(new TransactionSetNamedPipeStateRequest(setup, parameters));

                case TransactionSubcommandName.TRANS_RAW_READ_NMPIPE:
                    return(new TransactionRawReadNamedPipeRequest(setup));

                case TransactionSubcommandName.TRANS_QUERY_NMPIPE_STATE:
                    return(new TransactionQueryNamedPipeStateRequest(setup, parameters));

                case TransactionSubcommandName.TRANS_QUERY_NMPIPE_INFO:
                    return(new TransactionQueryNamedPipeInfoRequest(setup, parameters));

                case TransactionSubcommandName.TRANS_PEEK_NMPIPE:
                    return(new TransactionPeekNamedPipeRequest(setup));

                case TransactionSubcommandName.TRANS_TRANSACT_NMPIPE:
                    return(new TransactionTransactNamedPipeRequest(setup, data));

                case TransactionSubcommandName.TRANS_RAW_WRITE_NMPIPE:
                    return(new TransactionRawWriteNamedPipeRequest(setup, data));

                case TransactionSubcommandName.TRANS_READ_NMPIPE:
                    return(new TransactionReadNamedPipeRequest(setup));

                case TransactionSubcommandName.TRANS_WRITE_NMPIPE:
                    return(new TransactionWriteNamedPipeRequest(setup, data));

                case TransactionSubcommandName.TRANS_WAIT_NMPIPE:
                    return(new TransactionWaitNamedPipeRequest(setup));

                case TransactionSubcommandName.TRANS_CALL_NMPIPE:
                    return(new TransactionCallNamedPipeRequest(setup, data));
                }
            }
            throw new InvalidDataException();
        }
示例#20
0
 public WriteResponse(byte[] buffer, int offset) : base(buffer, offset)
 {
     CountOfBytesWritten = LittleEndianConverter.ToUInt16(SMBParameters, 0);
 }
 public Transaction2QueryFSInformationRequest(byte[] parameters, byte[] data, bool isUnicode) : base()
 {
     InformationLevel = (QueryFSInformationLevel)LittleEndianConverter.ToUInt16(parameters, 0);
 }
示例#22
0
 public BitmapRange(byte[] buffer, int offset)
 {
     BitmapOffset = LittleEndianConverter.ToUInt32(buffer, offset + 0x00);
     NumberOfBits = LittleEndianConverter.ToUInt32(buffer, offset + 0x04);
 }
示例#23
0
 public Transaction2SetPathInformationResponse(byte[] parameters, byte[] data, bool isUnicode) : base()
 {
     EaErrorOffset = LittleEndianConverter.ToUInt16(parameters, 0);
 }
        public NTTransactIOCTLResponse(byte[] setup, byte[] data) : base()
        {
            TransactionDataSize = LittleEndianConverter.ToUInt16(setup, 0);

            Data = data;
        }
示例#25
0
 public VolumeInformationRecord(byte[] buffer, int offset) : base(buffer, offset)
 {
     MajorVersion = ByteReader.ReadByte(this.Data, 0x08);
     MinorVersion = ByteReader.ReadByte(this.Data, 0x09);
     VolumeFlags  = (VolumeFlags)LittleEndianConverter.ToUInt16(this.Data, 0x0A);
 }
示例#26
0
 public RequestGetDfsReferral(byte[] buffer)
 {
     MaxReferralLevel = LittleEndianConverter.ToUInt16(buffer, 0);
     RequestFileName  = ByteReader.ReadNullTerminatedUTF16String(buffer, 2);
 }
示例#27
0
 public override byte[] GetBytes()
 {
     return(LittleEndianConverter.GetBytes(EaSize));
 }
示例#28
0
 public FileEndOfFileInformation(byte[] buffer, int offset)
 {
     EndOfFile = LittleEndianConverter.ToInt64(buffer, offset);
 }
 public override byte[] GetParameters(bool isUnicode)
 {
     return(LittleEndianConverter.GetBytes(EaErrorOffset));
 }
示例#30
0
 public static async Task WriteLittleEndianUInt32(this Stream stream, uint value)
 {
     await stream.WriteBytes(LittleEndianConverter.ConvertToBytes(value));
 }