summaryrefslogtreecommitdiffhomepage
path: root/src/fs
diff options
context:
space:
mode:
authormidipix <writeonce@midipix.org>2016-12-22 11:58:01 +0200
committermidipix <writeonce@midipix.org>2016-12-22 14:08:40 -0500
commit030926d2c8da32a09fefd9c5e9ea4478cd0d4780 (patch)
tree6aed6d03c81a50693315100e794a3c3504bf6831 /src/fs
parent7f8d50abe18471c5a79951ad13b63d1bc125c47e (diff)
downloadntapi-030926d2c8da32a09fefd9c5e9ea4478cd0d4780.tar.bz2
ntapi-030926d2c8da32a09fefd9c5e9ea4478cd0d4780.tar.xz
__ntapi_tt_statfs(), __ntapi_tt_istat(): added initial \Device\Mup support.
Diffstat (limited to 'src/fs')
-rw-r--r--src/fs/ntapi_tt_istat.c25
-rw-r--r--src/fs/ntapi_tt_statfs.c31
2 files changed, 43 insertions, 13 deletions
diff --git a/src/fs/ntapi_tt_istat.c b/src/fs/ntapi_tt_istat.c
index bdfa09f..a42c8dd 100644
--- a/src/fs/ntapi_tt_istat.c
+++ b/src/fs/ntapi_tt_istat.c
@@ -28,13 +28,16 @@ int32_t __stdcall __ntapi_tt_istat(
nt_unicode_string * sdev;
wchar16_t * wch;
wchar16_t * wch_mark;
+ uint32_t hash;
/* validaton */
if (!hfile && !path)
return NT_STATUS_INVALID_HANDLE;
/* hfile */
- if (!hfile) {
+ if (hfile) {
+ istat->flags_out = 0;
+ } else {
/* oa */
oa.len = sizeof(nt_oa);
oa.root_dir = hroot;
@@ -104,15 +107,25 @@ int32_t __stdcall __ntapi_tt_istat(
|| (wch[7] != '\\'))
return NT_STATUS_INVALID_HANDLE;
- wch_mark = &wch[8];
- wch = wch_mark;
+ if ((sdev->strlen >= __DEVICE_MUP_PREFIX_LEN)
+ && (wch[8]=='M')
+ && (wch[9]=='u')
+ && (wch[10]=='p')
+ && (wch[11]=='\\')) {
+ istat->flags_out |= NT_STATFS_MUP_DEVICE;
+ wch_mark = &wch[12];
+ hash = __DEVICE_MUP_PREFIX_HASH;
+ } else {
+ wch_mark = &wch[8];
+ hash = __DEVICE_PATH_PREFIX_HASH;
+ }
- while (*wch != '\\')
- wch++;
+ for (wch=wch_mark; *wch!='\\'; wch++)
+ (void)0;
istat->dev_name_strlen = (uint16_t)((wch - sdev->buffer) * sizeof(uint16_t));
istat->dev_name_hash = __ntapi->tt_buffer_crc32(
- __DEVICE_PATH_PREFIX_HASH,
+ hash,
wch_mark,
(uintptr_t)wch - (uintptr_t)wch_mark);
diff --git a/src/fs/ntapi_tt_statfs.c b/src/fs/ntapi_tt_statfs.c
index b386c8b..8b2285a 100644
--- a/src/fs/ntapi_tt_statfs.c
+++ b/src/fs/ntapi_tt_statfs.c
@@ -26,6 +26,8 @@ int32_t __stdcall __ntapi_tt_statfs(
wchar16_t * wch;
wchar16_t * wch_mark;
uint32_t offset;
+ uint32_t fmup;
+ uint32_t hash;
void * mnt_points_buffer;
nt_mount_points * mnt_points;
nt_fsai * fsai;
@@ -38,7 +40,9 @@ int32_t __stdcall __ntapi_tt_statfs(
return NT_STATUS_INVALID_HANDLE;
/* hfile */
- if (!hfile) {
+ if (hfile) {
+ statfs->flags_out = 0;
+ } else {
/* oa */
oa.len = sizeof(nt_oa);
oa.root_dir = hroot;
@@ -151,17 +155,30 @@ int32_t __stdcall __ntapi_tt_statfs(
|| (wch[7] != '\\'))
return NT_STATUS_INVALID_HANDLE;
- wch_mark = &wch[8];
- wch = wch_mark;
+ if (sdev->strlen < __DEVICE_MUP_PREFIX_LEN)
+ fmup = 0;
+ else if ((wch[8]=='M') && (wch[9]=='u') && (wch[10]=='p') && (wch[11]=='\\'))
+ fmup = NT_STATFS_MUP_DEVICE;
+ else
+ fmup = 0;
+
+ if (fmup) {
+ wch_mark = &wch[8];
+ hash = __DEVICE_MUP_PREFIX_HASH;
+ flags &= ~NT_STATFS_VOLUME_GUID;
+ } else {
+ wch_mark = &wch[8];
+ hash = __DEVICE_PATH_PREFIX_HASH;
+ }
- while (*wch != '\\')
- wch++;
+ for (wch=wch_mark; *wch!='\\'; wch++)
+ (void)0;
statfs->dev_name_strlen = (uint16_t)((wch - sdev->buffer) * sizeof(uint16_t));
statfs->record_name_strlen = sdev->strlen - statfs->dev_name_strlen;
statfs->dev_name_hash = __ntapi->tt_buffer_crc32(
- __DEVICE_PATH_PREFIX_HASH,
+ hash,
wch_mark,
sizeof(wchar16_t) * (wch - wch_mark));
@@ -186,7 +203,7 @@ int32_t __stdcall __ntapi_tt_statfs(
/* f_flags, nt_attr, nt_control_flags (todo?) */
statfs->f_flags = 0;
statfs->nt_attr = 0;
- statfs->nt_control_flags = 0;
+ statfs->nt_control_flags = fmup;
statfs->nt_padding = 0;
if (!(flags & NT_STATFS_VOLUME_GUID)) {