/// <summary> /// to decode the smb parameters: from the general SmbParameters to the concrete Smb Parameters. /// </summary> protected override void DecodeParameters() { // When a client requests extended information, the word count must be 42 if (this.smbParametersBlock.WordCount == CREATE_EXTENDED_INFORMATION_RESPONSE_LENGTH) { SMB_COM_NT_CREATE_ANDX_Response_SMB_Parameters param = new SMB_COM_NT_CREATE_ANDX_Response_SMB_Parameters(); using (MemoryStream stream = new MemoryStream( CifsMessageUtils.ToBytesArray <ushort>(this.smbParametersBlock.Words))) { using (Channel channel = new Channel(null, stream)) { param.WordCount = this.smbParametersBlock.WordCount; param.AndXCommand = channel.Read <SmbCommand>(); param.AndXReserved = channel.Read <byte>(); param.AndXOffset = channel.Read <ushort>(); param.OplockLevel = channel.Read <OplockLevelValue>(); param.FID = channel.Read <ushort>(); param.CreationAction = channel.Read <uint>(); param.CreateTime = channel.Read <Cifs.FileTime>(); param.LastAccessTime = channel.Read <Cifs.FileTime>(); param.LastWriteTime = channel.Read <Cifs.FileTime>(); param.LastChangeTime = channel.Read <Cifs.FileTime>(); param.ExtFileAttributes = channel.Read <uint>(); param.AllocationSize = channel.Read <ulong>(); param.EndOfFile = channel.Read <ulong>(); param.ResourceType = channel.Read <FileTypeValue>(); param.NMPipeStatus_or_FileStatusFlags = channel.Read <SMB_NMPIPE_STATUS>(); param.Directory = channel.Read <byte>(); // VolumeGUID (16 bytes), td defines this length param.VolumeGUID = channel.ReadBytes(CifsMessageUtils.GetSize <Guid>(new Guid())); // if there is more 16 bytes in the channel. if (channel.Stream.Position <= channel.Stream.Length - WINDOWS_BEHAVIOR_ADDITIONAL_DATA_LENGTH) { // FileId (8 bytes), td defines this length param.FileId = channel.ReadBytes(sizeof(ulong)); // MaximalAccessRights (4 bytes), td defines this length param.MaximalAccessRights = channel.ReadBytes(sizeof(uint)); // GuestMaximalAccessRights (4 bytes), td defines this length param.GuestMaximalAccessRights = channel.ReadBytes(sizeof(uint)); } } } this.SmbParameters = param; } else { base.DecodeParameters(); this.smbParameters = SmbMessageUtils.ConvertSmbComCreatePacketPayload(base.SmbParameters); } }
/// <summary> /// initialize packet from base packet. /// </summary> /// <param name = "packet">the base packet to initialize this packet. </param> public SmbNtCreateAndxResponsePacket(Cifs.SmbNtCreateAndxResponsePacket packet) : base(packet) { this.smbParameters = SmbMessageUtils.ConvertSmbComCreatePacketPayload(base.SmbParameters); }