diff --git a/inc/winfsp/fsctl.h b/inc/winfsp/fsctl.h index d9a74d22..4bfb1a5d 100644 --- a/inc/winfsp/fsctl.h +++ b/inc/winfsp/fsctl.h @@ -43,6 +43,20 @@ extern const __declspec(selectany) GUID FspFsvrtDeviceClassGuid = #define FSP_FSCTL_TRANSACT_REQ_SIZEMAX (4096 - 64) /* 64: size for internal request header */ #define FSP_FSCTL_TRANSACT_RSP_SIZEMAX (4096 - 64) /* symmetry! */ +/* file metadata */ +typedef struct +{ + UINT32 FileAttributes; + UINT32 ReparseTag; + UINT64 AllocationSize; + UINT64 FileSize; + UINT64 CreationTime; + UINT64 LastAccessTime; + UINT64 LastWriteTime; + UINT64 ChangeTime; + UINT64 IndexNumber; +} FSP_FSCTL_FILE_INFO; + /* marshalling */ #pragma warning(push) #pragma warning(disable:4200) /* zero-sized array in struct/union */ @@ -166,17 +180,8 @@ typedef struct { UINT64 UserContext; /* user context associated with file node */ UINT64 UserContext2; /* user context associated with file descriptor (handle) */ - UINT32 FileAttributes; /* file attributes of opened file */ - UINT32 ReparseTag; /* reparse tag of opened file (FILE_ATTRIBUTE_REPARSE_POINT) */ - UINT64 AllocationSize; /* file allocation size */ - UINT64 FileSize; /* file size */ - UINT64 CreationTime; - UINT64 LastAccessTime; - UINT64 LastWriteTime; - UINT64 ChangeTime; - UINT64 IndexNumber; /* unique file id */ UINT32 GrantedAccess; /* FILE_{READ_DATA,WRITE_DATA,etc.} */ - + FSP_FSCTL_FILE_INFO FileInfo; } Opened; /* IoStatus.Status == STATUS_REPARSE */ struct @@ -186,8 +191,7 @@ typedef struct } Create; struct { - UINT64 AllocationSize; /* file allocation size */ - UINT64 FileSize; /* file size */ + FSP_FSCTL_FILE_INFO FileInfo; } Overwrite; } Rsp; FSP_FSCTL_DECLSPEC_ALIGN UINT8 Buffer[]; diff --git a/inc/winfsp/winfsp.h b/inc/winfsp/winfsp.h index ebdc487d..2bc7543d 100644 --- a/inc/winfsp/winfsp.h +++ b/inc/winfsp/winfsp.h @@ -31,42 +31,24 @@ extern "C" { typedef struct _FSP_FILE_SYSTEM FSP_FILE_SYSTEM; typedef VOID FSP_FILE_SYSTEM_DISPATCHER(FSP_FILE_SYSTEM *, FSP_FSCTL_TRANSACT_REQ *); typedef NTSTATUS FSP_FILE_SYSTEM_OPERATION(FSP_FILE_SYSTEM *, FSP_FSCTL_TRANSACT_REQ *); -typedef struct _FSP_FILE_NODE_INFO -{ - PVOID FileNode; - DWORD FileAttributes; - DWORD ReparseTag; - UINT64 AllocationSize; - UINT64 FileSize; - UINT64 CreationTime; - UINT64 LastAccessTime; - UINT64 LastWriteTime; - UINT64 ChangeTime; - UINT64 IndexNumber; -} FSP_FILE_NODE_INFO; -typedef struct _FSP_FILE_SIZE_INFO -{ - UINT64 AllocationSize; - UINT64 FileSize; -} FSP_FILE_SIZE_INFO; typedef struct _FSP_FILE_SYSTEM_INTERFACE { NTSTATUS (*GetSecurity)(FSP_FILE_SYSTEM *FileSystem, - PWSTR FileName, PDWORD PFileAttributes, + PWSTR FileName, PUINT32 PFileAttributes, PSECURITY_DESCRIPTOR SecurityDescriptor, SIZE_T *PSecurityDescriptorSize); NTSTATUS (*Create)(FSP_FILE_SYSTEM *FileSystem, FSP_FSCTL_TRANSACT_REQ *Request, - PWSTR FileName, BOOLEAN CaseSensitive, DWORD CreateOptions, - DWORD FileAttributes, PSECURITY_DESCRIPTOR SecurityDescriptor, UINT64 AllocationSize, - FSP_FILE_NODE_INFO *NodeInfo); + PWSTR FileName, BOOLEAN CaseSensitive, UINT32 CreateOptions, + UINT32 FileAttributes, PSECURITY_DESCRIPTOR SecurityDescriptor, UINT64 AllocationSize, + PVOID *PFileNode, FSP_FSCTL_FILE_INFO *FileInfo); NTSTATUS (*Open)(FSP_FILE_SYSTEM *FileSystem, FSP_FSCTL_TRANSACT_REQ *Request, - PWSTR FileName, BOOLEAN CaseSensitive, DWORD CreateOptions, - FSP_FILE_NODE_INFO *NodeInfo); + PWSTR FileName, BOOLEAN CaseSensitive, UINT32 CreateOptions, + PVOID *PFileNode, FSP_FSCTL_FILE_INFO *FileInfo); NTSTATUS (*Overwrite)(FSP_FILE_SYSTEM *FileSystem, FSP_FSCTL_TRANSACT_REQ *Request, - PVOID FileNode, DWORD FileAttributes, BOOLEAN ReplaceFileAttributes, - FSP_FILE_SIZE_INFO *SizeInfo); + PVOID FileNode, UINT32 FileAttributes, BOOLEAN ReplaceFileAttributes, + FSP_FSCTL_FILE_INFO *FileInfo); VOID (*Cleanup)(FSP_FILE_SYSTEM *FileSystem, FSP_FSCTL_TRANSACT_REQ *Request, PVOID FileNode, BOOLEAN Delete); @@ -160,7 +142,7 @@ FSP_API PGENERIC_MAPPING FspGetFileGenericMapping(VOID); FSP_API NTSTATUS FspAccessCheckEx(FSP_FILE_SYSTEM *FileSystem, FSP_FSCTL_TRANSACT_REQ *Request, BOOLEAN CheckParentDirectory, BOOLEAN AllowTraverseCheck, - DWORD DesiredAccess, PDWORD PGrantedAccess, + UINT32 DesiredAccess, PUINT32 PGrantedAccess, PSECURITY_DESCRIPTOR *PSecurityDescriptor); FSP_API NTSTATUS FspAssignSecurity(FSP_FILE_SYSTEM *FileSystem, FSP_FSCTL_TRANSACT_REQ *Request, @@ -178,10 +160,10 @@ FSP_API NTSTATUS FspFileSystemOpClose(FSP_FILE_SYSTEM *FileSystem, FSP_FSCTL_TRANSACT_REQ *Request); FSP_API NTSTATUS FspFileSystemSendCreateResponse(FSP_FILE_SYSTEM *FileSystem, FSP_FSCTL_TRANSACT_REQ *Request, UINT_PTR Information, - const FSP_FILE_NODE_INFO *NodeInfo, DWORD GrantedAccess); + PVOID FileNode, UINT32 GrantedAccess, const FSP_FSCTL_FILE_INFO *FileInfo); FSP_API NTSTATUS FspFileSystemSendOverwriteResponse(FSP_FILE_SYSTEM *FileSystem, FSP_FSCTL_TRANSACT_REQ *Request, - const FSP_FILE_SIZE_INFO *SizeInfo); + const FSP_FSCTL_FILE_INFO *FileInfo); FSP_API NTSTATUS FspFileSystemSendCleanupResponse(FSP_FILE_SYSTEM *FileSystem, FSP_FSCTL_TRANSACT_REQ *Request); FSP_API NTSTATUS FspFileSystemSendCloseResponse(FSP_FILE_SYSTEM *FileSystem, @@ -191,7 +173,7 @@ static inline NTSTATUS FspAccessCheck(FSP_FILE_SYSTEM *FileSystem, FSP_FSCTL_TRANSACT_REQ *Request, BOOLEAN CheckParentDirectory, BOOLEAN AllowTraverseCheck, - DWORD DesiredAccess, PDWORD PGrantedAccess) + UINT32 DesiredAccess, PUINT32 PGrantedAccess) { return FspAccessCheckEx(FileSystem, Request, CheckParentDirectory, AllowTraverseCheck, diff --git a/src/dll/create.c b/src/dll/create.c index 1abcd48b..0379e976 100644 --- a/src/dll/create.c +++ b/src/dll/create.c @@ -20,7 +20,7 @@ FSP_API PGENERIC_MAPPING FspGetFileGenericMapping(VOID) } static NTSTATUS FspGetSecurity(FSP_FILE_SYSTEM *FileSystem, - PWSTR FileName, PDWORD PFileAttributes, + PWSTR FileName, PUINT32 PFileAttributes, PSECURITY_DESCRIPTOR *PSecurityDescriptor, SIZE_T *PSecurityDescriptorSize) { for (;;) @@ -40,7 +40,7 @@ static NTSTATUS FspGetSecurity(FSP_FILE_SYSTEM *FileSystem, FSP_API NTSTATUS FspAccessCheckEx(FSP_FILE_SYSTEM *FileSystem, FSP_FSCTL_TRANSACT_REQ *Request, BOOLEAN CheckParentDirectory, BOOLEAN AllowTraverseCheck, - DWORD DesiredAccess, PDWORD PGrantedAccess, + UINT32 DesiredAccess, PUINT32 PGrantedAccess, PSECURITY_DESCRIPTOR *PSecurityDescriptor) { *PGrantedAccess = 0; @@ -57,13 +57,13 @@ FSP_API NTSTATUS FspAccessCheckEx(FSP_FILE_SYSTEM *FileSystem, NTSTATUS Result; PWSTR Parent, Suffix, Prefix, Remain; - DWORD FileAttributes; + UINT32 FileAttributes; PSECURITY_DESCRIPTOR SecurityDescriptor = 0; SIZE_T SecurityDescriptorSize; UINT8 PrivilegeSetBuf[sizeof(PRIVILEGE_SET) + 15 * sizeof(LUID_AND_ATTRIBUTES)]; PPRIVILEGE_SET PrivilegeSet = (PVOID)PrivilegeSetBuf; DWORD PrivilegeSetLength = sizeof PrivilegeSetBuf; - DWORD TraverseAccess; + UINT32 TraverseAccess; BOOL AccessStatus; if (CheckParentDirectory) @@ -234,7 +234,7 @@ FSP_API VOID FspDeleteSecurityDescriptor(PSECURITY_DESCRIPTOR SecurityDescriptor static inline NTSTATUS FspFileSystemCreateCheck(FSP_FILE_SYSTEM *FileSystem, FSP_FSCTL_TRANSACT_REQ *Request, - BOOLEAN AllowTraverseCheck, PDWORD PGrantedAccess, + BOOLEAN AllowTraverseCheck, PUINT32 PGrantedAccess, PSECURITY_DESCRIPTOR *PSecurityDescriptor) { NTSTATUS Result; @@ -255,7 +255,7 @@ NTSTATUS FspFileSystemCreateCheck(FSP_FILE_SYSTEM *FileSystem, static inline NTSTATUS FspFileSystemOpenCheck(FSP_FILE_SYSTEM *FileSystem, FSP_FSCTL_TRANSACT_REQ *Request, - BOOLEAN AllowTraverseCheck, PDWORD PGrantedAccess) + BOOLEAN AllowTraverseCheck, PUINT32 PGrantedAccess) { NTSTATUS Result; @@ -275,7 +275,7 @@ NTSTATUS FspFileSystemOpenCheck(FSP_FILE_SYSTEM *FileSystem, static inline NTSTATUS FspFileSystemOverwriteCheck(FSP_FILE_SYSTEM *FileSystem, FSP_FSCTL_TRANSACT_REQ *Request, - BOOLEAN AllowTraverseCheck, PDWORD PGrantedAccess) + BOOLEAN AllowTraverseCheck, PUINT32 PGrantedAccess) { NTSTATUS Result; BOOLEAN Supersede = FILE_SUPERSEDE == ((Request->Req.Create.CreateOptions >> 24) & 0xff); @@ -299,9 +299,10 @@ static NTSTATUS FspFileSystemOpCreate_FileCreate(FSP_FILE_SYSTEM *FileSystem, FSP_FSCTL_TRANSACT_REQ *Request) { NTSTATUS Result; - DWORD GrantedAccess; + UINT32 GrantedAccess; PSECURITY_DESCRIPTOR ParentDescriptor, ObjectDescriptor; - FSP_FILE_NODE_INFO NodeInfo; + PVOID FileNode; + FSP_FSCTL_FILE_INFO FileInfo; Result = FspFileSystemCreateCheck(FileSystem, Request, TRUE, &GrantedAccess, &ParentDescriptor); if (!NT_SUCCESS(Result)) @@ -315,21 +316,22 @@ static NTSTATUS FspFileSystemOpCreate_FileCreate(FSP_FILE_SYSTEM *FileSystem, Result = FileSystem->Interface->Create(FileSystem, Request, (PWSTR)Request->Buffer, Request->Req.Create.CaseSensitive, Request->Req.Create.CreateOptions, Request->Req.Create.FileAttributes, ObjectDescriptor, Request->Req.Create.AllocationSize, - &NodeInfo); + &FileNode, &FileInfo); FspDeleteSecurityDescriptor(ObjectDescriptor, FspAssignSecurity); if (!NT_SUCCESS(Result)) return FspFileSystemSendResponseWithStatus(FileSystem, Request, Result); return FspFileSystemSendCreateResponse(FileSystem, Request, - FILE_CREATED, &NodeInfo, GrantedAccess); + FILE_CREATED, FileNode, GrantedAccess, &FileInfo); } static NTSTATUS FspFileSystemOpCreate_FileOpen(FSP_FILE_SYSTEM *FileSystem, FSP_FSCTL_TRANSACT_REQ *Request) { NTSTATUS Result; - DWORD GrantedAccess; - FSP_FILE_NODE_INFO NodeInfo; + UINT32 GrantedAccess; + PVOID FileNode; + FSP_FSCTL_FILE_INFO FileInfo; Result = FspFileSystemOpenCheck(FileSystem, Request, TRUE, &GrantedAccess); if (!NT_SUCCESS(Result)) @@ -337,21 +339,22 @@ static NTSTATUS FspFileSystemOpCreate_FileOpen(FSP_FILE_SYSTEM *FileSystem, Result = FileSystem->Interface->Open(FileSystem, Request, (PWSTR)Request->Buffer, Request->Req.Create.CaseSensitive, Request->Req.Create.CreateOptions, - &NodeInfo); + &FileNode, &FileInfo); if (!NT_SUCCESS(Result)) return FspFileSystemSendResponseWithStatus(FileSystem, Request, Result); return FspFileSystemSendCreateResponse(FileSystem, Request, - FILE_OPENED, &NodeInfo, GrantedAccess); + FILE_OPENED, FileNode, GrantedAccess, &FileInfo); } static NTSTATUS FspFileSystemOpCreate_FileOpenIf(FSP_FILE_SYSTEM *FileSystem, FSP_FSCTL_TRANSACT_REQ *Request) { NTSTATUS Result; - DWORD GrantedAccess; + UINT32 GrantedAccess; PSECURITY_DESCRIPTOR ParentDescriptor, ObjectDescriptor; - FSP_FILE_NODE_INFO NodeInfo; + PVOID FileNode; + FSP_FSCTL_FILE_INFO FileInfo; BOOLEAN Create = FALSE; Result = FspFileSystemOpenCheck(FileSystem, Request, TRUE, &GrantedAccess); @@ -366,7 +369,7 @@ static NTSTATUS FspFileSystemOpCreate_FileOpenIf(FSP_FILE_SYSTEM *FileSystem, { Result = FileSystem->Interface->Open(FileSystem, Request, (PWSTR)Request->Buffer, Request->Req.Create.CaseSensitive, Request->Req.Create.CreateOptions, - &NodeInfo); + &FileNode, &FileInfo); if (!NT_SUCCESS(Result)) { if (STATUS_OBJECT_NAME_NOT_FOUND != Result) @@ -389,22 +392,23 @@ static NTSTATUS FspFileSystemOpCreate_FileOpenIf(FSP_FILE_SYSTEM *FileSystem, Result = FileSystem->Interface->Create(FileSystem, Request, (PWSTR)Request->Buffer, Request->Req.Create.CaseSensitive, Request->Req.Create.CreateOptions, Request->Req.Create.FileAttributes, ObjectDescriptor, Request->Req.Create.AllocationSize, - &NodeInfo); + &FileNode, &FileInfo); FspDeleteSecurityDescriptor(ObjectDescriptor, FspAssignSecurity); if (!NT_SUCCESS(Result)) return FspFileSystemSendResponseWithStatus(FileSystem, Request, Result); } return FspFileSystemSendCreateResponse(FileSystem, Request, - Create ? FILE_CREATED : FILE_OPENED, &NodeInfo, GrantedAccess); + Create ? FILE_CREATED : FILE_OPENED, FileNode, GrantedAccess, &FileInfo); } static NTSTATUS FspFileSystemOpCreate_FileOverwrite(FSP_FILE_SYSTEM *FileSystem, FSP_FSCTL_TRANSACT_REQ *Request) { NTSTATUS Result; - DWORD GrantedAccess; - FSP_FILE_NODE_INFO NodeInfo; + UINT32 GrantedAccess; + PVOID FileNode; + FSP_FSCTL_FILE_INFO FileInfo; BOOLEAN Supersede = FILE_SUPERSEDE == ((Request->Req.Create.CreateOptions >> 24) & 0xff); Result = FspFileSystemOverwriteCheck(FileSystem, Request, TRUE, &GrantedAccess); @@ -413,21 +417,22 @@ static NTSTATUS FspFileSystemOpCreate_FileOverwrite(FSP_FILE_SYSTEM *FileSystem, Result = FileSystem->Interface->Open(FileSystem, Request, (PWSTR)Request->Buffer, Request->Req.Create.CaseSensitive, Request->Req.Create.CreateOptions, - &NodeInfo); + &FileNode, &FileInfo); if (!NT_SUCCESS(Result)) return FspFileSystemSendResponseWithStatus(FileSystem, Request, Result); return FspFileSystemSendCreateResponse(FileSystem, Request, - Supersede ? FILE_SUPERSEDED : FILE_OVERWRITTEN, &NodeInfo, GrantedAccess); + Supersede ? FILE_SUPERSEDED : FILE_OVERWRITTEN, FileNode, GrantedAccess, &FileInfo); } static NTSTATUS FspFileSystemOpCreate_FileOverwriteIf(FSP_FILE_SYSTEM *FileSystem, FSP_FSCTL_TRANSACT_REQ *Request) { NTSTATUS Result; - DWORD GrantedAccess; + UINT32 GrantedAccess; PSECURITY_DESCRIPTOR ParentDescriptor, ObjectDescriptor; - FSP_FILE_NODE_INFO NodeInfo; + PVOID FileNode; + FSP_FSCTL_FILE_INFO FileInfo; BOOLEAN Create = FALSE; Result = FspFileSystemOverwriteCheck(FileSystem, Request, TRUE, &GrantedAccess); @@ -442,7 +447,7 @@ static NTSTATUS FspFileSystemOpCreate_FileOverwriteIf(FSP_FILE_SYSTEM *FileSyste { Result = FileSystem->Interface->Open(FileSystem, Request, (PWSTR)Request->Buffer, Request->Req.Create.CaseSensitive, Request->Req.Create.CreateOptions, - &NodeInfo); + &FileNode, &FileInfo); if (!NT_SUCCESS(Result)) { if (STATUS_OBJECT_NAME_NOT_FOUND != Result) @@ -465,14 +470,14 @@ static NTSTATUS FspFileSystemOpCreate_FileOverwriteIf(FSP_FILE_SYSTEM *FileSyste Result = FileSystem->Interface->Create(FileSystem, Request, (PWSTR)Request->Buffer, Request->Req.Create.CaseSensitive, Request->Req.Create.CreateOptions, Request->Req.Create.FileAttributes, ObjectDescriptor, Request->Req.Create.AllocationSize, - &NodeInfo); + &FileNode, &FileInfo); FspDeleteSecurityDescriptor(ObjectDescriptor, FspAssignSecurity); if (!NT_SUCCESS(Result)) return FspFileSystemSendResponseWithStatus(FileSystem, Request, Result); } return FspFileSystemSendCreateResponse(FileSystem, Request, - Create ? FILE_CREATED : FILE_OVERWRITTEN, &NodeInfo, GrantedAccess); + Create ? FILE_CREATED : FILE_OVERWRITTEN, FileNode, GrantedAccess, &FileInfo); } static NTSTATUS FspFileSystemOpCreate_FileOpenTargetDirectory(FSP_FILE_SYSTEM *FileSystem, @@ -480,8 +485,9 @@ static NTSTATUS FspFileSystemOpCreate_FileOpenTargetDirectory(FSP_FILE_SYSTEM *F { NTSTATUS Result; PWSTR Parent, Suffix; - DWORD GrantedAccess; - FSP_FILE_NODE_INFO NodeInfo; + UINT32 GrantedAccess; + PVOID FileNode; + FSP_FSCTL_FILE_INFO FileInfo; UINT_PTR Information; Result = FspAccessCheck(FileSystem, Request, TRUE, TRUE, @@ -492,7 +498,7 @@ static NTSTATUS FspFileSystemOpCreate_FileOpenTargetDirectory(FSP_FILE_SYSTEM *F FspPathSuffix((PWSTR)Request->Buffer, &Parent, &Suffix); Result = FileSystem->Interface->Open(FileSystem, Request, (PWSTR)Request->Buffer, Request->Req.Create.CaseSensitive, Request->Req.Create.CreateOptions, - &NodeInfo); + &FileNode, &FileInfo); FspPathCombine((PWSTR)Request->Buffer, Suffix); if (!NT_SUCCESS(Result)) return FspFileSystemSendResponseWithStatus(FileSystem, Request, Result); @@ -505,7 +511,7 @@ static NTSTATUS FspFileSystemOpCreate_FileOpenTargetDirectory(FSP_FILE_SYSTEM *F } return FspFileSystemSendCreateResponse(FileSystem, Request, - Information, &NodeInfo, GrantedAccess); + Information, FileNode, GrantedAccess, &FileInfo); } FSP_API NTSTATUS FspFileSystemOpCreate(FSP_FILE_SYSTEM *FileSystem, @@ -542,13 +548,13 @@ FSP_API NTSTATUS FspFileSystemOpOverwrite(FSP_FILE_SYSTEM *FileSystem, FSP_FSCTL_TRANSACT_REQ *Request) { NTSTATUS Result; - FSP_FILE_SIZE_INFO SizeInfo; + FSP_FSCTL_FILE_INFO FileInfo; Result = FileSystem->Interface->Overwrite(FileSystem, Request, (PVOID)Request->Req.Overwrite.UserContext, Request->Req.Overwrite.FileAttributes, Request->Req.Overwrite.Supersede, - &SizeInfo); + &FileInfo); if (!NT_SUCCESS(Result)) { if (0 != FileSystem->Interface->Close) @@ -557,12 +563,12 @@ FSP_API NTSTATUS FspFileSystemOpOverwrite(FSP_FILE_SYSTEM *FileSystem, return FspFileSystemSendResponseWithStatus(FileSystem, Request, Result); } - return FspFileSystemSendOverwriteResponse(FileSystem, Request, &SizeInfo); + return FspFileSystemSendOverwriteResponse(FileSystem, Request, &FileInfo); } FSP_API NTSTATUS FspFileSystemSendCreateResponse(FSP_FILE_SYSTEM *FileSystem, FSP_FSCTL_TRANSACT_REQ *Request, UINT_PTR Information, - const FSP_FILE_NODE_INFO *NodeInfo, DWORD GrantedAccess) + PVOID FileNode, UINT32 GrantedAccess, const FSP_FSCTL_FILE_INFO *FileInfo) { FSP_FSCTL_TRANSACT_RSP Response; @@ -572,23 +578,15 @@ FSP_API NTSTATUS FspFileSystemSendCreateResponse(FSP_FILE_SYSTEM *FileSystem, Response.Hint = Request->Hint; Response.IoStatus.Status = STATUS_SUCCESS; Response.IoStatus.Information = Information; - Response.Rsp.Create.Opened.UserContext = (UINT_PTR)NodeInfo->FileNode; - Response.Rsp.Create.Opened.FileAttributes = NodeInfo->FileAttributes; - Response.Rsp.Create.Opened.ReparseTag = NodeInfo->ReparseTag; - Response.Rsp.Create.Opened.AllocationSize = NodeInfo->AllocationSize; - Response.Rsp.Create.Opened.FileSize = NodeInfo->FileSize; - Response.Rsp.Create.Opened.CreationTime = NodeInfo->CreationTime; - Response.Rsp.Create.Opened.LastAccessTime = NodeInfo->LastAccessTime; - Response.Rsp.Create.Opened.LastWriteTime = NodeInfo->LastWriteTime; - Response.Rsp.Create.Opened.ChangeTime = NodeInfo->ChangeTime; - Response.Rsp.Create.Opened.IndexNumber = NodeInfo->IndexNumber; + Response.Rsp.Create.Opened.UserContext = (UINT_PTR)FileNode; Response.Rsp.Create.Opened.GrantedAccess = GrantedAccess; + memcpy(&Response.Rsp.Create.Opened.FileInfo, FileInfo, sizeof *FileInfo); return FspFileSystemSendResponse(FileSystem, &Response); } FSP_API NTSTATUS FspFileSystemSendOverwriteResponse(FSP_FILE_SYSTEM *FileSystem, FSP_FSCTL_TRANSACT_REQ *Request, - const FSP_FILE_SIZE_INFO *SizeInfo) + const FSP_FSCTL_FILE_INFO *FileInfo) { FSP_FSCTL_TRANSACT_RSP Response; @@ -598,7 +596,6 @@ FSP_API NTSTATUS FspFileSystemSendOverwriteResponse(FSP_FILE_SYSTEM *FileSystem, Response.Hint = Request->Hint; Response.IoStatus.Status = STATUS_SUCCESS; Response.IoStatus.Information = 0; - Response.Rsp.Overwrite.AllocationSize = SizeInfo->AllocationSize; - Response.Rsp.Overwrite.FileSize = SizeInfo->FileSize; + memcpy(&Response.Rsp.Overwrite.FileInfo, FileInfo, sizeof *FileInfo); return FspFileSystemSendResponse(FileSystem, &Response); } diff --git a/src/sys/create.c b/src/sys/create.c index 15504d91..a6073bee 100644 --- a/src/sys/create.c +++ b/src/sys/create.c @@ -546,8 +546,8 @@ VOID FspFsvolCreateComplete( } /* populate the FileNode/FileDesc fields from the Response */ - FileNode->Header.AllocationSize.QuadPart = Response->Rsp.Create.Opened.AllocationSize; - FileNode->Header.FileSize.QuadPart = Response->Rsp.Create.Opened.FileSize; + FileNode->Header.AllocationSize.QuadPart = Response->Rsp.Create.Opened.FileInfo.AllocationSize; + FileNode->Header.FileSize.QuadPart = Response->Rsp.Create.Opened.FileInfo.FileSize; FileNode->UserContext = Response->Rsp.Create.Opened.UserContext; FileDesc->UserContext2 = Response->Rsp.Create.Opened.UserContext2; @@ -592,7 +592,7 @@ VOID FspFsvolCreateComplete( * If the user wants to delete on close, we must check at this * point though. */ - if (!FlagOn(Response->Rsp.Create.Opened.FileAttributes, FILE_ATTRIBUTE_DIRECTORY) && + if (!FlagOn(Response->Rsp.Create.Opened.FileInfo.FileAttributes, FILE_ATTRIBUTE_DIRECTORY) && (FlagOn(Response->Rsp.Create.Opened.GrantedAccess, FILE_WRITE_DATA) || DeleteOnClose)) { @@ -616,7 +616,7 @@ VOID FspFsvolCreateComplete( /* save the old Request FileAttributes and make them compatible with the open file */ UINT32 FileAttributes = Request->Req.Create.FileAttributes; - if (FlagOn(Response->Rsp.Create.Opened.FileAttributes, FILE_ATTRIBUTE_DIRECTORY)) + if (FlagOn(Response->Rsp.Create.Opened.FileInfo.FileAttributes, FILE_ATTRIBUTE_DIRECTORY)) SetFlag(FileAttributes, FILE_ATTRIBUTE_DIRECTORY); else ClearFlag(FileAttributes, FILE_ATTRIBUTE_DIRECTORY); @@ -677,8 +677,8 @@ VOID FspFsvolCreateComplete( } /* file was successfully overwritten/superseded */ - FileNode->Header.AllocationSize.QuadPart = Response->Rsp.Overwrite.AllocationSize; - FileNode->Header.FileSize.QuadPart = Response->Rsp.Overwrite.FileSize; + FileNode->Header.AllocationSize.QuadPart = Response->Rsp.Overwrite.FileInfo.AllocationSize; + FileNode->Header.FileSize.QuadPart = Response->Rsp.Overwrite.FileInfo.FileSize; CcSetFileSizes(FileObject, (PCC_FILE_SIZES)&FileNode->Header.AllocationSize); FspFileNodeRelease(FileNode, Both); diff --git a/src/sys/driver.h b/src/sys/driver.h index cc784bea..24f8facf 100644 --- a/src/sys/driver.h +++ b/src/sys/driver.h @@ -582,7 +582,7 @@ VOID FspFileNodeAcquireExclusive(FSP_FILE_NODE *FileNode, ULONG Flags); BOOLEAN FspFileNodeTryAcquireExclusive(FSP_FILE_NODE *FileNode, ULONG Flags); VOID FspFileNodeRelease(FSP_FILE_NODE *FileNode, ULONG Flags); FSP_FILE_NODE *FspFileNodeOpen(FSP_FILE_NODE *FileNode, PFILE_OBJECT FileObject, - DWORD GrantedAccess, DWORD ShareAccess, BOOLEAN DeleteOnClose, NTSTATUS *PResult); + UINT32 GrantedAccess, UINT32 ShareAccess, BOOLEAN DeleteOnClose, NTSTATUS *PResult); VOID FspFileNodeClose(FSP_FILE_NODE *FileNode, PFILE_OBJECT FileObject, PBOOLEAN PDeletePending); NTSTATUS FspFileDescCreate(FSP_FILE_DESC **PFileDesc); diff --git a/src/sys/file.c b/src/sys/file.c index cdf5fcc2..192df9d6 100644 --- a/src/sys/file.c +++ b/src/sys/file.c @@ -21,7 +21,7 @@ VOID FspFileNodeAcquireExclusive(FSP_FILE_NODE *FileNode, ULONG Flags); BOOLEAN FspFileNodeTryAcquireExclusive(FSP_FILE_NODE *FileNode, ULONG Flags); VOID FspFileNodeRelease(FSP_FILE_NODE *FileNode, ULONG Flags); FSP_FILE_NODE *FspFileNodeOpen(FSP_FILE_NODE *FileNode, PFILE_OBJECT FileObject, - DWORD GrantedAccess, DWORD ShareAccess, BOOLEAN DeleteOnClose, NTSTATUS *PResult); + UINT32 GrantedAccess, UINT32 ShareAccess, BOOLEAN DeleteOnClose, NTSTATUS *PResult); VOID FspFileNodeClose(FSP_FILE_NODE *FileNode, PFILE_OBJECT FileObject, PBOOLEAN PDeletePending); @@ -188,7 +188,7 @@ VOID FspFileNodeRelease(FSP_FILE_NODE *FileNode, ULONG Flags) } FSP_FILE_NODE *FspFileNodeOpen(FSP_FILE_NODE *FileNode, PFILE_OBJECT FileObject, - DWORD GrantedAccess, DWORD ShareAccess, BOOLEAN DeleteOnClose, NTSTATUS *PResult) + UINT32 GrantedAccess, UINT32 ShareAccess, BOOLEAN DeleteOnClose, NTSTATUS *PResult) { /* * Attempt to insert our FileNode into the volume device's generic table. diff --git a/tst/winfsp-tests/memfs.cpp b/tst/winfsp-tests/memfs.cpp index 299d5feb..47650124 100644 --- a/tst/winfsp-tests/memfs.cpp +++ b/tst/winfsp-tests/memfs.cpp @@ -27,7 +27,7 @@ int MemfsFileNameCompare(PWSTR a, PWSTR b) typedef struct _MEMFS_FILE_NODE { WCHAR FileName[MAX_PATH]; - FSP_FILE_NODE_INFO NodeInfo; + FSP_FSCTL_FILE_INFO FileInfo; SIZE_T FileSecuritySize; PVOID FileSecurity; PVOID FileData; @@ -69,12 +69,11 @@ NTSTATUS MemfsFileNodeCreate(PWSTR FileName, MEMFS_FILE_NODE **PFileNode) memset(FileNode, 0, sizeof *FileNode); wcscpy_s(FileNode->FileName, sizeof FileNode->FileName / sizeof(WCHAR), FileName); - FileNode->NodeInfo.FileNode = FileNode; - FileNode->NodeInfo.CreationTime = - FileNode->NodeInfo.LastAccessTime = - FileNode->NodeInfo.LastWriteTime = - FileNode->NodeInfo.ChangeTime = MemfsGetSystemTime(); - FileNode->NodeInfo.IndexNumber = IndexNumber++; + FileNode->FileInfo.CreationTime = + FileNode->FileInfo.LastAccessTime = + FileNode->FileInfo.LastWriteTime = + FileNode->FileInfo.ChangeTime = MemfsGetSystemTime(); + FileNode->FileInfo.IndexNumber = IndexNumber++; *PFileNode = FileNode; @@ -141,7 +140,7 @@ MEMFS_FILE_NODE *MemfsFileNodeMapGetParent(MEMFS_FILE_NODE_MAP *FileNodeMap, PWS *PResult = STATUS_OBJECT_PATH_NOT_FOUND; return 0; } - if (0 == (iter->second->NodeInfo.FileAttributes & FILE_ATTRIBUTE_DIRECTORY)) + if (0 == (iter->second->FileInfo.FileAttributes & FILE_ATTRIBUTE_DIRECTORY)) { *PResult = STATUS_NOT_A_DIRECTORY; return 0; @@ -189,7 +188,7 @@ BOOLEAN MemfsFileNodeMapHasChild(MEMFS_FILE_NODE_MAP *FileNodeMap, MEMFS_FILE_NO } static NTSTATUS GetSecurity(FSP_FILE_SYSTEM *FileSystem, - PWSTR FileName, PDWORD PFileAttributes, + PWSTR FileName, PUINT32 PFileAttributes, PSECURITY_DESCRIPTOR SecurityDescriptor, SIZE_T *PSecurityDescriptorSize) { MEMFS *Memfs = (MEMFS *)FileSystem->UserContext; @@ -205,7 +204,7 @@ static NTSTATUS GetSecurity(FSP_FILE_SYSTEM *FileSystem, } if (0 != PFileAttributes) - *PFileAttributes = FileNode->NodeInfo.FileAttributes; + *PFileAttributes = FileNode->FileInfo.FileAttributes; if (0 != PSecurityDescriptorSize) { @@ -225,9 +224,9 @@ static NTSTATUS GetSecurity(FSP_FILE_SYSTEM *FileSystem, static NTSTATUS Create(FSP_FILE_SYSTEM *FileSystem, FSP_FSCTL_TRANSACT_REQ *Request, - PWSTR FileName, BOOLEAN CaseSensitive, DWORD CreateOptions, - DWORD FileAttributes, PSECURITY_DESCRIPTOR SecurityDescriptor, UINT64 AllocationSize, - FSP_FILE_NODE_INFO *NodeInfo) + PWSTR FileName, BOOLEAN CaseSensitive, UINT32 CreateOptions, + UINT32 FileAttributes, PSECURITY_DESCRIPTOR SecurityDescriptor, UINT64 AllocationSize, + PVOID *PFileNode, FSP_FSCTL_FILE_INFO *FileInfo) { MEMFS *Memfs = (MEMFS *)FileSystem->UserContext; MEMFS_FILE_NODE *FileNode; @@ -254,7 +253,7 @@ static NTSTATUS Create(FSP_FILE_SYSTEM *FileSystem, if (!NT_SUCCESS(Result)) return Result; - FileNode->NodeInfo.FileAttributes = FileAttributes; + FileNode->FileInfo.FileAttributes = FileAttributes; if (0 != SecurityDescriptor) { @@ -268,10 +267,10 @@ static NTSTATUS Create(FSP_FILE_SYSTEM *FileSystem, memcpy(FileNode->FileSecurity, SecurityDescriptor, FileNode->FileSecuritySize); } - FileNode->NodeInfo.AllocationSize = FSP_FSCTL_ALIGN_UP((ULONG)AllocationSize, MEMFS_SECTOR_SIZE); - if (0 != FileNode->NodeInfo.AllocationSize) + FileNode->FileInfo.AllocationSize = FSP_FSCTL_ALIGN_UP((ULONG)AllocationSize, MEMFS_SECTOR_SIZE); + if (0 != FileNode->FileInfo.AllocationSize) { - FileNode->FileData = malloc(FileNode->NodeInfo.AllocationSize); + FileNode->FileData = malloc(FileNode->FileInfo.AllocationSize); if (0 == FileNode->FileData) { MemfsFileNodeDelete(FileNode); @@ -289,15 +288,16 @@ static NTSTATUS Create(FSP_FILE_SYSTEM *FileSystem, } FileNode->RefCount++; - *NodeInfo = FileNode->NodeInfo; + *PFileNode = FileNode; + *FileInfo = FileNode->FileInfo; return STATUS_SUCCESS; } static NTSTATUS Open(FSP_FILE_SYSTEM *FileSystem, FSP_FSCTL_TRANSACT_REQ *Request, - PWSTR FileName, BOOLEAN CaseSensitive, DWORD CreateOptions, - FSP_FILE_NODE_INFO *NodeInfo) + PWSTR FileName, BOOLEAN CaseSensitive, UINT32 CreateOptions, + PVOID *PFileNode, FSP_FSCTL_FILE_INFO *FileInfo) { MEMFS *Memfs = (MEMFS *)FileSystem->UserContext; MEMFS_FILE_NODE *FileNode; @@ -311,33 +311,33 @@ static NTSTATUS Open(FSP_FILE_SYSTEM *FileSystem, return Result; } - FileNode->NodeInfo.LastAccessTime = MemfsGetSystemTime(); + FileNode->FileInfo.LastAccessTime = MemfsGetSystemTime(); FileNode->RefCount++; - *NodeInfo = FileNode->NodeInfo; + *PFileNode = FileNode; + *FileInfo = FileNode->FileInfo; return STATUS_SUCCESS; } -static NTSTATUS Overwrite(FSP_FILE_SYSTEM *FileSystem, +NTSTATUS Overwrite(FSP_FILE_SYSTEM *FileSystem, FSP_FSCTL_TRANSACT_REQ *Request, - PVOID FileNode0, DWORD FileAttributes, BOOLEAN ReplaceFileAttributes, - FSP_FILE_SIZE_INFO *SizeInfo) + PVOID FileNode0, UINT32 FileAttributes, BOOLEAN ReplaceFileAttributes, + FSP_FSCTL_FILE_INFO *FileInfo) { MEMFS *Memfs = (MEMFS *)FileSystem->UserContext; MEMFS_FILE_NODE *FileNode = (MEMFS_FILE_NODE *)FileNode0; if (ReplaceFileAttributes) - FileNode->NodeInfo.FileAttributes = FileAttributes; + FileNode->FileInfo.FileAttributes = FileAttributes; else - FileNode->NodeInfo.FileAttributes |= FileAttributes; + FileNode->FileInfo.FileAttributes |= FileAttributes; - FileNode->NodeInfo.FileSize = 0; - FileNode->NodeInfo.LastWriteTime = - FileNode->NodeInfo.LastAccessTime = MemfsGetSystemTime(); + FileNode->FileInfo.FileSize = 0; + FileNode->FileInfo.LastWriteTime = + FileNode->FileInfo.LastAccessTime = MemfsGetSystemTime(); - SizeInfo->AllocationSize = FileNode->NodeInfo.AllocationSize; - SizeInfo->FileSize = FileNode->NodeInfo.FileSize; + *FileInfo = FileNode->FileInfo; return STATUS_SUCCESS; } @@ -446,7 +446,7 @@ NTSTATUS MemfsCreate(ULONG Flags, ULONG MaxFileNodes, ULONG MaxFileSize, return Result; } - RootNode->NodeInfo.FileAttributes = FILE_ATTRIBUTE_DIRECTORY; + RootNode->FileInfo.FileAttributes = FILE_ATTRIBUTE_DIRECTORY; Result = MemfsFileNodeMapInsert(Memfs->FileNodeMap, RootNode, &Inserted); if (!NT_SUCCESS(Result))