From c58d91c077976653226eb71e6d6a21bebd726b0d Mon Sep 17 00:00:00 2001 From: Alexander Zakharov Date: Wed, 13 Dec 2017 10:24:45 +0300 Subject: [PATCH] Fix file sizes for redirected disks --- disk.c | 47 +++++++++++++++++++---------------------------- stream.h | 3 ++- 2 files changed, 21 insertions(+), 29 deletions(-) diff --git a/disk.c b/disk.c index 7350fed..73e7c7c 100644 --- a/disk.c +++ b/disk.c @@ -5,6 +5,7 @@ Copyright 2003-2011 Peter Astrand for Cendio AB Copyright 2017 Henrik Andersson for Cendio AB Copyright 2017 Karl Mikaelsson for Cendio AB + Copyright 2017 Alexander Zakharov This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -648,6 +649,7 @@ disk_write(RD_NTHANDLE handle, uint8 * data, uint32 length, uint32 offset, uint3 return RD_STATUS_SUCCESS; } +/* Btw, all used Flie* structures are described in [MS-FSCC] */ RD_NTSTATUS disk_query_information(RD_NTHANDLE handle, uint32 info_class, STREAM out) { @@ -712,10 +714,9 @@ disk_query_information(RD_NTHANDLE handle, uint32 info_class, STREAM out) case FileStandardInformation: - out_uint32_le(out, filestat.st_size); /* Allocation size */ - out_uint32_le(out, 0); - out_uint32_le(out, filestat.st_size); /* End of file */ - out_uint32_le(out, 0); + out_uint64_le(out, filestat.st_size); /* Allocation size */ + out_uint64_le(out, filestat.st_size); /* End of file */ + out_uint32_le(out, filestat.st_nlink); /* Number of links */ out_uint8(out, 0); /* Delete pending */ out_uint8(out, S_ISDIR(filestat.st_mode) ? 1 : 0); /* Directory */ @@ -736,6 +737,7 @@ disk_query_information(RD_NTHANDLE handle, uint32 info_class, STREAM out) return RD_STATUS_SUCCESS; } +/* 2.2.3.3.9 [MS-RDPEFS] */ RD_NTSTATUS disk_set_information(RD_NTHANDLE handle, uint32 info_class, STREAM in, STREAM out) { @@ -761,8 +763,8 @@ disk_set_information(RD_NTHANDLE handle, uint32 info_class, STREAM in, STREAM ou case FileBasicInformation: write_time = change_time = access_time = 0; - in_uint8s(in, 4); /* Handle of root dir? */ - in_uint8s(in, 24); /* unknown */ + in_uint8s(in, 4); /* length of SetBuffer */ + in_uint8s(in, 24); /* padding */ /* CreationTime */ in_uint32_le(in, ft_low); @@ -1165,22 +1167,17 @@ disk_query_volume_information(RD_NTHANDLE handle, uint32 info_class, STREAM out) case FileFsSizeInformation: - out_uint32_le(out, stat_fs.f_blocks); /* Total allocation units low */ - out_uint32_le(out, 0); /* Total allocation high units */ - out_uint32_le(out, stat_fs.f_bfree); /* Available allocation units */ - out_uint32_le(out, 0); /* Available allocation units */ + out_uint64_le(out, stat_fs.f_blocks); /* Total allocation units */ + out_uint64_le(out, stat_fs.f_bfree); /* Available allocation units */ out_uint32_le(out, stat_fs.f_bsize / 0x200); /* Sectors per allocation unit */ out_uint32_le(out, 0x200); /* Bytes per sector */ break; case FileFsFullSizeInformation: - out_uint32_le(out, stat_fs.f_blocks); /* Total allocation units low */ - out_uint32_le(out, 0); /* Total allocation units high */ - out_uint32_le(out, stat_fs.f_bavail); /* Caller allocation units low */ - out_uint32_le(out, 0); /* Caller allocation units high */ - out_uint32_le(out, stat_fs.f_bfree); /* Available allocation units */ - out_uint32_le(out, 0); /* Available allocation units */ + out_uint64_le(out, stat_fs.f_blocks); /* Total allocation units */ + out_uint64_le(out, stat_fs.f_bavail); /* Caller allocation units */ + out_uint64_le(out, stat_fs.f_bfree); /* Available allocation units */ out_uint32_le(out, stat_fs.f_bsize / 0x200); /* Sectors per allocation unit */ out_uint32_le(out, 0x200); /* Bytes per sector */ break; @@ -1327,10 +1324,8 @@ disk_query_directory(RD_NTHANDLE handle, uint32 info_class, char *pattern, STREA out_uint32_le(out, ft_low); /* change_write_time */ out_uint32_le(out, ft_high); - out_uint32_le(out, filestat.st_size); /* filesize low */ - out_uint32_le(out, 0); /* filesize high */ - out_uint32_le(out, filestat.st_size); /* filesize low */ - out_uint32_le(out, 0); /* filesize high */ + out_uint64_le(out, filestat.st_size); /* filesize */ + out_uint64_le(out, filestat.st_size); /* filesize */ out_uint32_le(out, file_attributes); /* FileAttributes */ out_uint32_le(out, s_length(&stmp)); /* length of dir entry name string */ out_uint32_le(out, 0); /* EaSize */ @@ -1359,10 +1354,8 @@ disk_query_directory(RD_NTHANDLE handle, uint32 info_class, char *pattern, STREA out_uint32_le(out, ft_low); /* change_write_time */ out_uint32_le(out, ft_high); - out_uint32_le(out, filestat.st_size); /* filesize low */ - out_uint32_le(out, 0); /* filesize high */ - out_uint32_le(out, filestat.st_size); /* filesize low */ - out_uint32_le(out, 0); /* filesize high */ + out_uint64_le(out, filestat.st_size); /* filesize */ + out_uint64_le(out, filestat.st_size); /* filesize */ out_uint32_le(out, file_attributes); out_uint32_le(out, s_length(&stmp)); /* dir entry name string length */ out_stream(out, &stmp); /* dir entry name */ @@ -1388,10 +1381,8 @@ disk_query_directory(RD_NTHANDLE handle, uint32 info_class, char *pattern, STREA out_uint32_le(out, ft_low); /* change_write_time */ out_uint32_le(out, ft_high); - out_uint32_le(out, filestat.st_size); /* filesize low */ - out_uint32_le(out, 0); /* filesize high */ - out_uint32_le(out, filestat.st_size); /* filesize low */ - out_uint32_le(out, 0); /* filesize high */ + out_uint64_le(out, filestat.st_size); /* filesize */ + out_uint64_le(out, filestat.st_size); /* filesize */ out_uint32_le(out, file_attributes); out_uint32_le(out, s_length(&stmp)); /* dir entry name string length */ out_uint32_le(out, 0); /* EaSize */ diff --git a/stream.h b/stream.h index 3359efb..ccc125d 100644 --- a/stream.h +++ b/stream.h @@ -64,7 +64,6 @@ size_t in_ansi_string(STREAM s, char *string, size_t len); #define in_uint32_le(s,v) { v = *(uint32 *)((s)->p); (s)->p += 4; } #define out_uint16_le(s,v) { *(uint16 *)((s)->p) = v; (s)->p += 2; } #define out_uint32_le(s,v) { *(uint32 *)((s)->p) = v; (s)->p += 4; } - #else #define in_uint16_le(s,v) { v = *((s)->p++); v += *((s)->p++) << 8; } #define in_uint32_le(s,v) { in_uint16_le(s,v) \ @@ -73,6 +72,8 @@ size_t in_ansi_string(STREAM s, char *string, size_t len); #define out_uint32_le(s,v) { out_uint16_le(s, (v) & 0xffff); out_uint16_le(s, ((v) >> 16) & 0xffff); } #endif +#define out_uint64_le(s,v) { out_uint32_le(s, (v) & 0xffffffff); out_uint32_le(s, ((v) >> 32) & 0xffffffff); } + #if defined(B_ENDIAN) && !defined(NEED_ALIGN) #define in_uint16_be(s,v) { v = *(uint16 *)((s)->p); (s)->p += 2; } #define in_uint32_be(s,v) { v = *(uint32 *)((s)->p); (s)->p += 4; }