From 6ea86a5e8a13f29785d43c7d2da7b53253bac06b Mon Sep 17 00:00:00 2001 From: Bill Zissimopoulos Date: Mon, 7 Dec 2015 22:54:02 -0800 Subject: [PATCH] sys: IRP_MJ_CREATE: FILE_DELETE_ON_CLOSE --- inc/winfsp/fsctl.h | 1 + src/sys/create.c | 24 +++++++++++++++++++++++- src/sys/driver.h | 3 ++- 3 files changed, 26 insertions(+), 2 deletions(-) diff --git a/inc/winfsp/fsctl.h b/inc/winfsp/fsctl.h index a0a5bd2c..f24da056 100644 --- a/inc/winfsp/fsctl.h +++ b/inc/winfsp/fsctl.h @@ -112,6 +112,7 @@ typedef struct { UINT64 UserContext; UINT64 UserContext2; + UINT32 Delete:1; /* if set, the file or directory must be deleted */ } Cleanup; struct { diff --git a/src/sys/create.c b/src/sys/create.c index 371b4fc1..4bdffadb 100644 --- a/src/sys/create.c +++ b/src/sys/create.c @@ -195,6 +195,15 @@ static NTSTATUS FspFsvolCreate( goto exit; } + /* cannot FILE_DELETE_ON_CLOSE on the root directory */ + if (sizeof(WCHAR) == RelatedFsContext->FileName.Length && + 0 == FileName.Length && + FlagOn(CreateOptions, FILE_DELETE_ON_CLOSE)) + { + Result = STATUS_CANNOT_DELETE; + goto exit; + } + FSP_FILE_CONTEXT *RelatedFsContext = RelatedFileObject->FsContext; ASSERT(0 != RelatedFsContext); @@ -230,6 +239,14 @@ static NTSTATUS FspFsvolCreate( goto exit; } + /* cannot FILE_DELETE_ON_CLOSE on the root directory */ + if (sizeof(WCHAR) == FileName.Length) && + FlagOn(CreateOptions, FILE_DELETE_ON_CLOSE)) + { + Result = STATUS_CANNOT_DELETE; + goto exit; + } + Result = FspFileContextCreate( FileName.Length, &FsContext); @@ -483,7 +500,8 @@ VOID FspFsvolCreateComplete( FSP_RETURN(Result = STATUS_ACCESS_DENIED); } else - if (FlagOn(CreateOptions, FILE_DELETE_ON_CLOSE)) + if (!FlagOn(ResponseFileAttributes, FILE_ATTRIBUTE_DIRECTORY) && + FlagOn(CreateOptions, FILE_DELETE_ON_CLOSE)) { FspFsvolCreateClose(Irp, Response); FSP_RETURN(Result = STATUS_CANNOT_DELETE); @@ -573,6 +591,8 @@ VOID FspFsvolCreateComplete( IoSetShareAccess(AccessState->PreviouslyGrantedAccess, ShareAccess, FileObject, &FsContext->ShareAccess); FspFileContextOpen(FsContext); + if (FlagOn(CreateOptions, FILE_DELETE_ON_CLOSE)) + FsContext->DeleteOnClose = TRUE; Result = STATUS_SUCCESS; } else @@ -592,6 +612,8 @@ VOID FspFsvolCreateComplete( { FspFileContextRetain(FsContext); FspFileContextOpen(FsContext); + if (FlagOn(CreateOptions, FILE_DELETE_ON_CLOSE)) + FsContext->DeleteOnClose = TRUE; } ExReleaseResourceLite(FsContext->Header.Resource); } diff --git a/src/sys/driver.h b/src/sys/driver.h index 648bab81..f6332f8b 100644 --- a/src/sys/driver.h +++ b/src/sys/driver.h @@ -388,7 +388,8 @@ typedef struct /* protected by Header.Resource */ LONG OpenCount; SHARE_ACCESS ShareAccess; - BOOLEAN DeletePending; + BOOLEAN DeletePending; /* FileDispositionInformation */ + BOOLEAN DeleteOnClose; /* FILE_DELETE_ON_CLOSE */ /* read-only after creation */ FSP_DEVICE_GENERIC_TABLE_ELEMENT ElementStorage; UINT64 UserContext;