From 4f5c19c73f23c11b6cbcf67ba2e2316400f313b0 Mon Sep 17 00:00:00 2001 From: Bill Zissimopoulos Date: Tue, 9 Feb 2016 16:58:22 -0800 Subject: [PATCH] sys, dll: Request->FileName: testing --- inc/winfsp/fsctl.h | 2 +- inc/winfsp/winfsp.h | 4 ++-- src/dll/cleanup.c | 1 + src/dll/fileinfo.c | 3 ++- src/sys/cleanup.c | 6 +++--- tst/winfsp-tests/memfs.cpp | 9 +++++++-- tst/winfsp-tests/winfsp-tests.c | 2 +- 7 files changed, 17 insertions(+), 10 deletions(-) diff --git a/inc/winfsp/fsctl.h b/inc/winfsp/fsctl.h index 2aef04f2..c4853301 100644 --- a/inc/winfsp/fsctl.h +++ b/inc/winfsp/fsctl.h @@ -217,7 +217,7 @@ typedef struct } Info; } SetInformation; } Req; - FSP_FSCTL_TRANSACT_BUF FileName; /* {Create,Overwrite,Cleanup,SetInformation/{Disposition,Rename}} */ + FSP_FSCTL_TRANSACT_BUF FileName; /* {Create,Cleanup,SetInformation/{Disposition,Rename}} */ FSP_FSCTL_DECLSPEC_ALIGN UINT8 Buffer[]; } FSP_FSCTL_TRANSACT_REQ; typedef struct diff --git a/inc/winfsp/winfsp.h b/inc/winfsp/winfsp.h index 88231ea8..99a19e92 100644 --- a/inc/winfsp/winfsp.h +++ b/inc/winfsp/winfsp.h @@ -54,7 +54,7 @@ typedef struct _FSP_FILE_SYSTEM_INTERFACE FSP_FSCTL_FILE_INFO *FileInfo); VOID (*Cleanup)(FSP_FILE_SYSTEM *FileSystem, FSP_FSCTL_TRANSACT_REQ *Request, - PVOID FileNode, BOOLEAN Delete); + PVOID FileNode, PWSTR FileName, BOOLEAN Delete); VOID (*Close)(FSP_FILE_SYSTEM *FileSystem, FSP_FSCTL_TRANSACT_REQ *Request, PVOID FileNode); @@ -77,7 +77,7 @@ typedef struct _FSP_FILE_SYSTEM_INTERFACE FSP_FSCTL_FILE_INFO *FileInfo); NTSTATUS (*CanDelete)(FSP_FILE_SYSTEM *FileSystem, FSP_FSCTL_TRANSACT_REQ *Request, - PVOID FileNode); + PVOID FileNode, PWSTR FileName); NTSTATUS (*Rename)(FSP_FILE_SYSTEM *FileSystem, FSP_FSCTL_TRANSACT_REQ *Request, PVOID FileNode, diff --git a/src/dll/cleanup.c b/src/dll/cleanup.c index bb2c5b39..65e83e53 100644 --- a/src/dll/cleanup.c +++ b/src/dll/cleanup.c @@ -12,6 +12,7 @@ FSP_API NTSTATUS FspFileSystemOpCleanup(FSP_FILE_SYSTEM *FileSystem, if (0 != FileSystem->Interface->Cleanup) FileSystem->Interface->Cleanup(FileSystem, Request, (PVOID)Request->Req.Cleanup.UserContext, + 0 != Request->FileName.Size ? (PWSTR)Request->Buffer : 0, 0 != Request->Req.Cleanup.Delete); return FspFileSystemSendCleanupResponse(FileSystem, Request); diff --git a/src/dll/fileinfo.c b/src/dll/fileinfo.c index 3da8a9cd..ef53bc4b 100644 --- a/src/dll/fileinfo.c +++ b/src/dll/fileinfo.c @@ -79,7 +79,8 @@ FSP_API NTSTATUS FspFileSystemOpSetInformation(FSP_FILE_SYSTEM *FileSystem, if (0 != FileSystem->Interface->CanDelete) if (Request->Req.SetInformation.Info.Disposition.Delete) Result = FileSystem->Interface->CanDelete(FileSystem, Request, - (PVOID)Request->Req.SetInformation.UserContext); + (PVOID)Request->Req.SetInformation.UserContext, + (PWSTR)Request->Buffer); else Result = STATUS_SUCCESS; break; diff --git a/src/sys/cleanup.c b/src/sys/cleanup.c index cc2143cf..3356ecb0 100644 --- a/src/sys/cleanup.c +++ b/src/sys/cleanup.c @@ -64,12 +64,12 @@ static NTSTATUS FspFsvolCleanup( FspFileNodeClose(FileNode, FileObject, &DeletePending); /* - * The FileNode is no longer in the Context table, therefore we do not - * need to protect its FileName against renames! + * If DeletePending is TRUE, the FileNode is no longer in the Context table, + * therefore we do not need to protect its FileName against renames! */ /* create the user-mode file system request; MustSucceed because IRP_MJ_CLEANUP cannot fail */ - FspIopCreateRequestMustSucceed(Irp, &FileNode->FileName, 0, &Request); + FspIopCreateRequestMustSucceed(Irp, DeletePending ? &FileNode->FileName : 0, 0, &Request); Request->Kind = FspFsctlTransactCleanupKind; Request->Req.Cleanup.UserContext = FileNode->UserContext; Request->Req.Cleanup.UserContext2 = FileDesc->UserContext2; diff --git a/tst/winfsp-tests/memfs.cpp b/tst/winfsp-tests/memfs.cpp index 0876070d..2d70b9fc 100644 --- a/tst/winfsp-tests/memfs.cpp +++ b/tst/winfsp-tests/memfs.cpp @@ -7,6 +7,7 @@ #undef _DEBUG #include "memfs.h" #include +#include #define MEMFS_SECTOR_SIZE 512 #define MEMFS_SECTORS_PER_ALLOCATION_UNIT 1 @@ -375,11 +376,13 @@ NTSTATUS Overwrite(FSP_FILE_SYSTEM *FileSystem, static VOID Cleanup(FSP_FILE_SYSTEM *FileSystem, FSP_FSCTL_TRANSACT_REQ *Request, - PVOID FileNode0, BOOLEAN Delete) + PVOID FileNode0, PWSTR FileName, BOOLEAN Delete) { MEMFS *Memfs = (MEMFS *)FileSystem->UserContext; MEMFS_FILE_NODE *FileNode = (MEMFS_FILE_NODE *)FileNode0; + assert(0 == FileName || 0 == wcscmp(FileNode->FileName, FileName)); + if (Delete && !MemfsFileNodeMapHasChild(Memfs->FileNodeMap, FileNode)) MemfsFileNodeMapRemove(Memfs->FileNodeMap, FileNode); } @@ -484,11 +487,13 @@ NTSTATUS SetFileSize(FSP_FILE_SYSTEM *FileSystem, NTSTATUS CanDelete(FSP_FILE_SYSTEM *FileSystem, FSP_FSCTL_TRANSACT_REQ *Request, - PVOID FileNode0) + PVOID FileNode0, PWSTR FileName) { MEMFS *Memfs = (MEMFS *)FileSystem->UserContext; MEMFS_FILE_NODE *FileNode = (MEMFS_FILE_NODE *)FileNode0; + assert(0 == FileName || 0 == wcscmp(FileNode->FileName, FileName)); + if (MemfsFileNodeMapHasChild(Memfs->FileNodeMap, FileNode)) return STATUS_DIRECTORY_NOT_EMPTY; diff --git a/tst/winfsp-tests/winfsp-tests.c b/tst/winfsp-tests/winfsp-tests.c index cfb8ec10..3962b042 100644 --- a/tst/winfsp-tests/winfsp-tests.c +++ b/tst/winfsp-tests/winfsp-tests.c @@ -1,6 +1,6 @@ #include -int NtfsTests = 1; +int NtfsTests = 0; int WinFspDiskTests = 1; int WinFspNetTests = 1;