From 830985d33112127ec331ac39a6d70bb64160b047 Mon Sep 17 00:00:00 2001 From: Bill Zissimopoulos Date: Sat, 31 Dec 2016 23:01:40 -0800 Subject: [PATCH] sys: FspFsvolFileSystemControlReparsePoint: STATUS_ACCESS_DENIED --- src/sys/create.c | 1 + src/sys/driver.h | 1 + src/sys/fsctl.c | 5 +++++ 3 files changed, 7 insertions(+) diff --git a/src/sys/create.c b/src/sys/create.c index a4d3372e..2e76a6b5 100644 --- a/src/sys/create.c +++ b/src/sys/create.c @@ -897,6 +897,7 @@ NTSTATUS FspFsvolCreateComplete( /* set up the AccessState */ AccessState->RemainingDesiredAccess = 0; AccessState->PreviouslyGrantedAccess = Response->Rsp.Create.Opened.GrantedAccess; + FileDesc->GrantedAccess = Response->Rsp.Create.Opened.GrantedAccess; /* set up the FileObject */ if (0 != FsvolDeviceExtension->FsvrtDeviceObject) diff --git a/src/sys/driver.h b/src/sys/driver.h index f160beb6..b522c1d1 100644 --- a/src/sys/driver.h +++ b/src/sys/driver.h @@ -1218,6 +1218,7 @@ typedef struct { FSP_FILE_NODE *FileNode; UINT64 UserContext2; + UINT32 GrantedAccess; UINT32 CaseSensitive:1, HasTraversePrivilege:1, DeleteOnClose:1, DidSetMetadata:1, diff --git a/src/sys/fsctl.c b/src/sys/fsctl.c index 53efe8b5..6dc69e31 100644 --- a/src/sys/fsctl.c +++ b/src/sys/fsctl.c @@ -148,6 +148,11 @@ static NTSTATUS FspFsvolFileSystemControlReparsePoint( if (!NT_SUCCESS(Result)) return Result; + /* NTFS seems to require one of these rights to allow FSCTL_SET_REPARSE_POINT */ + if (!FlagOn(FileDesc->GrantedAccess, + FILE_WRITE_DATA | FILE_APPEND_DATA | FILE_WRITE_ATTRIBUTES)) + return STATUS_ACCESS_DENIED; + ReparseData = (PREPARSE_DATA_BUFFER)InputBuffer; if (IO_REPARSE_TAG_SYMLINK == ReparseData->ReparseTag)