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