diff --git a/inc/winfsp/fsctl.h b/inc/winfsp/fsctl.h index ab80ef3d..9510f2a7 100644 --- a/inc/winfsp/fsctl.h +++ b/inc/winfsp/fsctl.h @@ -153,6 +153,8 @@ typedef struct { UINT64 UserContext; /* open file user context (unique file id) */ UINT64 UserContext2; /* kernel file object user context (only low 32 bits valid) */ + UINT64 AllocationSize; /* file allocation size */ + UINT64 FileSize; /* file size */ UINT32 GrantedAccess; /* FILE_{READ_DATA,WRITE_DATA,etc.} */ } Opened; /* IoStatus.Status == STATUS_REPARSE */ diff --git a/inc/winfsp/winfsp.h b/inc/winfsp/winfsp.h index ec345378..908434e5 100644 --- a/inc/winfsp/winfsp.h +++ b/inc/winfsp/winfsp.h @@ -28,7 +28,13 @@ typedef struct _FSP_FILE_SYSTEM FSP_FILE_SYSTEM; typedef struct _FSP_FILE_NODE { PVOID UserContext; - DWORD Flags; + UINT64 AllocationSize; + UINT64 FileSize; + struct + { + BOOLEAN DeleteOnClose:1; + BOOLEAN DeletePending:1; + } Flags; struct { ULONG OpenCount; diff --git a/src/dll/create.c b/src/dll/create.c index b75a7588..781fdb19 100644 --- a/src/dll/create.c +++ b/src/dll/create.c @@ -51,7 +51,7 @@ static NTSTATUS FspFileSystemOpCreate_FileCreate(FSP_FILE_SYSTEM *FileSystem, if (!NT_SUCCESS(Result)) return FspFileSystemSendResponseWithStatus(FileSystem, Request, Result); - FileNode->Flags = 0; + memset(&FileNode->Flags, 0, sizeof FileNode->Flags); memset(&FileNode->ShareAccess, 0, sizeof FileNode->ShareAccess); FspShareCheck(FileSystem, GrantedAccess, Request->Req.Create.ShareAccess, FileNode); @@ -129,7 +129,7 @@ static NTSTATUS FspFileSystemOpCreate_FileOpenIf(FSP_FILE_SYSTEM *FileSystem, if (!NT_SUCCESS(Result)) return FspFileSystemSendResponseWithStatus(FileSystem, Request, Result); - FileNode->Flags = 0; + memset(&FileNode->Flags, 0, sizeof FileNode->Flags); memset(&FileNode->ShareAccess, 0, sizeof FileNode->ShareAccess); } @@ -229,7 +229,7 @@ static NTSTATUS FspFileSystemOpCreate_FileOverwriteIf(FSP_FILE_SYSTEM *FileSyste if (!NT_SUCCESS(Result)) return FspFileSystemSendResponseWithStatus(FileSystem, Request, Result); - FileNode->Flags = 0; + memset(&FileNode->Flags, 0, sizeof FileNode->Flags); memset(&FileNode->ShareAccess, 0, sizeof FileNode->ShareAccess); } @@ -322,6 +322,8 @@ FSP_API NTSTATUS FspFileSystemSendCreateResponse(FSP_FILE_SYSTEM *FileSystem, Response.IoStatus.Status = STATUS_SUCCESS; Response.IoStatus.Information = Information; Response.Rsp.Create.Opened.UserContext = (UINT_PTR)FileNode; + Response.Rsp.Create.Opened.AllocationSize = FileNode->AllocationSize; + Response.Rsp.Create.Opened.FileSize = FileNode->FileSize; Response.Rsp.Create.Opened.GrantedAccess = GrantedAccess; return FspFileSystemSendResponse(FileSystem, &Response); } diff --git a/src/sys/create.c b/src/sys/create.c index b3d23756..3ab327eb 100644 --- a/src/sys/create.c +++ b/src/sys/create.c @@ -382,6 +382,9 @@ VOID FspFsvolCreateComplete( /* get the FsContext from our Request and associate it with the Response UserContext */ Request = FspIrpRequest(Irp); FsContext = FspIopRequestContext(Request, RequestFsContext); + FsContext->Header.AllocationSize.QuadPart = Response->Rsp.Create.Opened.AllocationSize; + FsContext->Header.FileSize.QuadPart = FsContext->Header.ValidDataLength.QuadPart = + Response->Rsp.Create.Opened.AllocationSize; FsContext->UserContext = Response->Rsp.Create.Opened.UserContext; /*