mirror of
https://github.com/winfsp/winfsp.git
synced 2025-04-23 17:03:12 -05:00
dll: WIP
This commit is contained in:
parent
aa04436d5e
commit
2a1fc2a83d
@ -6,6 +6,15 @@
|
|||||||
|
|
||||||
#include <dll/library.h>
|
#include <dll/library.h>
|
||||||
|
|
||||||
|
static inline
|
||||||
|
BOOLEAN FspIsRootDirectory(PWSTR FileName)
|
||||||
|
{
|
||||||
|
for (PWSTR Pointer = FileName; *Pointer; Pointer++)
|
||||||
|
if (L'\\' != *Pointer)
|
||||||
|
return FALSE;
|
||||||
|
return TRUE;
|
||||||
|
}
|
||||||
|
|
||||||
static inline
|
static inline
|
||||||
NTSTATUS FspCreateCheck(FSP_FILE_SYSTEM *FileSystem,
|
NTSTATUS FspCreateCheck(FSP_FILE_SYSTEM *FileSystem,
|
||||||
FSP_FSCTL_TRANSACT_REQ *Request, BOOLEAN AllowTraverseCheck,
|
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,
|
static NTSTATUS FspFileSystemOpCreate_FileCreate(FSP_FILE_SYSTEM *FileSystem,
|
||||||
FSP_FSCTL_TRANSACT_REQ *Request)
|
FSP_FSCTL_TRANSACT_REQ *Request)
|
||||||
{
|
{
|
||||||
|
if (FspIsRootDirectory((PWSTR)Request->Buffer))
|
||||||
|
return STATUS_ACCESS_DENIED;
|
||||||
|
|
||||||
NTSTATUS Result;
|
NTSTATUS Result;
|
||||||
DWORD GrantedAccess;
|
DWORD GrantedAccess;
|
||||||
FSP_FILE_NODE *FileNode;
|
FSP_FILE_NODE *FileNode;
|
||||||
@ -127,6 +139,9 @@ static NTSTATUS FspFileSystemOpCreate_FileOpenIf(FSP_FILE_SYSTEM *FileSystem,
|
|||||||
|
|
||||||
if (Create)
|
if (Create)
|
||||||
{
|
{
|
||||||
|
if (FspIsRootDirectory((PWSTR)Request->Buffer))
|
||||||
|
return STATUS_ACCESS_DENIED;
|
||||||
|
|
||||||
Result = FspCreateCheck(FileSystem, Request, FALSE, &GrantedAccess);
|
Result = FspCreateCheck(FileSystem, Request, FALSE, &GrantedAccess);
|
||||||
if (!NT_SUCCESS(Result))
|
if (!NT_SUCCESS(Result))
|
||||||
return FspFileSystemSendResponseWithStatus(FileSystem, Request, 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,
|
static NTSTATUS FspFileSystemOpCreate_FileOverwrite(FSP_FILE_SYSTEM *FileSystem,
|
||||||
FSP_FSCTL_TRANSACT_REQ *Request, BOOLEAN Supersede)
|
FSP_FSCTL_TRANSACT_REQ *Request, BOOLEAN Supersede)
|
||||||
{
|
{
|
||||||
|
if (FspIsRootDirectory((PWSTR)Request->Buffer))
|
||||||
|
return STATUS_ACCESS_DENIED;
|
||||||
|
|
||||||
NTSTATUS Result;
|
NTSTATUS Result;
|
||||||
DWORD GrantedAccess;
|
DWORD GrantedAccess;
|
||||||
FSP_FILE_NODE *FileNode;
|
FSP_FILE_NODE *FileNode;
|
||||||
@ -172,9 +190,10 @@ static NTSTATUS FspFileSystemOpCreate_FileOverwrite(FSP_FILE_SYSTEM *FileSystem,
|
|||||||
if (!NT_SUCCESS(Result))
|
if (!NT_SUCCESS(Result))
|
||||||
return FspFileSystemSendResponseWithStatus(FileSystem, Request, Result);
|
return FspFileSystemSendResponseWithStatus(FileSystem, Request, Result);
|
||||||
|
|
||||||
GrantedAccess &= Supersede ?
|
if (0 == (Request->Req.Create.DesiredAccess & MAXIMUM_ALLOWED))
|
||||||
(~DELETE | (Request->Req.Create.DesiredAccess & DELETE)) :
|
GrantedAccess &= Supersede ?
|
||||||
(~FILE_WRITE_DATA | (Request->Req.Create.DesiredAccess & FILE_WRITE_DATA));
|
(~DELETE | (Request->Req.Create.DesiredAccess & DELETE)) :
|
||||||
|
(~FILE_WRITE_DATA | (Request->Req.Create.DesiredAccess & FILE_WRITE_DATA));
|
||||||
|
|
||||||
Result = FileSystem->Interface->FileOverwrite(FileSystem, Request, &FileNode);
|
Result = FileSystem->Interface->FileOverwrite(FileSystem, Request, &FileNode);
|
||||||
if (!NT_SUCCESS(Result))
|
if (!NT_SUCCESS(Result))
|
||||||
@ -202,6 +221,9 @@ static NTSTATUS FspFileSystemOpCreate_FileOverwrite(FSP_FILE_SYSTEM *FileSystem,
|
|||||||
static NTSTATUS FspFileSystemOpCreate_FileOverwriteIf(FSP_FILE_SYSTEM *FileSystem,
|
static NTSTATUS FspFileSystemOpCreate_FileOverwriteIf(FSP_FILE_SYSTEM *FileSystem,
|
||||||
FSP_FSCTL_TRANSACT_REQ *Request)
|
FSP_FSCTL_TRANSACT_REQ *Request)
|
||||||
{
|
{
|
||||||
|
if (FspIsRootDirectory((PWSTR)Request->Buffer))
|
||||||
|
return STATUS_ACCESS_DENIED;
|
||||||
|
|
||||||
NTSTATUS Result;
|
NTSTATUS Result;
|
||||||
DWORD GrantedAccess;
|
DWORD GrantedAccess;
|
||||||
FSP_FILE_NODE *FileNode;
|
FSP_FILE_NODE *FileNode;
|
||||||
@ -218,7 +240,10 @@ static NTSTATUS FspFileSystemOpCreate_FileOverwriteIf(FSP_FILE_SYSTEM *FileSyste
|
|||||||
Create = TRUE;
|
Create = TRUE;
|
||||||
}
|
}
|
||||||
else
|
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)
|
if (!Create)
|
||||||
{
|
{
|
||||||
|
Loading…
x
Reference in New Issue
Block a user