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_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[]; | ||||
|   | ||||
| @@ -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, | ||||
|   | ||||
| @@ -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); | ||||
| } | ||||
|   | ||||
| @@ -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); | ||||
|   | ||||
| @@ -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); | ||||
|   | ||||
| @@ -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. | ||||
|   | ||||
| @@ -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)) | ||||
|   | ||||
		Reference in New Issue
	
	Block a user