From 3ce490d4053b833c81b7ed570c6378c34bf4c62d Mon Sep 17 00:00:00 2001 From: Bill Zissimopoulos Date: Wed, 21 Sep 2016 10:40:18 -0700 Subject: [PATCH] inc: fsctl: UmFileNodeIsUserContext2 --- inc/winfsp/fsctl.h | 6 ++++ inc/winfsp/winfsp.h | 1 + src/dll/fs.c | 2 ++ src/dll/fsop.c | 61 +++++++++++++++++++++------------------ src/dll/fuse/fuse.c | 1 + src/dll/fuse/fuse_intf.c | 62 ++++++++++++++-------------------------- src/dll/fuse/library.h | 2 -- 7 files changed, 65 insertions(+), 70 deletions(-) diff --git a/inc/winfsp/fsctl.h b/inc/winfsp/fsctl.h index 714f077c..05d3c2d2 100644 --- a/inc/winfsp/fsctl.h +++ b/inc/winfsp/fsctl.h @@ -78,6 +78,8 @@ FSP_FSCTL_STATIC_ASSERT(FSP_FSCTL_VOLUME_NAME_SIZEMAX <= 260 * sizeof(WCHAR), #define FSP_FSCTL_TRANSACT_BATCH_BUFFER_SIZEMIN 16384 #define FSP_FSCTL_TRANSACT_BUFFER_SIZEMIN FSP_FSCTL_TRANSACT_REQ_SIZEMAX +#define FSP_FSCTL_TRANSACT_USERCONTEXT(s,i) (((PUINT64)&(s).UserContext)[i]) + /* marshalling */ #pragma warning(push) #pragma warning(disable:4200) /* zero-sized array in struct/union */ @@ -144,6 +146,10 @@ typedef struct UINT32 HardLinks:1; /* unimplemented; set to 0 */ UINT32 ExtendedAttributes:1; /* unimplemented; set to 0 */ UINT32 ReadOnlyVolume:1; + UINT32 KmReservedFlags:6; + /* user-mode flags */ + UINT32 UmFileNodeIsUserContext2:1; /* user mode: FileNode parameter is UserContext2 */ + UINT32 UmReservedFlags:15; WCHAR Prefix[FSP_FSCTL_VOLUME_PREFIX_SIZE / sizeof(WCHAR)]; /* UNC prefix (\Server\Share) */ WCHAR FileSystemName[FSP_FSCTL_VOLUME_FSNAME_SIZE / sizeof(WCHAR)]; } FSP_FSCTL_VOLUME_PARAMS; diff --git a/inc/winfsp/winfsp.h b/inc/winfsp/winfsp.h index 79da3762..db48565d 100644 --- a/inc/winfsp/winfsp.h +++ b/inc/winfsp/winfsp.h @@ -795,6 +795,7 @@ typedef struct _FSP_FILE_SYSTEM UINT32 DebugLog; FSP_FILE_SYSTEM_OPERATION_GUARD_STRATEGY OpGuardStrategy; SRWLOCK OpGuardLock; + BOOLEAN UmFileNodeIsUserContext2; } FSP_FILE_SYSTEM; /** * Create a file system object. diff --git a/src/dll/fs.c b/src/dll/fs.c index 74f9c47e..7ab3e8e6 100644 --- a/src/dll/fs.c +++ b/src/dll/fs.c @@ -106,6 +106,8 @@ FSP_API NTSTATUS FspFileSystemCreate(PWSTR DevicePath, FileSystem->EnterOperation = FspFileSystemOpEnter; FileSystem->LeaveOperation = FspFileSystemOpLeave; + FileSystem->UmFileNodeIsUserContext2 = !!VolumeParams->UmFileNodeIsUserContext2; + *PFileSystem = FileSystem; return STATUS_SUCCESS; diff --git a/src/dll/fsop.c b/src/dll/fsop.c index 4ec6d7f3..3671684b 100644 --- a/src/dll/fsop.c +++ b/src/dll/fsop.c @@ -17,6 +17,9 @@ #include +#define USERCONTEXT(s) \ + FSP_FSCTL_TRANSACT_USERCONTEXT(s, FileSystem->UmFileNodeIsUserContext2) + FSP_API NTSTATUS FspFileSystemOpEnter(FSP_FILE_SYSTEM *FileSystem, FSP_FSCTL_TRANSACT_REQ *Request, FSP_FSCTL_TRANSACT_RSP *Response) { @@ -31,7 +34,8 @@ FSP_API NTSTATUS FspFileSystemOpEnter(FSP_FILE_SYSTEM *FileSystem, 10/*FileRenameInformation*/ == Request->Req.SetInformation.FileInformationClass) || FspFsctlTransactSetVolumeInformationKind == Request->Kind || (FspFsctlTransactFlushBuffersKind == Request->Kind && - 0 == Request->Req.FlushBuffers.UserContext)) + 0 == Request->Req.FlushBuffers.UserContext && + 0 == Request->Req.FlushBuffers.UserContext2)) { AcquireSRWLockExclusive(&FileSystem->OpGuardLock); } @@ -68,7 +72,8 @@ FSP_API NTSTATUS FspFileSystemOpLeave(FSP_FILE_SYSTEM *FileSystem, 10/*FileRenameInformation*/ == Request->Req.SetInformation.FileInformationClass) || FspFsctlTransactSetVolumeInformationKind == Request->Kind || (FspFsctlTransactFlushBuffersKind == Request->Kind && - 0 == Request->Req.FlushBuffers.UserContext)) + 0 == Request->Req.FlushBuffers.UserContext && + 0 == Request->Req.FlushBuffers.UserContext2)) { ReleaseSRWLockExclusive(&FileSystem->OpGuardLock); } @@ -338,7 +343,7 @@ static NTSTATUS FspFileSystemOpCreate_FileCreate(FSP_FILE_SYSTEM *FileSystem, return Result; Response->IoStatus.Information = FILE_CREATED; - Response->Rsp.Create.Opened.UserContext = (UINT_PTR)FileNode; + USERCONTEXT(Response->Rsp.Create.Opened) = (UINT_PTR)FileNode; Response->Rsp.Create.Opened.GrantedAccess = GrantedAccess; memcpy(&Response->Rsp.Create.Opened.FileInfo, &FileInfo, sizeof FileInfo); return STATUS_SUCCESS; @@ -365,7 +370,7 @@ static NTSTATUS FspFileSystemOpCreate_FileOpen(FSP_FILE_SYSTEM *FileSystem, return Result; Response->IoStatus.Information = FILE_OPENED; - Response->Rsp.Create.Opened.UserContext = (UINT_PTR)FileNode; + USERCONTEXT(Response->Rsp.Create.Opened) = (UINT_PTR)FileNode; Response->Rsp.Create.Opened.GrantedAccess = GrantedAccess; memcpy(&Response->Rsp.Create.Opened.FileInfo, &FileInfo, sizeof FileInfo); return STATUS_SUCCESS; @@ -428,7 +433,7 @@ static NTSTATUS FspFileSystemOpCreate_FileOpenIf(FSP_FILE_SYSTEM *FileSystem, } Response->IoStatus.Information = Create ? FILE_CREATED : FILE_OPENED; - Response->Rsp.Create.Opened.UserContext = (UINT_PTR)FileNode; + USERCONTEXT(Response->Rsp.Create.Opened) = (UINT_PTR)FileNode; Response->Rsp.Create.Opened.GrantedAccess = GrantedAccess; memcpy(&Response->Rsp.Create.Opened.FileInfo, &FileInfo, sizeof FileInfo); return STATUS_SUCCESS; @@ -456,7 +461,7 @@ static NTSTATUS FspFileSystemOpCreate_FileOverwrite(FSP_FILE_SYSTEM *FileSystem, return Result; Response->IoStatus.Information = Supersede ? FILE_SUPERSEDED : FILE_OVERWRITTEN; - Response->Rsp.Create.Opened.UserContext = (UINT_PTR)FileNode; + USERCONTEXT(Response->Rsp.Create.Opened) = (UINT_PTR)FileNode; Response->Rsp.Create.Opened.GrantedAccess = GrantedAccess; memcpy(&Response->Rsp.Create.Opened.FileInfo, &FileInfo, sizeof FileInfo); return STATUS_SUCCESS; @@ -519,7 +524,7 @@ static NTSTATUS FspFileSystemOpCreate_FileOverwriteIf(FSP_FILE_SYSTEM *FileSyste } Response->IoStatus.Information = Create ? FILE_CREATED : FILE_OVERWRITTEN; - Response->Rsp.Create.Opened.UserContext = (UINT_PTR)FileNode; + USERCONTEXT(Response->Rsp.Create.Opened) = (UINT_PTR)FileNode; Response->Rsp.Create.Opened.GrantedAccess = GrantedAccess; memcpy(&Response->Rsp.Create.Opened.FileInfo, &FileInfo, sizeof FileInfo); return STATUS_SUCCESS; @@ -558,7 +563,7 @@ static NTSTATUS FspFileSystemOpCreate_FileOpenTargetDirectory(FSP_FILE_SYSTEM *F } Response->IoStatus.Information = Information; - Response->Rsp.Create.Opened.UserContext = (UINT_PTR)FileNode; + USERCONTEXT(Response->Rsp.Create.Opened) = (UINT_PTR)FileNode; Response->Rsp.Create.Opened.GrantedAccess = GrantedAccess; memcpy(&Response->Rsp.Create.Opened.FileInfo, &FileInfo, sizeof FileInfo); return STATUS_SUCCESS; @@ -604,7 +609,7 @@ FSP_API NTSTATUS FspFileSystemOpOverwrite(FSP_FILE_SYSTEM *FileSystem, memset(&FileInfo, 0, sizeof FileInfo); Result = FileSystem->Interface->Overwrite(FileSystem, Request, - (PVOID)Request->Req.Overwrite.UserContext, + (PVOID)USERCONTEXT(Request->Req.Overwrite), Request->Req.Overwrite.FileAttributes, Request->Req.Overwrite.Supersede, &FileInfo); @@ -612,7 +617,7 @@ FSP_API NTSTATUS FspFileSystemOpOverwrite(FSP_FILE_SYSTEM *FileSystem, { if (0 != FileSystem->Interface->Close) FileSystem->Interface->Close(FileSystem, Request, - (PVOID)Request->Req.Overwrite.UserContext); + (PVOID)USERCONTEXT(Request->Req.Overwrite)); return Result; } @@ -625,7 +630,7 @@ FSP_API NTSTATUS FspFileSystemOpCleanup(FSP_FILE_SYSTEM *FileSystem, { if (0 != FileSystem->Interface->Cleanup) FileSystem->Interface->Cleanup(FileSystem, Request, - (PVOID)Request->Req.Cleanup.UserContext, + (PVOID)USERCONTEXT(Request->Req.Cleanup), 0 != Request->FileName.Size ? (PWSTR)Request->Buffer : 0, 0 != Request->Req.Cleanup.Delete); @@ -637,7 +642,7 @@ FSP_API NTSTATUS FspFileSystemOpClose(FSP_FILE_SYSTEM *FileSystem, { if (0 != FileSystem->Interface->Close) FileSystem->Interface->Close(FileSystem, Request, - (PVOID)Request->Req.Close.UserContext); + (PVOID)USERCONTEXT(Request->Req.Close)); return STATUS_SUCCESS; } @@ -653,7 +658,7 @@ FSP_API NTSTATUS FspFileSystemOpRead(FSP_FILE_SYSTEM *FileSystem, BytesTransferred = 0; Result = FileSystem->Interface->Read(FileSystem, Request, - (PVOID)Request->Req.Read.UserContext, + (PVOID)USERCONTEXT(Request->Req.Read), (PVOID)Request->Req.Read.Address, Request->Req.Read.Offset, Request->Req.Read.Length, @@ -679,7 +684,7 @@ FSP_API NTSTATUS FspFileSystemOpWrite(FSP_FILE_SYSTEM *FileSystem, BytesTransferred = 0; Result = FileSystem->Interface->Write(FileSystem, Request, - (PVOID)Request->Req.Write.UserContext, + (PVOID)USERCONTEXT(Request->Req.Write), (PVOID)Request->Req.Write.Address, Request->Req.Write.Offset, Request->Req.Write.Length, @@ -706,7 +711,7 @@ FSP_API NTSTATUS FspFileSystemOpFlushBuffers(FSP_FILE_SYSTEM *FileSystem, return STATUS_SUCCESS; /* liar! */ return FileSystem->Interface->Flush(FileSystem, Request, - (PVOID)Request->Req.FlushBuffers.UserContext); + (PVOID)USERCONTEXT(Request->Req.FlushBuffers)); } FSP_API NTSTATUS FspFileSystemOpQueryInformation(FSP_FILE_SYSTEM *FileSystem, @@ -720,7 +725,7 @@ FSP_API NTSTATUS FspFileSystemOpQueryInformation(FSP_FILE_SYSTEM *FileSystem, memset(&FileInfo, 0, sizeof FileInfo); Result = FileSystem->Interface->GetFileInfo(FileSystem, Request, - (PVOID)Request->Req.QueryInformation.UserContext, &FileInfo); + (PVOID)USERCONTEXT(Request->Req.QueryInformation), &FileInfo); if (!NT_SUCCESS(Result)) return Result; @@ -741,7 +746,7 @@ FSP_API NTSTATUS FspFileSystemOpSetInformation(FSP_FILE_SYSTEM *FileSystem, case 4/*FileBasicInformation*/: if (0 != FileSystem->Interface->SetBasicInfo) Result = FileSystem->Interface->SetBasicInfo(FileSystem, Request, - (PVOID)Request->Req.SetInformation.UserContext, + (PVOID)USERCONTEXT(Request->Req.SetInformation), Request->Req.SetInformation.Info.Basic.FileAttributes, Request->Req.SetInformation.Info.Basic.CreationTime, Request->Req.SetInformation.Info.Basic.LastAccessTime, @@ -751,14 +756,14 @@ FSP_API NTSTATUS FspFileSystemOpSetInformation(FSP_FILE_SYSTEM *FileSystem, case 19/*FileAllocationInformation*/: if (0 != FileSystem->Interface->SetFileSize) Result = FileSystem->Interface->SetFileSize(FileSystem, Request, - (PVOID)Request->Req.SetInformation.UserContext, + (PVOID)USERCONTEXT(Request->Req.SetInformation), Request->Req.SetInformation.Info.Allocation.AllocationSize, TRUE, &FileInfo); break; case 20/*FileEndOfFileInformation*/: if (0 != FileSystem->Interface->SetFileSize) Result = FileSystem->Interface->SetFileSize(FileSystem, Request, - (PVOID)Request->Req.SetInformation.UserContext, + (PVOID)USERCONTEXT(Request->Req.SetInformation), Request->Req.SetInformation.Info.EndOfFile.FileSize, FALSE, &FileInfo); break; @@ -766,7 +771,7 @@ FSP_API NTSTATUS FspFileSystemOpSetInformation(FSP_FILE_SYSTEM *FileSystem, if (0 != FileSystem->Interface->GetFileInfo) { Result = FileSystem->Interface->GetFileInfo(FileSystem, Request, - (PVOID)Request->Req.SetInformation.UserContext, &FileInfo); + (PVOID)USERCONTEXT(Request->Req.SetInformation), &FileInfo); if (NT_SUCCESS(Result) && 0 != (FileInfo.FileAttributes & FILE_ATTRIBUTE_READONLY)) { Result = STATUS_CANNOT_DELETE; @@ -776,7 +781,7 @@ FSP_API NTSTATUS FspFileSystemOpSetInformation(FSP_FILE_SYSTEM *FileSystem, if (0 != FileSystem->Interface->CanDelete) if (Request->Req.SetInformation.Info.Disposition.Delete) Result = FileSystem->Interface->CanDelete(FileSystem, Request, - (PVOID)Request->Req.SetInformation.UserContext, + (PVOID)USERCONTEXT(Request->Req.SetInformation), (PWSTR)Request->Buffer); else Result = STATUS_SUCCESS; @@ -793,7 +798,7 @@ FSP_API NTSTATUS FspFileSystemOpSetInformation(FSP_FILE_SYSTEM *FileSystem, break; } Result = FileSystem->Interface->Rename(FileSystem, Request, - (PVOID)Request->Req.SetInformation.UserContext, + (PVOID)USERCONTEXT(Request->Req.SetInformation), (PWSTR)Request->Buffer, (PWSTR)(Request->Buffer + Request->Req.SetInformation.Info.Rename.NewFileName.Offset), 0 != Request->Req.SetInformation.Info.Rename.AccessToken); @@ -862,7 +867,7 @@ FSP_API NTSTATUS FspFileSystemOpQueryDirectory(FSP_FILE_SYSTEM *FileSystem, BytesTransferred = 0; Result = FileSystem->Interface->ReadDirectory(FileSystem, Request, - (PVOID)Request->Req.QueryDirectory.UserContext, + (PVOID)USERCONTEXT(Request->Req.QueryDirectory), (PVOID)Request->Req.QueryDirectory.Address, Request->Req.QueryDirectory.Offset, Request->Req.QueryDirectory.Length, @@ -896,7 +901,7 @@ FSP_API NTSTATUS FspFileSystemOpFileSystemControl(FSP_FILE_SYSTEM *FileSystem, Size = FSP_FSCTL_TRANSACT_RSP_BUFFER_SIZEMAX; Result = FileSystem->Interface->GetReparsePoint(FileSystem, Request, - (PVOID)Request->Req.FileSystemControl.UserContext, + (PVOID)USERCONTEXT(Request->Req.FileSystemControl), (PWSTR)Request->Buffer, ReparseData, &Size); if (NT_SUCCESS(Result)) { @@ -913,7 +918,7 @@ FSP_API NTSTATUS FspFileSystemOpFileSystemControl(FSP_FILE_SYSTEM *FileSystem, (Request->Buffer + Request->Req.FileSystemControl.Buffer.Offset); Result = FileSystem->Interface->SetReparsePoint(FileSystem, Request, - (PVOID)Request->Req.FileSystemControl.UserContext, + (PVOID)USERCONTEXT(Request->Req.FileSystemControl), (PWSTR)Request->Buffer, ReparseData, Request->Req.FileSystemControl.Buffer.Size); @@ -926,7 +931,7 @@ FSP_API NTSTATUS FspFileSystemOpFileSystemControl(FSP_FILE_SYSTEM *FileSystem, (Request->Buffer + Request->Req.FileSystemControl.Buffer.Offset); Result = FileSystem->Interface->DeleteReparsePoint(FileSystem, Request, - (PVOID)Request->Req.FileSystemControl.UserContext, + (PVOID)USERCONTEXT(Request->Req.FileSystemControl), (PWSTR)Request->Buffer, ReparseData, Request->Req.FileSystemControl.Buffer.Size); @@ -948,7 +953,7 @@ FSP_API NTSTATUS FspFileSystemOpQuerySecurity(FSP_FILE_SYSTEM *FileSystem, SecurityDescriptorSize = FSP_FSCTL_TRANSACT_RSP_SIZEMAX - sizeof *Response; Result = FileSystem->Interface->GetSecurity(FileSystem, Request, - (PVOID)Request->Req.QuerySecurity.UserContext, + (PVOID)USERCONTEXT(Request->Req.QuerySecurity), Response->Buffer, &SecurityDescriptorSize); if (!NT_SUCCESS(Result)) return STATUS_BUFFER_OVERFLOW != Result ? Result : STATUS_INVALID_SECURITY_DESCR; @@ -966,7 +971,7 @@ FSP_API NTSTATUS FspFileSystemOpSetSecurity(FSP_FILE_SYSTEM *FileSystem, return STATUS_INVALID_DEVICE_REQUEST; return FileSystem->Interface->SetSecurity(FileSystem, Request, - (PVOID)Request->Req.SetSecurity.UserContext, + (PVOID)USERCONTEXT(Request->Req.SetSecurity), Request->Req.SetSecurity.SecurityInformation, (PSECURITY_DESCRIPTOR)Request->Buffer); } diff --git a/src/dll/fuse/fuse.c b/src/dll/fuse/fuse.c index e42e8a3b..7f278cef 100644 --- a/src/dll/fuse/fuse.c +++ b/src/dll/fuse/fuse.c @@ -525,6 +525,7 @@ FSP_FUSE_API struct fuse *fsp_fuse_new(struct fsp_fuse_env *env, opt_data.VolumeParams.ReparsePointsAccessCheck = FALSE; opt_data.VolumeParams.NamedStreams = !!opt_data.NamedStreams; opt_data.VolumeParams.ReadOnlyVolume = !!opt_data.ReadOnlyVolume; + opt_data.VolumeParams.UmFileNodeIsUserContext2 = TRUE; if (L'\0' == opt_data.VolumeParams.FileSystemName[0]) memcpy(opt_data.VolumeParams.FileSystemName, L"FUSE", 5 * sizeof(WCHAR)); diff --git a/src/dll/fuse/fuse_intf.c b/src/dll/fuse/fuse_intf.c index a646883a..839ed53b 100644 --- a/src/dll/fuse/fuse_intf.c +++ b/src/dll/fuse/fuse_intf.c @@ -32,7 +32,8 @@ VOID fsp_fuse_op_enter_lock(FSP_FILE_SYSTEM *FileSystem, 10/*FileRenameInformation*/ == Request->Req.SetInformation.FileInformationClass) || FspFsctlTransactSetVolumeInformationKind == Request->Kind || (FspFsctlTransactFlushBuffersKind == Request->Kind && - 0 == Request->Req.FlushBuffers.UserContext) || + 0 == Request->Req.FlushBuffers.UserContext && + 0 == Request->Req.FlushBuffers.UserContext2) || /* FSCTL_SET_REPARSE_POINT manipulates namespace */ (FspFsctlTransactFileSystemControlKind == Request->Kind && FSCTL_SET_REPARSE_POINT == Request->Req.FileSystemControl.FsControlCode)) @@ -74,7 +75,8 @@ VOID fsp_fuse_op_leave_unlock(FSP_FILE_SYSTEM *FileSystem, 10/*FileRenameInformation*/ == Request->Req.SetInformation.FileInformationClass) || FspFsctlTransactSetVolumeInformationKind == Request->Kind || (FspFsctlTransactFlushBuffersKind == Request->Kind && - 0 == Request->Req.FlushBuffers.UserContext) || + 0 == Request->Req.FlushBuffers.UserContext && + 0 == Request->Req.FlushBuffers.UserContext2) || /* FSCTL_SET_REPARSE_POINT manipulates namespace */ (FspFsctlTransactFileSystemControlKind == Request->Kind && FSCTL_SET_REPARSE_POINT == Request->Req.FileSystemControl.FsControlCode)) @@ -223,8 +225,6 @@ NTSTATUS fsp_fuse_op_enter(FSP_FILE_SYSTEM *FileSystem, context->gid = Gid; contexthdr = FSP_FUSE_HDR_FROM_CONTEXT(context); - contexthdr->Request = Request; - contexthdr->Response = Response; contexthdr->PosixPath = PosixPath; Result = STATUS_SUCCESS; @@ -876,7 +876,7 @@ static NTSTATUS fsp_fuse_intf_Create(FSP_FILE_SYSTEM *FileSystem, if (!NT_SUCCESS(Result)) goto exit; - *PFileNode = 0; + *PFileNode = filedesc; memcpy(FileInfo, &FileInfoBuf, sizeof FileInfoBuf); filedesc->PosixPath = contexthdr->PosixPath; @@ -887,7 +887,6 @@ static NTSTATUS fsp_fuse_intf_Create(FSP_FILE_SYSTEM *FileSystem, filedesc->DirBuffer = 0; filedesc->DirBufferSize = 0; contexthdr->PosixPath = 0; - contexthdr->Response->Rsp.Create.Opened.UserContext2 = (UINT64)(UINT_PTR)filedesc; Result = STATUS_SUCCESS; @@ -996,7 +995,7 @@ static NTSTATUS fsp_fuse_intf_Open(FSP_FILE_SYSTEM *FileSystem, * Ignore fuse_file_info::nonseekable. */ - *PFileNode = 0; + *PFileNode = filedesc; memcpy(FileInfo, &FileInfoBuf, sizeof FileInfoBuf); filedesc->PosixPath = contexthdr->PosixPath; @@ -1007,7 +1006,6 @@ static NTSTATUS fsp_fuse_intf_Open(FSP_FILE_SYSTEM *FileSystem, filedesc->DirBuffer = 0; filedesc->DirBufferSize = 0; contexthdr->PosixPath = 0; - contexthdr->Response->Rsp.Create.Opened.UserContext2 = (UINT64)(UINT_PTR)filedesc; Result = STATUS_SUCCESS; @@ -1024,8 +1022,7 @@ static NTSTATUS fsp_fuse_intf_Overwrite(FSP_FILE_SYSTEM *FileSystem, FSP_FSCTL_FILE_INFO *FileInfo) { struct fuse *f = FileSystem->UserContext; - struct fsp_fuse_file_desc *filedesc = - (PVOID)(UINT_PTR)Request->Req.Overwrite.UserContext2; + struct fsp_fuse_file_desc *filedesc = FileNode; UINT32 Uid, Gid, Mode; struct fuse_file_info fi; int err; @@ -1062,8 +1059,7 @@ static VOID fsp_fuse_intf_Cleanup(FSP_FILE_SYSTEM *FileSystem, PVOID FileNode, PWSTR FileName, BOOLEAN Delete) { struct fuse *f = FileSystem->UserContext; - struct fsp_fuse_file_desc *filedesc = - (PVOID)(UINT_PTR)Request->Req.Cleanup.UserContext2; + struct fsp_fuse_file_desc *filedesc = FileNode; /* * In Windows a DeleteFile/RemoveDirectory is the sequence of the following: @@ -1100,8 +1096,7 @@ static VOID fsp_fuse_intf_Close(FSP_FILE_SYSTEM *FileSystem, PVOID FileNode) { struct fuse *f = FileSystem->UserContext; - struct fsp_fuse_file_desc *filedesc = - (PVOID)(UINT_PTR)Request->Req.Close.UserContext2; + struct fsp_fuse_file_desc *filedesc = FileNode; struct fuse_file_info fi; memset(&fi, 0, sizeof fi); @@ -1136,8 +1131,7 @@ static NTSTATUS fsp_fuse_intf_Read(FSP_FILE_SYSTEM *FileSystem, PULONG PBytesTransferred) { struct fuse *f = FileSystem->UserContext; - struct fsp_fuse_file_desc *filedesc = - (PVOID)(UINT_PTR)Request->Req.Read.UserContext2; + struct fsp_fuse_file_desc *filedesc = FileNode; struct fuse_file_info fi; int bytes; NTSTATUS Result; @@ -1173,8 +1167,7 @@ static NTSTATUS fsp_fuse_intf_Write(FSP_FILE_SYSTEM *FileSystem, PULONG PBytesTransferred, FSP_FSCTL_FILE_INFO *FileInfo) { struct fuse *f = FileSystem->UserContext; - struct fsp_fuse_file_desc *filedesc = - (PVOID)(UINT_PTR)Request->Req.Write.UserContext2; + struct fsp_fuse_file_desc *filedesc = FileNode; UINT32 Uid, Gid, Mode; struct fuse_file_info fi; FSP_FSCTL_FILE_INFO FileInfoBuf; @@ -1235,8 +1228,7 @@ static NTSTATUS fsp_fuse_intf_Flush(FSP_FILE_SYSTEM *FileSystem, PVOID FileNode) { struct fuse *f = FileSystem->UserContext; - struct fsp_fuse_file_desc *filedesc = - (PVOID)(UINT_PTR)Request->Req.FlushBuffers.UserContext2; + struct fsp_fuse_file_desc *filedesc = FileNode; struct fuse_file_info fi; int err; NTSTATUS Result; @@ -1277,8 +1269,7 @@ static NTSTATUS fsp_fuse_intf_GetFileInfo(FSP_FILE_SYSTEM *FileSystem, FSP_FSCTL_FILE_INFO *FileInfo) { struct fuse *f = FileSystem->UserContext; - struct fsp_fuse_file_desc *filedesc = - (PVOID)(UINT_PTR)Request->Req.QueryInformation.UserContext2; + struct fsp_fuse_file_desc *filedesc = FileNode; UINT32 Uid, Gid, Mode; struct fuse_file_info fi; @@ -1297,8 +1288,7 @@ static NTSTATUS fsp_fuse_intf_SetBasicInfo(FSP_FILE_SYSTEM *FileSystem, FSP_FSCTL_FILE_INFO *FileInfo) { struct fuse *f = FileSystem->UserContext; - struct fsp_fuse_file_desc *filedesc = - (PVOID)(UINT_PTR)Request->Req.SetInformation.UserContext2; + struct fsp_fuse_file_desc *filedesc = FileNode; UINT32 Uid, Gid, Mode; struct fuse_file_info fi; FSP_FSCTL_FILE_INFO FileInfoBuf; @@ -1376,8 +1366,7 @@ static NTSTATUS fsp_fuse_intf_SetFileSize(FSP_FILE_SYSTEM *FileSystem, FSP_FSCTL_FILE_INFO *FileInfo) { struct fuse *f = FileSystem->UserContext; - struct fsp_fuse_file_desc *filedesc = - (PVOID)(UINT_PTR)Request->Req.SetInformation.UserContext2; + struct fsp_fuse_file_desc *filedesc = FileNode; UINT32 Uid, Gid, Mode; struct fuse_file_info fi; FSP_FSCTL_FILE_INFO FileInfoBuf; @@ -1460,8 +1449,7 @@ static NTSTATUS fsp_fuse_intf_CanDelete(FSP_FILE_SYSTEM *FileSystem, PVOID FileNode, PWSTR FileName) { struct fuse *f = FileSystem->UserContext; - struct fsp_fuse_file_desc *filedesc = - (PVOID)(UINT_PTR)Request->Req.SetInformation.UserContext2; + struct fsp_fuse_file_desc *filedesc = FileNode; struct fuse_file_info fi; struct fuse_dirhandle dh; int err; @@ -1500,8 +1488,7 @@ static NTSTATUS fsp_fuse_intf_Rename(FSP_FILE_SYSTEM *FileSystem, struct fsp_fuse_context_header *contexthdr = FSP_FUSE_HDR_FROM_CONTEXT(context); UINT32 Uid, Gid, Mode; FSP_FSCTL_FILE_INFO FileInfoBuf; - struct fsp_fuse_file_desc *filedesc = - (PVOID)(UINT_PTR)Request->Req.SetInformation.UserContext2; + struct fsp_fuse_file_desc *filedesc = FileNode; int err; NTSTATUS Result; @@ -1531,8 +1518,7 @@ static NTSTATUS fsp_fuse_intf_GetSecurity(FSP_FILE_SYSTEM *FileSystem, PSECURITY_DESCRIPTOR SecurityDescriptorBuf, SIZE_T *PSecurityDescriptorSize) { struct fuse *f = FileSystem->UserContext; - struct fsp_fuse_file_desc *filedesc = - (PVOID)(UINT_PTR)Request->Req.QuerySecurity.UserContext2; + struct fsp_fuse_file_desc *filedesc = FileNode; struct fuse_file_info fi; UINT32 FileAttributes; @@ -1550,8 +1536,7 @@ static NTSTATUS fsp_fuse_intf_SetSecurity(FSP_FILE_SYSTEM *FileSystem, SECURITY_INFORMATION SecurityInformation, PSECURITY_DESCRIPTOR Ignored) { struct fuse *f = FileSystem->UserContext; - struct fsp_fuse_file_desc *filedesc = - (PVOID)(UINT_PTR)Request->Req.SetSecurity.UserContext2; + struct fsp_fuse_file_desc *filedesc = FileNode; struct fuse_file_info fi; UINT32 Uid, Gid, Mode, NewUid, NewGid, NewMode; FSP_FSCTL_FILE_INFO FileInfo; @@ -1684,8 +1669,7 @@ static NTSTATUS fsp_fuse_intf_ReadDirectory(FSP_FILE_SYSTEM *FileSystem, PULONG PBytesTransferred) { struct fuse *f = FileSystem->UserContext; - struct fsp_fuse_file_desc *filedesc = - (PVOID)(UINT_PTR)Request->Req.QueryDirectory.UserContext2; + struct fsp_fuse_file_desc *filedesc = FileNode; struct fuse_file_info fi; struct fuse_dirhandle dh; struct fsp_fuse_dirinfo *di; @@ -1891,8 +1875,7 @@ static NTSTATUS fsp_fuse_intf_GetReparsePoint(FSP_FILE_SYSTEM *FileSystem, PVOID FileNode, PWSTR FileName, PVOID Buffer, PSIZE_T PSize) { - struct fsp_fuse_file_desc *filedesc = - (PVOID)(UINT_PTR)Request->Req.FileSystemControl.UserContext2; + struct fsp_fuse_file_desc *filedesc = FileNode; struct fuse_file_info fi; memset(&fi, 0, sizeof fi); @@ -1909,8 +1892,7 @@ static NTSTATUS fsp_fuse_intf_SetReparsePoint(FSP_FILE_SYSTEM *FileSystem, { struct fuse *f = FileSystem->UserContext; struct fuse_context *context = fsp_fuse_get_context(f->env); - struct fsp_fuse_file_desc *filedesc = - (PVOID)(UINT_PTR)Request->Req.FileSystemControl.UserContext2; + struct fsp_fuse_file_desc *filedesc = FileNode; struct fuse_file_info fi; UINT32 Uid, Gid, Mode, Dev; FSP_FSCTL_FILE_INFO FileInfo; diff --git a/src/dll/fuse/library.h b/src/dll/fuse/library.h index a79fd932..c398501e 100644 --- a/src/dll/fuse/library.h +++ b/src/dll/fuse/library.h @@ -51,8 +51,6 @@ struct fuse struct fsp_fuse_context_header { - FSP_FSCTL_TRANSACT_REQ *Request; - FSP_FSCTL_TRANSACT_RSP *Response; char *PosixPath; __declspec(align(MEMORY_ALLOCATION_ALIGNMENT)) UINT8 ContextBuf[]; };