mirror of
				https://github.com/winfsp/winfsp.git
				synced 2025-11-04 04:58:05 -06: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