Merge pull request #211 from uglym8/fix_disk_issues
Fix file sizes for redirected disks
This commit is contained in:
commit
cf32cb497a
47
disk.c
47
disk.c
@ -5,6 +5,7 @@
|
|||||||
Copyright 2003-2011 Peter Astrand <astrand@cendio.se> for Cendio AB
|
Copyright 2003-2011 Peter Astrand <astrand@cendio.se> for Cendio AB
|
||||||
Copyright 2017 Henrik Andersson <hean01@cendio.se> for Cendio AB
|
Copyright 2017 Henrik Andersson <hean01@cendio.se> for Cendio AB
|
||||||
Copyright 2017 Karl Mikaelsson <derfian@cendio.se> for Cendio AB
|
Copyright 2017 Karl Mikaelsson <derfian@cendio.se> for Cendio AB
|
||||||
|
Copyright 2017 Alexander Zakharov <uglym8@gmail.com>
|
||||||
|
|
||||||
This program is free software: you can redistribute it and/or modify
|
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
|
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;
|
return RD_STATUS_SUCCESS;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* Btw, all used Flie* structures are described in [MS-FSCC] */
|
||||||
RD_NTSTATUS
|
RD_NTSTATUS
|
||||||
disk_query_information(RD_NTHANDLE handle, uint32 info_class, STREAM out)
|
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:
|
case FileStandardInformation:
|
||||||
|
|
||||||
out_uint32_le(out, filestat.st_size); /* Allocation size */
|
out_uint64_le(out, filestat.st_size); /* Allocation size */
|
||||||
out_uint32_le(out, 0);
|
out_uint64_le(out, filestat.st_size); /* End of file */
|
||||||
out_uint32_le(out, filestat.st_size); /* End of file */
|
|
||||||
out_uint32_le(out, 0);
|
|
||||||
out_uint32_le(out, filestat.st_nlink); /* Number of links */
|
out_uint32_le(out, filestat.st_nlink); /* Number of links */
|
||||||
out_uint8(out, 0); /* Delete pending */
|
out_uint8(out, 0); /* Delete pending */
|
||||||
out_uint8(out, S_ISDIR(filestat.st_mode) ? 1 : 0); /* Directory */
|
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;
|
return RD_STATUS_SUCCESS;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* 2.2.3.3.9 [MS-RDPEFS] */
|
||||||
RD_NTSTATUS
|
RD_NTSTATUS
|
||||||
disk_set_information(RD_NTHANDLE handle, uint32 info_class, STREAM in, STREAM out)
|
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:
|
case FileBasicInformation:
|
||||||
write_time = change_time = access_time = 0;
|
write_time = change_time = access_time = 0;
|
||||||
|
|
||||||
in_uint8s(in, 4); /* Handle of root dir? */
|
in_uint8s(in, 4); /* length of SetBuffer */
|
||||||
in_uint8s(in, 24); /* unknown */
|
in_uint8s(in, 24); /* padding */
|
||||||
|
|
||||||
/* CreationTime */
|
/* CreationTime */
|
||||||
in_uint32_le(in, ft_low);
|
in_uint32_le(in, ft_low);
|
||||||
@ -1165,22 +1167,17 @@ disk_query_volume_information(RD_NTHANDLE handle, uint32 info_class, STREAM out)
|
|||||||
|
|
||||||
case FileFsSizeInformation:
|
case FileFsSizeInformation:
|
||||||
|
|
||||||
out_uint32_le(out, stat_fs.f_blocks); /* Total allocation units low */
|
out_uint64_le(out, stat_fs.f_blocks); /* Total allocation units */
|
||||||
out_uint32_le(out, 0); /* Total allocation high units */
|
out_uint64_le(out, stat_fs.f_bfree); /* Available allocation units */
|
||||||
out_uint32_le(out, stat_fs.f_bfree); /* Available allocation units */
|
|
||||||
out_uint32_le(out, 0); /* Available allocation units */
|
|
||||||
out_uint32_le(out, stat_fs.f_bsize / 0x200); /* Sectors per allocation unit */
|
out_uint32_le(out, stat_fs.f_bsize / 0x200); /* Sectors per allocation unit */
|
||||||
out_uint32_le(out, 0x200); /* Bytes per sector */
|
out_uint32_le(out, 0x200); /* Bytes per sector */
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case FileFsFullSizeInformation:
|
case FileFsFullSizeInformation:
|
||||||
|
|
||||||
out_uint32_le(out, stat_fs.f_blocks); /* Total allocation units low */
|
out_uint64_le(out, stat_fs.f_blocks); /* Total allocation units */
|
||||||
out_uint32_le(out, 0); /* Total allocation units high */
|
out_uint64_le(out, stat_fs.f_bavail); /* Caller allocation units */
|
||||||
out_uint32_le(out, stat_fs.f_bavail); /* Caller allocation units low */
|
out_uint64_le(out, stat_fs.f_bfree); /* Available allocation units */
|
||||||
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_uint32_le(out, stat_fs.f_bsize / 0x200); /* Sectors per allocation unit */
|
out_uint32_le(out, stat_fs.f_bsize / 0x200); /* Sectors per allocation unit */
|
||||||
out_uint32_le(out, 0x200); /* Bytes per sector */
|
out_uint32_le(out, 0x200); /* Bytes per sector */
|
||||||
break;
|
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_low); /* change_write_time */
|
||||||
out_uint32_le(out, ft_high);
|
out_uint32_le(out, ft_high);
|
||||||
|
|
||||||
out_uint32_le(out, filestat.st_size); /* filesize low */
|
out_uint64_le(out, filestat.st_size); /* filesize */
|
||||||
out_uint32_le(out, 0); /* filesize high */
|
out_uint64_le(out, filestat.st_size); /* filesize */
|
||||||
out_uint32_le(out, filestat.st_size); /* filesize low */
|
|
||||||
out_uint32_le(out, 0); /* filesize high */
|
|
||||||
out_uint32_le(out, file_attributes); /* FileAttributes */
|
out_uint32_le(out, file_attributes); /* FileAttributes */
|
||||||
out_uint32_le(out, s_length(&stmp)); /* length of dir entry name string */
|
out_uint32_le(out, s_length(&stmp)); /* length of dir entry name string */
|
||||||
out_uint32_le(out, 0); /* EaSize */
|
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_low); /* change_write_time */
|
||||||
out_uint32_le(out, ft_high);
|
out_uint32_le(out, ft_high);
|
||||||
|
|
||||||
out_uint32_le(out, filestat.st_size); /* filesize low */
|
out_uint64_le(out, filestat.st_size); /* filesize */
|
||||||
out_uint32_le(out, 0); /* filesize high */
|
out_uint64_le(out, filestat.st_size); /* filesize */
|
||||||
out_uint32_le(out, filestat.st_size); /* filesize low */
|
|
||||||
out_uint32_le(out, 0); /* filesize high */
|
|
||||||
out_uint32_le(out, file_attributes);
|
out_uint32_le(out, file_attributes);
|
||||||
out_uint32_le(out, s_length(&stmp)); /* dir entry name string length */
|
out_uint32_le(out, s_length(&stmp)); /* dir entry name string length */
|
||||||
out_stream(out, &stmp); /* dir entry name */
|
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_low); /* change_write_time */
|
||||||
out_uint32_le(out, ft_high);
|
out_uint32_le(out, ft_high);
|
||||||
|
|
||||||
out_uint32_le(out, filestat.st_size); /* filesize low */
|
out_uint64_le(out, filestat.st_size); /* filesize */
|
||||||
out_uint32_le(out, 0); /* filesize high */
|
out_uint64_le(out, filestat.st_size); /* filesize */
|
||||||
out_uint32_le(out, filestat.st_size); /* filesize low */
|
|
||||||
out_uint32_le(out, 0); /* filesize high */
|
|
||||||
out_uint32_le(out, file_attributes);
|
out_uint32_le(out, file_attributes);
|
||||||
out_uint32_le(out, s_length(&stmp)); /* dir entry name string length */
|
out_uint32_le(out, s_length(&stmp)); /* dir entry name string length */
|
||||||
out_uint32_le(out, 0); /* EaSize */
|
out_uint32_le(out, 0); /* EaSize */
|
||||||
|
3
stream.h
3
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 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_uint16_le(s,v) { *(uint16 *)((s)->p) = v; (s)->p += 2; }
|
||||||
#define out_uint32_le(s,v) { *(uint32 *)((s)->p) = v; (s)->p += 4; }
|
#define out_uint32_le(s,v) { *(uint32 *)((s)->p) = v; (s)->p += 4; }
|
||||||
|
|
||||||
#else
|
#else
|
||||||
#define in_uint16_le(s,v) { v = *((s)->p++); v += *((s)->p++) << 8; }
|
#define in_uint16_le(s,v) { v = *((s)->p++); v += *((s)->p++) << 8; }
|
||||||
#define in_uint32_le(s,v) { in_uint16_le(s,v) \
|
#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); }
|
#define out_uint32_le(s,v) { out_uint16_le(s, (v) & 0xffff); out_uint16_le(s, ((v) >> 16) & 0xffff); }
|
||||||
#endif
|
#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)
|
#if defined(B_ENDIAN) && !defined(NEED_ALIGN)
|
||||||
#define in_uint16_be(s,v) { v = *(uint16 *)((s)->p); (s)->p += 2; }
|
#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; }
|
#define in_uint32_be(s,v) { v = *(uint32 *)((s)->p); (s)->p += 4; }
|
||||||
|
Loading…
Reference in New Issue
Block a user