public override void WriteCommandBytes(byte[] buffer, int offset) { NameOffset = 0; NameLength = (ushort)(Name.Length * 2); if (Name.Length > 0) { NameOffset = SMB2Header.Length + FixedLength; } CreateContextsOffsets = 0; CreateContextsLength = 0; int paddedNameLength = (int)Math.Ceiling((double)(Name.Length * 2) / 8) * 8; if (CreateContexts.Count > 0) { CreateContextsOffsets = (uint)(SMB2Header.Length + 56 + paddedNameLength); CreateContextsLength = (uint)CreateContext.GetCreateContextListLength(CreateContexts); } LittleEndianWriter.WriteUInt16(buffer, offset + 0, StructureSize); ByteWriter.WriteByte(buffer, offset + 2, SecurityFlags); ByteWriter.WriteByte(buffer, offset + 3, (byte)RequestedOplockLevel); LittleEndianWriter.WriteUInt32(buffer, offset + 4, (uint)ImpersonationLevel); LittleEndianWriter.WriteUInt64(buffer, offset + 8, (ulong)SmbCreateFlags); LittleEndianWriter.WriteUInt64(buffer, offset + 16, (ulong)Reserved); DesiredAccess.WriteBytes(buffer, offset + 24); LittleEndianWriter.WriteUInt32(buffer, offset + 28, (uint)FileAttributes); LittleEndianWriter.WriteUInt32(buffer, offset + 32, (uint)ShareAccess); LittleEndianWriter.WriteUInt32(buffer, offset + 36, (uint)CreateDisposition); LittleEndianWriter.WriteUInt32(buffer, offset + 40, (uint)CreateOptions); LittleEndianWriter.WriteUInt16(buffer, offset + 44, NameOffset); LittleEndianWriter.WriteUInt16(buffer, offset + 46, NameLength); LittleEndianWriter.WriteUInt32(buffer, offset + 48, CreateContextsOffsets); LittleEndianWriter.WriteUInt32(buffer, offset + 52, CreateContextsLength); ByteWriter.WriteUTF16String(buffer, offset + 56, Name); CreateContext.WriteCreateContextList(buffer, offset + 56 + paddedNameLength, CreateContexts); }
public override void WriteCommandBytes(byte[] buffer, int offset) { // [MS-SMB2] The NameOffset field SHOULD be set to the offset of the Buffer field from the beginning of the SMB2 header. // Note: Windows 8.1 / 10 will return STATUS_INVALID_PARAMETER if NameOffset is set to 0. NameOffset = SMB2Header.Length + FixedLength; NameLength = (ushort)(Name.Length * 2); CreateContextsOffset = 0; CreateContextsLength = 0; int paddedNameLength = (int)Math.Ceiling((double)(Name.Length * 2) / 8) * 8; if (CreateContexts.Count > 0) { CreateContextsOffset = (uint)(SMB2Header.Length + FixedLength + paddedNameLength); CreateContextsLength = (uint)CreateContext.GetCreateContextListLength(CreateContexts); } LittleEndianWriter.WriteUInt16(buffer, offset + 0, StructureSize); ByteWriter.WriteByte(buffer, offset + 2, SecurityFlags); ByteWriter.WriteByte(buffer, offset + 3, (byte)RequestedOplockLevel); LittleEndianWriter.WriteUInt32(buffer, offset + 4, (uint)ImpersonationLevel); LittleEndianWriter.WriteUInt64(buffer, offset + 8, (ulong)SmbCreateFlags); LittleEndianWriter.WriteUInt64(buffer, offset + 16, (ulong)Reserved); LittleEndianWriter.WriteUInt32(buffer, offset + 24, (uint)DesiredAccess); LittleEndianWriter.WriteUInt32(buffer, offset + 28, (uint)FileAttributes); LittleEndianWriter.WriteUInt32(buffer, offset + 32, (uint)ShareAccess); LittleEndianWriter.WriteUInt32(buffer, offset + 36, (uint)CreateDisposition); LittleEndianWriter.WriteUInt32(buffer, offset + 40, (uint)CreateOptions); LittleEndianWriter.WriteUInt16(buffer, offset + 44, NameOffset); LittleEndianWriter.WriteUInt16(buffer, offset + 46, NameLength); LittleEndianWriter.WriteUInt32(buffer, offset + 48, CreateContextsOffset); LittleEndianWriter.WriteUInt32(buffer, offset + 52, CreateContextsLength); ByteWriter.WriteUTF16String(buffer, offset + 56, Name); CreateContext.WriteCreateContextList(buffer, offset + 56 + paddedNameLength, CreateContexts); }
public override void WriteCommandBytes(byte[] buffer, int offset) { LittleEndianWriter.WriteUInt16(buffer, offset + 0, StructureSize); ByteWriter.WriteByte(buffer, offset + 2, (byte)OplockLevel); ByteWriter.WriteByte(buffer, offset + 3, (byte)Flags); LittleEndianWriter.WriteUInt32(buffer, offset + 4, (uint)CreateAction); FileTimeHelper.WriteFileTime(buffer, offset + 8, CreationTime); FileTimeHelper.WriteFileTime(buffer, offset + 16, LastAccessTime); FileTimeHelper.WriteFileTime(buffer, offset + 24, LastWriteTime); FileTimeHelper.WriteFileTime(buffer, offset + 32, ChangeTime); LittleEndianWriter.WriteInt64(buffer, offset + 40, AllocationSize); LittleEndianWriter.WriteInt64(buffer, offset + 48, EndofFile); LittleEndianWriter.WriteUInt32(buffer, offset + 56, (uint)FileAttributes); LittleEndianWriter.WriteUInt32(buffer, offset + 60, Reserved2); FileId.WriteBytes(buffer, offset + 64); CreateContextsOffsets = 0; CreateContextsLength = (uint)CreateContext.GetCreateContextListLength(CreateContexts); if (CreateContexts.Count > 0) { CreateContextsOffsets = SMB2Header.Length + 88; CreateContext.WriteCreateContextList(buffer, 88, CreateContexts); } }