fsctl: FSP_FSCTL_FILE_INFO and related changes

This commit is contained in:
Bill Zissimopoulos 2016-01-22 23:00:25 -08:00
parent 2afa957feb
commit af36418f43
7 changed files with 117 additions and 134 deletions

View File

@ -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[];

View File

@ -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,

View File

@ -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);
} }

View File

@ -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);

View File

@ -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);

View File

@ -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.

View File

@ -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))