From 2a1fc2a83df9bd6fc2231e4f0653c6733766fa26 Mon Sep 17 00:00:00 2001 From: Bill Zissimopoulos Date: Sun, 3 Jan 2016 22:16:17 -0800 Subject: [PATCH] dll: WIP --- src/dll/create.c | 33 +++++++++++++++++++++++++++++---- 1 file changed, 29 insertions(+), 4 deletions(-) diff --git a/src/dll/create.c b/src/dll/create.c index 6973ebda..29a99028 100644 --- a/src/dll/create.c +++ b/src/dll/create.c @@ -6,6 +6,15 @@ #include +static inline +BOOLEAN FspIsRootDirectory(PWSTR FileName) +{ + for (PWSTR Pointer = FileName; *Pointer; Pointer++) + if (L'\\' != *Pointer) + return FALSE; + return TRUE; +} + static inline NTSTATUS FspCreateCheck(FSP_FILE_SYSTEM *FileSystem, FSP_FSCTL_TRANSACT_REQ *Request, BOOLEAN AllowTraverseCheck, @@ -31,6 +40,9 @@ NTSTATUS FspCreateCheck(FSP_FILE_SYSTEM *FileSystem, static NTSTATUS FspFileSystemOpCreate_FileCreate(FSP_FILE_SYSTEM *FileSystem, FSP_FSCTL_TRANSACT_REQ *Request) { + if (FspIsRootDirectory((PWSTR)Request->Buffer)) + return STATUS_ACCESS_DENIED; + NTSTATUS Result; DWORD GrantedAccess; FSP_FILE_NODE *FileNode; @@ -127,6 +139,9 @@ static NTSTATUS FspFileSystemOpCreate_FileOpenIf(FSP_FILE_SYSTEM *FileSystem, if (Create) { + if (FspIsRootDirectory((PWSTR)Request->Buffer)) + return STATUS_ACCESS_DENIED; + Result = FspCreateCheck(FileSystem, Request, FALSE, &GrantedAccess); if (!NT_SUCCESS(Result)) return FspFileSystemSendResponseWithStatus(FileSystem, Request, Result); @@ -161,6 +176,9 @@ static NTSTATUS FspFileSystemOpCreate_FileOpenIf(FSP_FILE_SYSTEM *FileSystem, static NTSTATUS FspFileSystemOpCreate_FileOverwrite(FSP_FILE_SYSTEM *FileSystem, FSP_FSCTL_TRANSACT_REQ *Request, BOOLEAN Supersede) { + if (FspIsRootDirectory((PWSTR)Request->Buffer)) + return STATUS_ACCESS_DENIED; + NTSTATUS Result; DWORD GrantedAccess; FSP_FILE_NODE *FileNode; @@ -172,9 +190,10 @@ static NTSTATUS FspFileSystemOpCreate_FileOverwrite(FSP_FILE_SYSTEM *FileSystem, if (!NT_SUCCESS(Result)) return FspFileSystemSendResponseWithStatus(FileSystem, Request, Result); - GrantedAccess &= Supersede ? - (~DELETE | (Request->Req.Create.DesiredAccess & DELETE)) : - (~FILE_WRITE_DATA | (Request->Req.Create.DesiredAccess & FILE_WRITE_DATA)); + if (0 == (Request->Req.Create.DesiredAccess & MAXIMUM_ALLOWED)) + GrantedAccess &= Supersede ? + (~DELETE | (Request->Req.Create.DesiredAccess & DELETE)) : + (~FILE_WRITE_DATA | (Request->Req.Create.DesiredAccess & FILE_WRITE_DATA)); Result = FileSystem->Interface->FileOverwrite(FileSystem, Request, &FileNode); if (!NT_SUCCESS(Result)) @@ -202,6 +221,9 @@ static NTSTATUS FspFileSystemOpCreate_FileOverwrite(FSP_FILE_SYSTEM *FileSystem, static NTSTATUS FspFileSystemOpCreate_FileOverwriteIf(FSP_FILE_SYSTEM *FileSystem, FSP_FSCTL_TRANSACT_REQ *Request) { + if (FspIsRootDirectory((PWSTR)Request->Buffer)) + return STATUS_ACCESS_DENIED; + NTSTATUS Result; DWORD GrantedAccess; FSP_FILE_NODE *FileNode; @@ -218,7 +240,10 @@ static NTSTATUS FspFileSystemOpCreate_FileOverwriteIf(FSP_FILE_SYSTEM *FileSyste Create = TRUE; } else - GrantedAccess &= ~FILE_WRITE_DATA | (Request->Req.Create.DesiredAccess & FILE_WRITE_DATA); + { + if (0 == (Request->Req.Create.DesiredAccess & MAXIMUM_ALLOWED)) + GrantedAccess &= ~FILE_WRITE_DATA | (Request->Req.Create.DesiredAccess & FILE_WRITE_DATA); + } if (!Create) {