mirror of
				https://github.com/winfsp/winfsp.git
				synced 2025-10-30 19:48:38 -05:00 
			
		
		
		
	fsctl: FSP_FSCTL_FILE_INFO and related changes
This commit is contained in:
		| @@ -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_REQ_SIZEMAX  (4096 - 64) /* 64: size for internal request header */ | ||||||
| #define FSP_FSCTL_TRANSACT_RSP_SIZEMAX  (4096 - 64) /* symmetry! */ | #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 */ | /* marshalling */ | ||||||
| #pragma warning(push) | #pragma warning(push) | ||||||
| #pragma warning(disable:4200)           /* zero-sized array in struct/union */ | #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 UserContext;     /* user context associated with file node */ | ||||||
|                 UINT64 UserContext2;    /* user context associated with file descriptor (handle) */ |                 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.} */ |                 UINT32 GrantedAccess;   /* FILE_{READ_DATA,WRITE_DATA,etc.} */ | ||||||
|  |                 FSP_FSCTL_FILE_INFO FileInfo; | ||||||
|             } Opened; |             } Opened; | ||||||
|             /* IoStatus.Status == STATUS_REPARSE */ |             /* IoStatus.Status == STATUS_REPARSE */ | ||||||
|             struct |             struct | ||||||
| @@ -186,8 +191,7 @@ typedef struct | |||||||
|         } Create; |         } Create; | ||||||
|         struct |         struct | ||||||
|         { |         { | ||||||
|             UINT64 AllocationSize;      /* file allocation size */ |             FSP_FSCTL_FILE_INFO FileInfo; | ||||||
|             UINT64 FileSize;            /* file size */ |  | ||||||
|         } Overwrite; |         } Overwrite; | ||||||
|     } Rsp; |     } Rsp; | ||||||
|     FSP_FSCTL_DECLSPEC_ALIGN UINT8 Buffer[]; |     FSP_FSCTL_DECLSPEC_ALIGN UINT8 Buffer[]; | ||||||
|   | |||||||
| @@ -31,42 +31,24 @@ extern "C" { | |||||||
| typedef struct _FSP_FILE_SYSTEM FSP_FILE_SYSTEM; | typedef struct _FSP_FILE_SYSTEM FSP_FILE_SYSTEM; | ||||||
| typedef VOID FSP_FILE_SYSTEM_DISPATCHER(FSP_FILE_SYSTEM *, FSP_FSCTL_TRANSACT_REQ *); | 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 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 | typedef struct _FSP_FILE_SYSTEM_INTERFACE | ||||||
| { | { | ||||||
|     NTSTATUS (*GetSecurity)(FSP_FILE_SYSTEM *FileSystem, |     NTSTATUS (*GetSecurity)(FSP_FILE_SYSTEM *FileSystem, | ||||||
|         PWSTR FileName, PDWORD PFileAttributes, |         PWSTR FileName, PUINT32 PFileAttributes, | ||||||
|         PSECURITY_DESCRIPTOR SecurityDescriptor, SIZE_T *PSecurityDescriptorSize); |         PSECURITY_DESCRIPTOR SecurityDescriptor, SIZE_T *PSecurityDescriptorSize); | ||||||
|     NTSTATUS (*Create)(FSP_FILE_SYSTEM *FileSystem, |     NTSTATUS (*Create)(FSP_FILE_SYSTEM *FileSystem, | ||||||
|         FSP_FSCTL_TRANSACT_REQ *Request, |         FSP_FSCTL_TRANSACT_REQ *Request, | ||||||
|         PWSTR FileName, BOOLEAN CaseSensitive, DWORD CreateOptions, |         PWSTR FileName, BOOLEAN CaseSensitive, UINT32 CreateOptions, | ||||||
|         DWORD FileAttributes, PSECURITY_DESCRIPTOR SecurityDescriptor, UINT64 AllocationSize, |         UINT32 FileAttributes, PSECURITY_DESCRIPTOR SecurityDescriptor, UINT64 AllocationSize, | ||||||
|         FSP_FILE_NODE_INFO *NodeInfo); |         PVOID *PFileNode, FSP_FSCTL_FILE_INFO *FileInfo); | ||||||
|     NTSTATUS (*Open)(FSP_FILE_SYSTEM *FileSystem, |     NTSTATUS (*Open)(FSP_FILE_SYSTEM *FileSystem, | ||||||
|         FSP_FSCTL_TRANSACT_REQ *Request, |         FSP_FSCTL_TRANSACT_REQ *Request, | ||||||
|         PWSTR FileName, BOOLEAN CaseSensitive, DWORD CreateOptions, |         PWSTR FileName, BOOLEAN CaseSensitive, UINT32 CreateOptions, | ||||||
|         FSP_FILE_NODE_INFO *NodeInfo); |         PVOID *PFileNode, FSP_FSCTL_FILE_INFO *FileInfo); | ||||||
|     NTSTATUS (*Overwrite)(FSP_FILE_SYSTEM *FileSystem, |     NTSTATUS (*Overwrite)(FSP_FILE_SYSTEM *FileSystem, | ||||||
|         FSP_FSCTL_TRANSACT_REQ *Request, |         FSP_FSCTL_TRANSACT_REQ *Request, | ||||||
|         PVOID FileNode, DWORD FileAttributes, BOOLEAN ReplaceFileAttributes, |         PVOID FileNode, UINT32 FileAttributes, BOOLEAN ReplaceFileAttributes, | ||||||
|         FSP_FILE_SIZE_INFO *SizeInfo); |         FSP_FSCTL_FILE_INFO *FileInfo); | ||||||
|     VOID (*Cleanup)(FSP_FILE_SYSTEM *FileSystem, |     VOID (*Cleanup)(FSP_FILE_SYSTEM *FileSystem, | ||||||
|         FSP_FSCTL_TRANSACT_REQ *Request, |         FSP_FSCTL_TRANSACT_REQ *Request, | ||||||
|         PVOID FileNode, BOOLEAN Delete); |         PVOID FileNode, BOOLEAN Delete); | ||||||
| @@ -160,7 +142,7 @@ FSP_API PGENERIC_MAPPING FspGetFileGenericMapping(VOID); | |||||||
| FSP_API NTSTATUS FspAccessCheckEx(FSP_FILE_SYSTEM *FileSystem, | FSP_API NTSTATUS FspAccessCheckEx(FSP_FILE_SYSTEM *FileSystem, | ||||||
|     FSP_FSCTL_TRANSACT_REQ *Request, |     FSP_FSCTL_TRANSACT_REQ *Request, | ||||||
|     BOOLEAN CheckParentDirectory, BOOLEAN AllowTraverseCheck, |     BOOLEAN CheckParentDirectory, BOOLEAN AllowTraverseCheck, | ||||||
|     DWORD DesiredAccess, PDWORD PGrantedAccess, |     UINT32 DesiredAccess, PUINT32 PGrantedAccess, | ||||||
|     PSECURITY_DESCRIPTOR *PSecurityDescriptor); |     PSECURITY_DESCRIPTOR *PSecurityDescriptor); | ||||||
| FSP_API NTSTATUS FspAssignSecurity(FSP_FILE_SYSTEM *FileSystem, | FSP_API NTSTATUS FspAssignSecurity(FSP_FILE_SYSTEM *FileSystem, | ||||||
|     FSP_FSCTL_TRANSACT_REQ *Request, |     FSP_FSCTL_TRANSACT_REQ *Request, | ||||||
| @@ -178,10 +160,10 @@ FSP_API NTSTATUS FspFileSystemOpClose(FSP_FILE_SYSTEM *FileSystem, | |||||||
|     FSP_FSCTL_TRANSACT_REQ *Request); |     FSP_FSCTL_TRANSACT_REQ *Request); | ||||||
| FSP_API NTSTATUS FspFileSystemSendCreateResponse(FSP_FILE_SYSTEM *FileSystem, | FSP_API NTSTATUS FspFileSystemSendCreateResponse(FSP_FILE_SYSTEM *FileSystem, | ||||||
|     FSP_FSCTL_TRANSACT_REQ *Request, UINT_PTR Information, |     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_API NTSTATUS FspFileSystemSendOverwriteResponse(FSP_FILE_SYSTEM *FileSystem, | ||||||
|     FSP_FSCTL_TRANSACT_REQ *Request, |     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_API NTSTATUS FspFileSystemSendCleanupResponse(FSP_FILE_SYSTEM *FileSystem, | ||||||
|     FSP_FSCTL_TRANSACT_REQ *Request); |     FSP_FSCTL_TRANSACT_REQ *Request); | ||||||
| FSP_API NTSTATUS FspFileSystemSendCloseResponse(FSP_FILE_SYSTEM *FileSystem, | FSP_API NTSTATUS FspFileSystemSendCloseResponse(FSP_FILE_SYSTEM *FileSystem, | ||||||
| @@ -191,7 +173,7 @@ static inline | |||||||
| NTSTATUS FspAccessCheck(FSP_FILE_SYSTEM *FileSystem, | NTSTATUS FspAccessCheck(FSP_FILE_SYSTEM *FileSystem, | ||||||
|     FSP_FSCTL_TRANSACT_REQ *Request, |     FSP_FSCTL_TRANSACT_REQ *Request, | ||||||
|     BOOLEAN CheckParentDirectory, BOOLEAN AllowTraverseCheck, |     BOOLEAN CheckParentDirectory, BOOLEAN AllowTraverseCheck, | ||||||
|     DWORD DesiredAccess, PDWORD PGrantedAccess) |     UINT32 DesiredAccess, PUINT32 PGrantedAccess) | ||||||
| { | { | ||||||
|     return FspAccessCheckEx(FileSystem, Request, |     return FspAccessCheckEx(FileSystem, Request, | ||||||
|         CheckParentDirectory, AllowTraverseCheck, |         CheckParentDirectory, AllowTraverseCheck, | ||||||
|   | |||||||
| @@ -20,7 +20,7 @@ FSP_API PGENERIC_MAPPING FspGetFileGenericMapping(VOID) | |||||||
| } | } | ||||||
|  |  | ||||||
| static NTSTATUS FspGetSecurity(FSP_FILE_SYSTEM *FileSystem, | static NTSTATUS FspGetSecurity(FSP_FILE_SYSTEM *FileSystem, | ||||||
|     PWSTR FileName, PDWORD PFileAttributes, |     PWSTR FileName, PUINT32 PFileAttributes, | ||||||
|     PSECURITY_DESCRIPTOR *PSecurityDescriptor, SIZE_T *PSecurityDescriptorSize) |     PSECURITY_DESCRIPTOR *PSecurityDescriptor, SIZE_T *PSecurityDescriptorSize) | ||||||
| { | { | ||||||
|     for (;;) |     for (;;) | ||||||
| @@ -40,7 +40,7 @@ static NTSTATUS FspGetSecurity(FSP_FILE_SYSTEM *FileSystem, | |||||||
| FSP_API NTSTATUS FspAccessCheckEx(FSP_FILE_SYSTEM *FileSystem, | FSP_API NTSTATUS FspAccessCheckEx(FSP_FILE_SYSTEM *FileSystem, | ||||||
|     FSP_FSCTL_TRANSACT_REQ *Request, |     FSP_FSCTL_TRANSACT_REQ *Request, | ||||||
|     BOOLEAN CheckParentDirectory, BOOLEAN AllowTraverseCheck, |     BOOLEAN CheckParentDirectory, BOOLEAN AllowTraverseCheck, | ||||||
|     DWORD DesiredAccess, PDWORD PGrantedAccess, |     UINT32 DesiredAccess, PUINT32 PGrantedAccess, | ||||||
|     PSECURITY_DESCRIPTOR *PSecurityDescriptor) |     PSECURITY_DESCRIPTOR *PSecurityDescriptor) | ||||||
| { | { | ||||||
|     *PGrantedAccess = 0; |     *PGrantedAccess = 0; | ||||||
| @@ -57,13 +57,13 @@ FSP_API NTSTATUS FspAccessCheckEx(FSP_FILE_SYSTEM *FileSystem, | |||||||
|  |  | ||||||
|     NTSTATUS Result; |     NTSTATUS Result; | ||||||
|     PWSTR Parent, Suffix, Prefix, Remain; |     PWSTR Parent, Suffix, Prefix, Remain; | ||||||
|     DWORD FileAttributes; |     UINT32 FileAttributes; | ||||||
|     PSECURITY_DESCRIPTOR SecurityDescriptor = 0; |     PSECURITY_DESCRIPTOR SecurityDescriptor = 0; | ||||||
|     SIZE_T SecurityDescriptorSize; |     SIZE_T SecurityDescriptorSize; | ||||||
|     UINT8 PrivilegeSetBuf[sizeof(PRIVILEGE_SET) + 15 * sizeof(LUID_AND_ATTRIBUTES)]; |     UINT8 PrivilegeSetBuf[sizeof(PRIVILEGE_SET) + 15 * sizeof(LUID_AND_ATTRIBUTES)]; | ||||||
|     PPRIVILEGE_SET PrivilegeSet = (PVOID)PrivilegeSetBuf; |     PPRIVILEGE_SET PrivilegeSet = (PVOID)PrivilegeSetBuf; | ||||||
|     DWORD PrivilegeSetLength = sizeof PrivilegeSetBuf; |     DWORD PrivilegeSetLength = sizeof PrivilegeSetBuf; | ||||||
|     DWORD TraverseAccess; |     UINT32 TraverseAccess; | ||||||
|     BOOL AccessStatus; |     BOOL AccessStatus; | ||||||
|  |  | ||||||
|     if (CheckParentDirectory) |     if (CheckParentDirectory) | ||||||
| @@ -234,7 +234,7 @@ FSP_API VOID FspDeleteSecurityDescriptor(PSECURITY_DESCRIPTOR SecurityDescriptor | |||||||
| static inline | static inline | ||||||
| NTSTATUS FspFileSystemCreateCheck(FSP_FILE_SYSTEM *FileSystem, | NTSTATUS FspFileSystemCreateCheck(FSP_FILE_SYSTEM *FileSystem, | ||||||
|     FSP_FSCTL_TRANSACT_REQ *Request, |     FSP_FSCTL_TRANSACT_REQ *Request, | ||||||
|     BOOLEAN AllowTraverseCheck, PDWORD PGrantedAccess, |     BOOLEAN AllowTraverseCheck, PUINT32 PGrantedAccess, | ||||||
|     PSECURITY_DESCRIPTOR *PSecurityDescriptor) |     PSECURITY_DESCRIPTOR *PSecurityDescriptor) | ||||||
| { | { | ||||||
|     NTSTATUS Result; |     NTSTATUS Result; | ||||||
| @@ -255,7 +255,7 @@ NTSTATUS FspFileSystemCreateCheck(FSP_FILE_SYSTEM *FileSystem, | |||||||
| static inline | static inline | ||||||
| NTSTATUS FspFileSystemOpenCheck(FSP_FILE_SYSTEM *FileSystem, | NTSTATUS FspFileSystemOpenCheck(FSP_FILE_SYSTEM *FileSystem, | ||||||
|     FSP_FSCTL_TRANSACT_REQ *Request, |     FSP_FSCTL_TRANSACT_REQ *Request, | ||||||
|     BOOLEAN AllowTraverseCheck, PDWORD PGrantedAccess) |     BOOLEAN AllowTraverseCheck, PUINT32 PGrantedAccess) | ||||||
| { | { | ||||||
|     NTSTATUS Result; |     NTSTATUS Result; | ||||||
|  |  | ||||||
| @@ -275,7 +275,7 @@ NTSTATUS FspFileSystemOpenCheck(FSP_FILE_SYSTEM *FileSystem, | |||||||
| static inline | static inline | ||||||
| NTSTATUS FspFileSystemOverwriteCheck(FSP_FILE_SYSTEM *FileSystem, | NTSTATUS FspFileSystemOverwriteCheck(FSP_FILE_SYSTEM *FileSystem, | ||||||
|     FSP_FSCTL_TRANSACT_REQ *Request, |     FSP_FSCTL_TRANSACT_REQ *Request, | ||||||
|     BOOLEAN AllowTraverseCheck, PDWORD PGrantedAccess) |     BOOLEAN AllowTraverseCheck, PUINT32 PGrantedAccess) | ||||||
| { | { | ||||||
|     NTSTATUS Result; |     NTSTATUS Result; | ||||||
|     BOOLEAN Supersede = FILE_SUPERSEDE == ((Request->Req.Create.CreateOptions >> 24) & 0xff); |     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) |     FSP_FSCTL_TRANSACT_REQ *Request) | ||||||
| { | { | ||||||
|     NTSTATUS Result; |     NTSTATUS Result; | ||||||
|     DWORD GrantedAccess; |     UINT32 GrantedAccess; | ||||||
|     PSECURITY_DESCRIPTOR ParentDescriptor, ObjectDescriptor; |     PSECURITY_DESCRIPTOR ParentDescriptor, ObjectDescriptor; | ||||||
|     FSP_FILE_NODE_INFO NodeInfo; |     PVOID FileNode; | ||||||
|  |     FSP_FSCTL_FILE_INFO FileInfo; | ||||||
|  |  | ||||||
|     Result = FspFileSystemCreateCheck(FileSystem, Request, TRUE, &GrantedAccess, &ParentDescriptor); |     Result = FspFileSystemCreateCheck(FileSystem, Request, TRUE, &GrantedAccess, &ParentDescriptor); | ||||||
|     if (!NT_SUCCESS(Result)) |     if (!NT_SUCCESS(Result)) | ||||||
| @@ -315,21 +316,22 @@ static NTSTATUS FspFileSystemOpCreate_FileCreate(FSP_FILE_SYSTEM *FileSystem, | |||||||
|     Result = FileSystem->Interface->Create(FileSystem, Request, |     Result = FileSystem->Interface->Create(FileSystem, Request, | ||||||
|         (PWSTR)Request->Buffer, Request->Req.Create.CaseSensitive, Request->Req.Create.CreateOptions, |         (PWSTR)Request->Buffer, Request->Req.Create.CaseSensitive, Request->Req.Create.CreateOptions, | ||||||
|         Request->Req.Create.FileAttributes, ObjectDescriptor, Request->Req.Create.AllocationSize, |         Request->Req.Create.FileAttributes, ObjectDescriptor, Request->Req.Create.AllocationSize, | ||||||
|         &NodeInfo); |         &FileNode, &FileInfo); | ||||||
|     FspDeleteSecurityDescriptor(ObjectDescriptor, FspAssignSecurity); |     FspDeleteSecurityDescriptor(ObjectDescriptor, FspAssignSecurity); | ||||||
|     if (!NT_SUCCESS(Result)) |     if (!NT_SUCCESS(Result)) | ||||||
|         return FspFileSystemSendResponseWithStatus(FileSystem, Request, Result); |         return FspFileSystemSendResponseWithStatus(FileSystem, Request, Result); | ||||||
|  |  | ||||||
|     return FspFileSystemSendCreateResponse(FileSystem, Request, |     return FspFileSystemSendCreateResponse(FileSystem, Request, | ||||||
|         FILE_CREATED, &NodeInfo, GrantedAccess); |         FILE_CREATED, FileNode, GrantedAccess, &FileInfo); | ||||||
| } | } | ||||||
|  |  | ||||||
| static NTSTATUS FspFileSystemOpCreate_FileOpen(FSP_FILE_SYSTEM *FileSystem, | static NTSTATUS FspFileSystemOpCreate_FileOpen(FSP_FILE_SYSTEM *FileSystem, | ||||||
|     FSP_FSCTL_TRANSACT_REQ *Request) |     FSP_FSCTL_TRANSACT_REQ *Request) | ||||||
| { | { | ||||||
|     NTSTATUS Result; |     NTSTATUS Result; | ||||||
|     DWORD GrantedAccess; |     UINT32 GrantedAccess; | ||||||
|     FSP_FILE_NODE_INFO NodeInfo; |     PVOID FileNode; | ||||||
|  |     FSP_FSCTL_FILE_INFO FileInfo; | ||||||
|  |  | ||||||
|     Result = FspFileSystemOpenCheck(FileSystem, Request, TRUE, &GrantedAccess); |     Result = FspFileSystemOpenCheck(FileSystem, Request, TRUE, &GrantedAccess); | ||||||
|     if (!NT_SUCCESS(Result)) |     if (!NT_SUCCESS(Result)) | ||||||
| @@ -337,21 +339,22 @@ static NTSTATUS FspFileSystemOpCreate_FileOpen(FSP_FILE_SYSTEM *FileSystem, | |||||||
|  |  | ||||||
|     Result = FileSystem->Interface->Open(FileSystem, Request, |     Result = FileSystem->Interface->Open(FileSystem, Request, | ||||||
|         (PWSTR)Request->Buffer, Request->Req.Create.CaseSensitive, Request->Req.Create.CreateOptions, |         (PWSTR)Request->Buffer, Request->Req.Create.CaseSensitive, Request->Req.Create.CreateOptions, | ||||||
|         &NodeInfo); |         &FileNode, &FileInfo); | ||||||
|     if (!NT_SUCCESS(Result)) |     if (!NT_SUCCESS(Result)) | ||||||
|         return FspFileSystemSendResponseWithStatus(FileSystem, Request, Result); |         return FspFileSystemSendResponseWithStatus(FileSystem, Request, Result); | ||||||
|  |  | ||||||
|     return FspFileSystemSendCreateResponse(FileSystem, Request, |     return FspFileSystemSendCreateResponse(FileSystem, Request, | ||||||
|         FILE_OPENED, &NodeInfo, GrantedAccess); |         FILE_OPENED, FileNode, GrantedAccess, &FileInfo); | ||||||
| } | } | ||||||
|  |  | ||||||
| static NTSTATUS FspFileSystemOpCreate_FileOpenIf(FSP_FILE_SYSTEM *FileSystem, | static NTSTATUS FspFileSystemOpCreate_FileOpenIf(FSP_FILE_SYSTEM *FileSystem, | ||||||
|     FSP_FSCTL_TRANSACT_REQ *Request) |     FSP_FSCTL_TRANSACT_REQ *Request) | ||||||
| { | { | ||||||
|     NTSTATUS Result; |     NTSTATUS Result; | ||||||
|     DWORD GrantedAccess; |     UINT32 GrantedAccess; | ||||||
|     PSECURITY_DESCRIPTOR ParentDescriptor, ObjectDescriptor; |     PSECURITY_DESCRIPTOR ParentDescriptor, ObjectDescriptor; | ||||||
|     FSP_FILE_NODE_INFO NodeInfo; |     PVOID FileNode; | ||||||
|  |     FSP_FSCTL_FILE_INFO FileInfo; | ||||||
|     BOOLEAN Create = FALSE; |     BOOLEAN Create = FALSE; | ||||||
|  |  | ||||||
|     Result = FspFileSystemOpenCheck(FileSystem, Request, TRUE, &GrantedAccess); |     Result = FspFileSystemOpenCheck(FileSystem, Request, TRUE, &GrantedAccess); | ||||||
| @@ -366,7 +369,7 @@ static NTSTATUS FspFileSystemOpCreate_FileOpenIf(FSP_FILE_SYSTEM *FileSystem, | |||||||
|     { |     { | ||||||
|         Result = FileSystem->Interface->Open(FileSystem, Request, |         Result = FileSystem->Interface->Open(FileSystem, Request, | ||||||
|             (PWSTR)Request->Buffer, Request->Req.Create.CaseSensitive, Request->Req.Create.CreateOptions, |             (PWSTR)Request->Buffer, Request->Req.Create.CaseSensitive, Request->Req.Create.CreateOptions, | ||||||
|             &NodeInfo); |             &FileNode, &FileInfo); | ||||||
|         if (!NT_SUCCESS(Result)) |         if (!NT_SUCCESS(Result)) | ||||||
|         { |         { | ||||||
|             if (STATUS_OBJECT_NAME_NOT_FOUND != 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, |         Result = FileSystem->Interface->Create(FileSystem, Request, | ||||||
|             (PWSTR)Request->Buffer, Request->Req.Create.CaseSensitive, Request->Req.Create.CreateOptions, |             (PWSTR)Request->Buffer, Request->Req.Create.CaseSensitive, Request->Req.Create.CreateOptions, | ||||||
|             Request->Req.Create.FileAttributes, ObjectDescriptor, Request->Req.Create.AllocationSize, |             Request->Req.Create.FileAttributes, ObjectDescriptor, Request->Req.Create.AllocationSize, | ||||||
|             &NodeInfo); |             &FileNode, &FileInfo); | ||||||
|         FspDeleteSecurityDescriptor(ObjectDescriptor, FspAssignSecurity); |         FspDeleteSecurityDescriptor(ObjectDescriptor, FspAssignSecurity); | ||||||
|         if (!NT_SUCCESS(Result)) |         if (!NT_SUCCESS(Result)) | ||||||
|             return FspFileSystemSendResponseWithStatus(FileSystem, Request, Result); |             return FspFileSystemSendResponseWithStatus(FileSystem, Request, Result); | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     return FspFileSystemSendCreateResponse(FileSystem, Request, |     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, | static NTSTATUS FspFileSystemOpCreate_FileOverwrite(FSP_FILE_SYSTEM *FileSystem, | ||||||
|     FSP_FSCTL_TRANSACT_REQ *Request) |     FSP_FSCTL_TRANSACT_REQ *Request) | ||||||
| { | { | ||||||
|     NTSTATUS Result; |     NTSTATUS Result; | ||||||
|     DWORD GrantedAccess; |     UINT32 GrantedAccess; | ||||||
|     FSP_FILE_NODE_INFO NodeInfo; |     PVOID FileNode; | ||||||
|  |     FSP_FSCTL_FILE_INFO FileInfo; | ||||||
|     BOOLEAN Supersede = FILE_SUPERSEDE == ((Request->Req.Create.CreateOptions >> 24) & 0xff); |     BOOLEAN Supersede = FILE_SUPERSEDE == ((Request->Req.Create.CreateOptions >> 24) & 0xff); | ||||||
|  |  | ||||||
|     Result = FspFileSystemOverwriteCheck(FileSystem, Request, TRUE, &GrantedAccess); |     Result = FspFileSystemOverwriteCheck(FileSystem, Request, TRUE, &GrantedAccess); | ||||||
| @@ -413,21 +417,22 @@ static NTSTATUS FspFileSystemOpCreate_FileOverwrite(FSP_FILE_SYSTEM *FileSystem, | |||||||
|  |  | ||||||
|     Result = FileSystem->Interface->Open(FileSystem, Request, |     Result = FileSystem->Interface->Open(FileSystem, Request, | ||||||
|         (PWSTR)Request->Buffer, Request->Req.Create.CaseSensitive, Request->Req.Create.CreateOptions, |         (PWSTR)Request->Buffer, Request->Req.Create.CaseSensitive, Request->Req.Create.CreateOptions, | ||||||
|         &NodeInfo); |         &FileNode, &FileInfo); | ||||||
|     if (!NT_SUCCESS(Result)) |     if (!NT_SUCCESS(Result)) | ||||||
|         return FspFileSystemSendResponseWithStatus(FileSystem, Request, Result); |         return FspFileSystemSendResponseWithStatus(FileSystem, Request, Result); | ||||||
|  |  | ||||||
|     return FspFileSystemSendCreateResponse(FileSystem, Request, |     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, | static NTSTATUS FspFileSystemOpCreate_FileOverwriteIf(FSP_FILE_SYSTEM *FileSystem, | ||||||
|     FSP_FSCTL_TRANSACT_REQ *Request) |     FSP_FSCTL_TRANSACT_REQ *Request) | ||||||
| { | { | ||||||
|     NTSTATUS Result; |     NTSTATUS Result; | ||||||
|     DWORD GrantedAccess; |     UINT32 GrantedAccess; | ||||||
|     PSECURITY_DESCRIPTOR ParentDescriptor, ObjectDescriptor; |     PSECURITY_DESCRIPTOR ParentDescriptor, ObjectDescriptor; | ||||||
|     FSP_FILE_NODE_INFO NodeInfo; |     PVOID FileNode; | ||||||
|  |     FSP_FSCTL_FILE_INFO FileInfo; | ||||||
|     BOOLEAN Create = FALSE; |     BOOLEAN Create = FALSE; | ||||||
|  |  | ||||||
|     Result = FspFileSystemOverwriteCheck(FileSystem, Request, TRUE, &GrantedAccess); |     Result = FspFileSystemOverwriteCheck(FileSystem, Request, TRUE, &GrantedAccess); | ||||||
| @@ -442,7 +447,7 @@ static NTSTATUS FspFileSystemOpCreate_FileOverwriteIf(FSP_FILE_SYSTEM *FileSyste | |||||||
|     { |     { | ||||||
|         Result = FileSystem->Interface->Open(FileSystem, Request, |         Result = FileSystem->Interface->Open(FileSystem, Request, | ||||||
|             (PWSTR)Request->Buffer, Request->Req.Create.CaseSensitive, Request->Req.Create.CreateOptions, |             (PWSTR)Request->Buffer, Request->Req.Create.CaseSensitive, Request->Req.Create.CreateOptions, | ||||||
|             &NodeInfo); |             &FileNode, &FileInfo); | ||||||
|         if (!NT_SUCCESS(Result)) |         if (!NT_SUCCESS(Result)) | ||||||
|         { |         { | ||||||
|             if (STATUS_OBJECT_NAME_NOT_FOUND != 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, |         Result = FileSystem->Interface->Create(FileSystem, Request, | ||||||
|             (PWSTR)Request->Buffer, Request->Req.Create.CaseSensitive, Request->Req.Create.CreateOptions, |             (PWSTR)Request->Buffer, Request->Req.Create.CaseSensitive, Request->Req.Create.CreateOptions, | ||||||
|             Request->Req.Create.FileAttributes, ObjectDescriptor, Request->Req.Create.AllocationSize, |             Request->Req.Create.FileAttributes, ObjectDescriptor, Request->Req.Create.AllocationSize, | ||||||
|             &NodeInfo); |             &FileNode, &FileInfo); | ||||||
|         FspDeleteSecurityDescriptor(ObjectDescriptor, FspAssignSecurity); |         FspDeleteSecurityDescriptor(ObjectDescriptor, FspAssignSecurity); | ||||||
|         if (!NT_SUCCESS(Result)) |         if (!NT_SUCCESS(Result)) | ||||||
|             return FspFileSystemSendResponseWithStatus(FileSystem, Request, Result); |             return FspFileSystemSendResponseWithStatus(FileSystem, Request, Result); | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     return FspFileSystemSendCreateResponse(FileSystem, Request, |     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, | static NTSTATUS FspFileSystemOpCreate_FileOpenTargetDirectory(FSP_FILE_SYSTEM *FileSystem, | ||||||
| @@ -480,8 +485,9 @@ static NTSTATUS FspFileSystemOpCreate_FileOpenTargetDirectory(FSP_FILE_SYSTEM *F | |||||||
| { | { | ||||||
|     NTSTATUS Result; |     NTSTATUS Result; | ||||||
|     PWSTR Parent, Suffix; |     PWSTR Parent, Suffix; | ||||||
|     DWORD GrantedAccess; |     UINT32 GrantedAccess; | ||||||
|     FSP_FILE_NODE_INFO NodeInfo; |     PVOID FileNode; | ||||||
|  |     FSP_FSCTL_FILE_INFO FileInfo; | ||||||
|     UINT_PTR Information; |     UINT_PTR Information; | ||||||
|  |  | ||||||
|     Result = FspAccessCheck(FileSystem, Request, TRUE, TRUE, |     Result = FspAccessCheck(FileSystem, Request, TRUE, TRUE, | ||||||
| @@ -492,7 +498,7 @@ static NTSTATUS FspFileSystemOpCreate_FileOpenTargetDirectory(FSP_FILE_SYSTEM *F | |||||||
|     FspPathSuffix((PWSTR)Request->Buffer, &Parent, &Suffix); |     FspPathSuffix((PWSTR)Request->Buffer, &Parent, &Suffix); | ||||||
|     Result = FileSystem->Interface->Open(FileSystem, Request, |     Result = FileSystem->Interface->Open(FileSystem, Request, | ||||||
|         (PWSTR)Request->Buffer, Request->Req.Create.CaseSensitive, Request->Req.Create.CreateOptions, |         (PWSTR)Request->Buffer, Request->Req.Create.CaseSensitive, Request->Req.Create.CreateOptions, | ||||||
|         &NodeInfo); |         &FileNode, &FileInfo); | ||||||
|     FspPathCombine((PWSTR)Request->Buffer, Suffix); |     FspPathCombine((PWSTR)Request->Buffer, Suffix); | ||||||
|     if (!NT_SUCCESS(Result)) |     if (!NT_SUCCESS(Result)) | ||||||
|         return FspFileSystemSendResponseWithStatus(FileSystem, Request, Result); |         return FspFileSystemSendResponseWithStatus(FileSystem, Request, Result); | ||||||
| @@ -505,7 +511,7 @@ static NTSTATUS FspFileSystemOpCreate_FileOpenTargetDirectory(FSP_FILE_SYSTEM *F | |||||||
|     } |     } | ||||||
|  |  | ||||||
|     return FspFileSystemSendCreateResponse(FileSystem, Request, |     return FspFileSystemSendCreateResponse(FileSystem, Request, | ||||||
|         Information, &NodeInfo, GrantedAccess); |         Information, FileNode, GrantedAccess, &FileInfo); | ||||||
| } | } | ||||||
|  |  | ||||||
| FSP_API NTSTATUS FspFileSystemOpCreate(FSP_FILE_SYSTEM *FileSystem, | 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) |     FSP_FSCTL_TRANSACT_REQ *Request) | ||||||
| { | { | ||||||
|     NTSTATUS Result; |     NTSTATUS Result; | ||||||
|     FSP_FILE_SIZE_INFO SizeInfo; |     FSP_FSCTL_FILE_INFO FileInfo; | ||||||
|  |  | ||||||
|     Result = FileSystem->Interface->Overwrite(FileSystem, Request, |     Result = FileSystem->Interface->Overwrite(FileSystem, Request, | ||||||
|         (PVOID)Request->Req.Overwrite.UserContext, |         (PVOID)Request->Req.Overwrite.UserContext, | ||||||
|         Request->Req.Overwrite.FileAttributes, |         Request->Req.Overwrite.FileAttributes, | ||||||
|         Request->Req.Overwrite.Supersede, |         Request->Req.Overwrite.Supersede, | ||||||
|         &SizeInfo); |         &FileInfo); | ||||||
|     if (!NT_SUCCESS(Result)) |     if (!NT_SUCCESS(Result)) | ||||||
|     { |     { | ||||||
|         if (0 != FileSystem->Interface->Close) |         if (0 != FileSystem->Interface->Close) | ||||||
| @@ -557,12 +563,12 @@ FSP_API NTSTATUS FspFileSystemOpOverwrite(FSP_FILE_SYSTEM *FileSystem, | |||||||
|         return FspFileSystemSendResponseWithStatus(FileSystem, Request, Result); |         return FspFileSystemSendResponseWithStatus(FileSystem, Request, Result); | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     return FspFileSystemSendOverwriteResponse(FileSystem, Request, &SizeInfo); |     return FspFileSystemSendOverwriteResponse(FileSystem, Request, &FileInfo); | ||||||
| } | } | ||||||
|  |  | ||||||
| FSP_API NTSTATUS FspFileSystemSendCreateResponse(FSP_FILE_SYSTEM *FileSystem, | FSP_API NTSTATUS FspFileSystemSendCreateResponse(FSP_FILE_SYSTEM *FileSystem, | ||||||
|     FSP_FSCTL_TRANSACT_REQ *Request, UINT_PTR Information, |     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; |     FSP_FSCTL_TRANSACT_RSP Response; | ||||||
|  |  | ||||||
| @@ -572,23 +578,15 @@ FSP_API NTSTATUS FspFileSystemSendCreateResponse(FSP_FILE_SYSTEM *FileSystem, | |||||||
|     Response.Hint = Request->Hint; |     Response.Hint = Request->Hint; | ||||||
|     Response.IoStatus.Status = STATUS_SUCCESS; |     Response.IoStatus.Status = STATUS_SUCCESS; | ||||||
|     Response.IoStatus.Information = Information; |     Response.IoStatus.Information = Information; | ||||||
|     Response.Rsp.Create.Opened.UserContext = (UINT_PTR)NodeInfo->FileNode; |     Response.Rsp.Create.Opened.UserContext = (UINT_PTR)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.GrantedAccess = GrantedAccess; |     Response.Rsp.Create.Opened.GrantedAccess = GrantedAccess; | ||||||
|  |     memcpy(&Response.Rsp.Create.Opened.FileInfo, FileInfo, sizeof *FileInfo); | ||||||
|     return FspFileSystemSendResponse(FileSystem, &Response); |     return FspFileSystemSendResponse(FileSystem, &Response); | ||||||
| } | } | ||||||
|  |  | ||||||
| FSP_API NTSTATUS FspFileSystemSendOverwriteResponse(FSP_FILE_SYSTEM *FileSystem, | FSP_API NTSTATUS FspFileSystemSendOverwriteResponse(FSP_FILE_SYSTEM *FileSystem, | ||||||
|     FSP_FSCTL_TRANSACT_REQ *Request, |     FSP_FSCTL_TRANSACT_REQ *Request, | ||||||
|     const FSP_FILE_SIZE_INFO *SizeInfo) |     const FSP_FSCTL_FILE_INFO *FileInfo) | ||||||
| { | { | ||||||
|     FSP_FSCTL_TRANSACT_RSP Response; |     FSP_FSCTL_TRANSACT_RSP Response; | ||||||
|  |  | ||||||
| @@ -598,7 +596,6 @@ FSP_API NTSTATUS FspFileSystemSendOverwriteResponse(FSP_FILE_SYSTEM *FileSystem, | |||||||
|     Response.Hint = Request->Hint; |     Response.Hint = Request->Hint; | ||||||
|     Response.IoStatus.Status = STATUS_SUCCESS; |     Response.IoStatus.Status = STATUS_SUCCESS; | ||||||
|     Response.IoStatus.Information = 0; |     Response.IoStatus.Information = 0; | ||||||
|     Response.Rsp.Overwrite.AllocationSize = SizeInfo->AllocationSize; |     memcpy(&Response.Rsp.Overwrite.FileInfo, FileInfo, sizeof *FileInfo); | ||||||
|     Response.Rsp.Overwrite.FileSize = SizeInfo->FileSize; |  | ||||||
|     return FspFileSystemSendResponse(FileSystem, &Response); |     return FspFileSystemSendResponse(FileSystem, &Response); | ||||||
| } | } | ||||||
|   | |||||||
| @@ -546,8 +546,8 @@ VOID FspFsvolCreateComplete( | |||||||
|         } |         } | ||||||
|  |  | ||||||
|         /* populate the FileNode/FileDesc fields from the Response */ |         /* populate the FileNode/FileDesc fields from the Response */ | ||||||
|         FileNode->Header.AllocationSize.QuadPart = Response->Rsp.Create.Opened.AllocationSize; |         FileNode->Header.AllocationSize.QuadPart = Response->Rsp.Create.Opened.FileInfo.AllocationSize; | ||||||
|         FileNode->Header.FileSize.QuadPart = Response->Rsp.Create.Opened.FileSize; |         FileNode->Header.FileSize.QuadPart = Response->Rsp.Create.Opened.FileInfo.FileSize; | ||||||
|         FileNode->UserContext = Response->Rsp.Create.Opened.UserContext; |         FileNode->UserContext = Response->Rsp.Create.Opened.UserContext; | ||||||
|         FileDesc->UserContext2 = Response->Rsp.Create.Opened.UserContext2; |         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 |              *     If the user wants to delete on close, we must check at this | ||||||
|              *     point though. |              *     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) || |                 (FlagOn(Response->Rsp.Create.Opened.GrantedAccess, FILE_WRITE_DATA) || | ||||||
|                 DeleteOnClose)) |                 DeleteOnClose)) | ||||||
|             { |             { | ||||||
| @@ -616,7 +616,7 @@ VOID FspFsvolCreateComplete( | |||||||
|  |  | ||||||
|             /* save the old Request FileAttributes and make them compatible with the open file */ |             /* save the old Request FileAttributes and make them compatible with the open file */ | ||||||
|             UINT32 FileAttributes = Request->Req.Create.FileAttributes; |             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); |                 SetFlag(FileAttributes, FILE_ATTRIBUTE_DIRECTORY); | ||||||
|             else |             else | ||||||
|                 ClearFlag(FileAttributes, FILE_ATTRIBUTE_DIRECTORY); |                 ClearFlag(FileAttributes, FILE_ATTRIBUTE_DIRECTORY); | ||||||
| @@ -677,8 +677,8 @@ VOID FspFsvolCreateComplete( | |||||||
|         } |         } | ||||||
|  |  | ||||||
|         /* file was successfully overwritten/superseded */ |         /* file was successfully overwritten/superseded */ | ||||||
|         FileNode->Header.AllocationSize.QuadPart = Response->Rsp.Overwrite.AllocationSize; |         FileNode->Header.AllocationSize.QuadPart = Response->Rsp.Overwrite.FileInfo.AllocationSize; | ||||||
|         FileNode->Header.FileSize.QuadPart = Response->Rsp.Overwrite.FileSize; |         FileNode->Header.FileSize.QuadPart = Response->Rsp.Overwrite.FileInfo.FileSize; | ||||||
|         CcSetFileSizes(FileObject, (PCC_FILE_SIZES)&FileNode->Header.AllocationSize); |         CcSetFileSizes(FileObject, (PCC_FILE_SIZES)&FileNode->Header.AllocationSize); | ||||||
|  |  | ||||||
|         FspFileNodeRelease(FileNode, Both); |         FspFileNodeRelease(FileNode, Both); | ||||||
|   | |||||||
| @@ -582,7 +582,7 @@ VOID FspFileNodeAcquireExclusive(FSP_FILE_NODE *FileNode, ULONG Flags); | |||||||
| BOOLEAN FspFileNodeTryAcquireExclusive(FSP_FILE_NODE *FileNode, ULONG Flags); | BOOLEAN FspFileNodeTryAcquireExclusive(FSP_FILE_NODE *FileNode, ULONG Flags); | ||||||
| VOID FspFileNodeRelease(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, | 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, | VOID FspFileNodeClose(FSP_FILE_NODE *FileNode, PFILE_OBJECT FileObject, | ||||||
|     PBOOLEAN PDeletePending); |     PBOOLEAN PDeletePending); | ||||||
| NTSTATUS FspFileDescCreate(FSP_FILE_DESC **PFileDesc); | NTSTATUS FspFileDescCreate(FSP_FILE_DESC **PFileDesc); | ||||||
|   | |||||||
| @@ -21,7 +21,7 @@ VOID FspFileNodeAcquireExclusive(FSP_FILE_NODE *FileNode, ULONG Flags); | |||||||
| BOOLEAN FspFileNodeTryAcquireExclusive(FSP_FILE_NODE *FileNode, ULONG Flags); | BOOLEAN FspFileNodeTryAcquireExclusive(FSP_FILE_NODE *FileNode, ULONG Flags); | ||||||
| VOID FspFileNodeRelease(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, | 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, | VOID FspFileNodeClose(FSP_FILE_NODE *FileNode, PFILE_OBJECT FileObject, | ||||||
|     PBOOLEAN PDeletePending); |     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, | 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. |      * Attempt to insert our FileNode into the volume device's generic table. | ||||||
|   | |||||||
| @@ -27,7 +27,7 @@ int MemfsFileNameCompare(PWSTR a, PWSTR b) | |||||||
| typedef struct _MEMFS_FILE_NODE | typedef struct _MEMFS_FILE_NODE | ||||||
| { | { | ||||||
|     WCHAR FileName[MAX_PATH]; |     WCHAR FileName[MAX_PATH]; | ||||||
|     FSP_FILE_NODE_INFO NodeInfo; |     FSP_FSCTL_FILE_INFO FileInfo; | ||||||
|     SIZE_T FileSecuritySize; |     SIZE_T FileSecuritySize; | ||||||
|     PVOID FileSecurity; |     PVOID FileSecurity; | ||||||
|     PVOID FileData; |     PVOID FileData; | ||||||
| @@ -69,12 +69,11 @@ NTSTATUS MemfsFileNodeCreate(PWSTR FileName, MEMFS_FILE_NODE **PFileNode) | |||||||
|  |  | ||||||
|     memset(FileNode, 0, sizeof *FileNode); |     memset(FileNode, 0, sizeof *FileNode); | ||||||
|     wcscpy_s(FileNode->FileName, sizeof FileNode->FileName / sizeof(WCHAR), FileName); |     wcscpy_s(FileNode->FileName, sizeof FileNode->FileName / sizeof(WCHAR), FileName); | ||||||
|     FileNode->NodeInfo.FileNode = FileNode; |     FileNode->FileInfo.CreationTime = | ||||||
|     FileNode->NodeInfo.CreationTime = |     FileNode->FileInfo.LastAccessTime = | ||||||
|     FileNode->NodeInfo.LastAccessTime = |     FileNode->FileInfo.LastWriteTime = | ||||||
|     FileNode->NodeInfo.LastWriteTime = |     FileNode->FileInfo.ChangeTime = MemfsGetSystemTime(); | ||||||
|     FileNode->NodeInfo.ChangeTime = MemfsGetSystemTime(); |     FileNode->FileInfo.IndexNumber = IndexNumber++; | ||||||
|     FileNode->NodeInfo.IndexNumber = IndexNumber++; |  | ||||||
|  |  | ||||||
|     *PFileNode = FileNode; |     *PFileNode = FileNode; | ||||||
|  |  | ||||||
| @@ -141,7 +140,7 @@ MEMFS_FILE_NODE *MemfsFileNodeMapGetParent(MEMFS_FILE_NODE_MAP *FileNodeMap, PWS | |||||||
|         *PResult = STATUS_OBJECT_PATH_NOT_FOUND; |         *PResult = STATUS_OBJECT_PATH_NOT_FOUND; | ||||||
|         return 0; |         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; |         *PResult = STATUS_NOT_A_DIRECTORY; | ||||||
|         return 0; |         return 0; | ||||||
| @@ -189,7 +188,7 @@ BOOLEAN MemfsFileNodeMapHasChild(MEMFS_FILE_NODE_MAP *FileNodeMap, MEMFS_FILE_NO | |||||||
| } | } | ||||||
|  |  | ||||||
| static NTSTATUS GetSecurity(FSP_FILE_SYSTEM *FileSystem, | static NTSTATUS GetSecurity(FSP_FILE_SYSTEM *FileSystem, | ||||||
|     PWSTR FileName, PDWORD PFileAttributes, |     PWSTR FileName, PUINT32 PFileAttributes, | ||||||
|     PSECURITY_DESCRIPTOR SecurityDescriptor, SIZE_T *PSecurityDescriptorSize) |     PSECURITY_DESCRIPTOR SecurityDescriptor, SIZE_T *PSecurityDescriptorSize) | ||||||
| { | { | ||||||
|     MEMFS *Memfs = (MEMFS *)FileSystem->UserContext; |     MEMFS *Memfs = (MEMFS *)FileSystem->UserContext; | ||||||
| @@ -205,7 +204,7 @@ static NTSTATUS GetSecurity(FSP_FILE_SYSTEM *FileSystem, | |||||||
|     } |     } | ||||||
|  |  | ||||||
|     if (0 != PFileAttributes) |     if (0 != PFileAttributes) | ||||||
|         *PFileAttributes = FileNode->NodeInfo.FileAttributes; |         *PFileAttributes = FileNode->FileInfo.FileAttributes; | ||||||
|  |  | ||||||
|     if (0 != PSecurityDescriptorSize) |     if (0 != PSecurityDescriptorSize) | ||||||
|     { |     { | ||||||
| @@ -225,9 +224,9 @@ static NTSTATUS GetSecurity(FSP_FILE_SYSTEM *FileSystem, | |||||||
|  |  | ||||||
| static NTSTATUS Create(FSP_FILE_SYSTEM *FileSystem, | static NTSTATUS Create(FSP_FILE_SYSTEM *FileSystem, | ||||||
|     FSP_FSCTL_TRANSACT_REQ *Request, |     FSP_FSCTL_TRANSACT_REQ *Request, | ||||||
|     PWSTR FileName, BOOLEAN CaseSensitive, DWORD CreateOptions, |     PWSTR FileName, BOOLEAN CaseSensitive, UINT32 CreateOptions, | ||||||
|     DWORD FileAttributes, PSECURITY_DESCRIPTOR SecurityDescriptor, UINT64 AllocationSize, |     UINT32 FileAttributes, PSECURITY_DESCRIPTOR SecurityDescriptor, UINT64 AllocationSize, | ||||||
|     FSP_FILE_NODE_INFO *NodeInfo) |     PVOID *PFileNode, FSP_FSCTL_FILE_INFO *FileInfo) | ||||||
| { | { | ||||||
|     MEMFS *Memfs = (MEMFS *)FileSystem->UserContext; |     MEMFS *Memfs = (MEMFS *)FileSystem->UserContext; | ||||||
|     MEMFS_FILE_NODE *FileNode; |     MEMFS_FILE_NODE *FileNode; | ||||||
| @@ -254,7 +253,7 @@ static NTSTATUS Create(FSP_FILE_SYSTEM *FileSystem, | |||||||
|     if (!NT_SUCCESS(Result)) |     if (!NT_SUCCESS(Result)) | ||||||
|         return Result; |         return Result; | ||||||
|  |  | ||||||
|     FileNode->NodeInfo.FileAttributes = FileAttributes; |     FileNode->FileInfo.FileAttributes = FileAttributes; | ||||||
|  |  | ||||||
|     if (0 != SecurityDescriptor) |     if (0 != SecurityDescriptor) | ||||||
|     { |     { | ||||||
| @@ -268,10 +267,10 @@ static NTSTATUS Create(FSP_FILE_SYSTEM *FileSystem, | |||||||
|         memcpy(FileNode->FileSecurity, SecurityDescriptor, FileNode->FileSecuritySize); |         memcpy(FileNode->FileSecurity, SecurityDescriptor, FileNode->FileSecuritySize); | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     FileNode->NodeInfo.AllocationSize = FSP_FSCTL_ALIGN_UP((ULONG)AllocationSize, MEMFS_SECTOR_SIZE); |     FileNode->FileInfo.AllocationSize = FSP_FSCTL_ALIGN_UP((ULONG)AllocationSize, MEMFS_SECTOR_SIZE); | ||||||
|     if (0 != FileNode->NodeInfo.AllocationSize) |     if (0 != FileNode->FileInfo.AllocationSize) | ||||||
|     { |     { | ||||||
|         FileNode->FileData = malloc(FileNode->NodeInfo.AllocationSize); |         FileNode->FileData = malloc(FileNode->FileInfo.AllocationSize); | ||||||
|         if (0 == FileNode->FileData) |         if (0 == FileNode->FileData) | ||||||
|         { |         { | ||||||
|             MemfsFileNodeDelete(FileNode); |             MemfsFileNodeDelete(FileNode); | ||||||
| @@ -289,15 +288,16 @@ static NTSTATUS Create(FSP_FILE_SYSTEM *FileSystem, | |||||||
|     } |     } | ||||||
|  |  | ||||||
|     FileNode->RefCount++; |     FileNode->RefCount++; | ||||||
|     *NodeInfo = FileNode->NodeInfo; |     *PFileNode = FileNode; | ||||||
|  |     *FileInfo = FileNode->FileInfo; | ||||||
|  |  | ||||||
|     return STATUS_SUCCESS; |     return STATUS_SUCCESS; | ||||||
| } | } | ||||||
|  |  | ||||||
| static NTSTATUS Open(FSP_FILE_SYSTEM *FileSystem, | static NTSTATUS Open(FSP_FILE_SYSTEM *FileSystem, | ||||||
|     FSP_FSCTL_TRANSACT_REQ *Request, |     FSP_FSCTL_TRANSACT_REQ *Request, | ||||||
|     PWSTR FileName, BOOLEAN CaseSensitive, DWORD CreateOptions, |     PWSTR FileName, BOOLEAN CaseSensitive, UINT32 CreateOptions, | ||||||
|     FSP_FILE_NODE_INFO *NodeInfo) |     PVOID *PFileNode, FSP_FSCTL_FILE_INFO *FileInfo) | ||||||
| { | { | ||||||
|     MEMFS *Memfs = (MEMFS *)FileSystem->UserContext; |     MEMFS *Memfs = (MEMFS *)FileSystem->UserContext; | ||||||
|     MEMFS_FILE_NODE *FileNode; |     MEMFS_FILE_NODE *FileNode; | ||||||
| @@ -311,33 +311,33 @@ static NTSTATUS Open(FSP_FILE_SYSTEM *FileSystem, | |||||||
|         return Result; |         return Result; | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     FileNode->NodeInfo.LastAccessTime = MemfsGetSystemTime(); |     FileNode->FileInfo.LastAccessTime = MemfsGetSystemTime(); | ||||||
|  |  | ||||||
|     FileNode->RefCount++; |     FileNode->RefCount++; | ||||||
|     *NodeInfo = FileNode->NodeInfo; |     *PFileNode = FileNode; | ||||||
|  |     *FileInfo = FileNode->FileInfo; | ||||||
|  |  | ||||||
|     return STATUS_SUCCESS; |     return STATUS_SUCCESS; | ||||||
| } | } | ||||||
|  |  | ||||||
| static NTSTATUS Overwrite(FSP_FILE_SYSTEM *FileSystem, | NTSTATUS Overwrite(FSP_FILE_SYSTEM *FileSystem, | ||||||
|     FSP_FSCTL_TRANSACT_REQ *Request, |     FSP_FSCTL_TRANSACT_REQ *Request, | ||||||
|     PVOID FileNode0, DWORD FileAttributes, BOOLEAN ReplaceFileAttributes, |     PVOID FileNode0, UINT32 FileAttributes, BOOLEAN ReplaceFileAttributes, | ||||||
|     FSP_FILE_SIZE_INFO *SizeInfo) |     FSP_FSCTL_FILE_INFO *FileInfo) | ||||||
| { | { | ||||||
|     MEMFS *Memfs = (MEMFS *)FileSystem->UserContext; |     MEMFS *Memfs = (MEMFS *)FileSystem->UserContext; | ||||||
|     MEMFS_FILE_NODE *FileNode = (MEMFS_FILE_NODE *)FileNode0; |     MEMFS_FILE_NODE *FileNode = (MEMFS_FILE_NODE *)FileNode0; | ||||||
|  |  | ||||||
|     if (ReplaceFileAttributes) |     if (ReplaceFileAttributes) | ||||||
|         FileNode->NodeInfo.FileAttributes = FileAttributes; |         FileNode->FileInfo.FileAttributes = FileAttributes; | ||||||
|     else |     else | ||||||
|         FileNode->NodeInfo.FileAttributes |= FileAttributes; |         FileNode->FileInfo.FileAttributes |= FileAttributes; | ||||||
|  |  | ||||||
|     FileNode->NodeInfo.FileSize = 0; |     FileNode->FileInfo.FileSize = 0; | ||||||
|     FileNode->NodeInfo.LastWriteTime = |     FileNode->FileInfo.LastWriteTime = | ||||||
|     FileNode->NodeInfo.LastAccessTime = MemfsGetSystemTime(); |     FileNode->FileInfo.LastAccessTime = MemfsGetSystemTime(); | ||||||
|  |  | ||||||
|     SizeInfo->AllocationSize = FileNode->NodeInfo.AllocationSize; |     *FileInfo = FileNode->FileInfo; | ||||||
|     SizeInfo->FileSize = FileNode->NodeInfo.FileSize; |  | ||||||
|  |  | ||||||
|     return STATUS_SUCCESS; |     return STATUS_SUCCESS; | ||||||
| } | } | ||||||
| @@ -446,7 +446,7 @@ NTSTATUS MemfsCreate(ULONG Flags, ULONG MaxFileNodes, ULONG MaxFileSize, | |||||||
|         return Result; |         return Result; | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     RootNode->NodeInfo.FileAttributes = FILE_ATTRIBUTE_DIRECTORY; |     RootNode->FileInfo.FileAttributes = FILE_ATTRIBUTE_DIRECTORY; | ||||||
|  |  | ||||||
|     Result = MemfsFileNodeMapInsert(Memfs->FileNodeMap, RootNode, &Inserted); |     Result = MemfsFileNodeMapInsert(Memfs->FileNodeMap, RootNode, &Inserted); | ||||||
|     if (!NT_SUCCESS(Result)) |     if (!NT_SUCCESS(Result)) | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user