inc: fsctl: UmFileNodeIsUserContext2

This commit is contained in:
Bill Zissimopoulos 2016-09-21 10:40:18 -07:00
parent 76aabecbfb
commit 3ce490d405
7 changed files with 65 additions and 70 deletions

View File

@ -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_BATCH_BUFFER_SIZEMIN 16384
#define FSP_FSCTL_TRANSACT_BUFFER_SIZEMIN FSP_FSCTL_TRANSACT_REQ_SIZEMAX #define FSP_FSCTL_TRANSACT_BUFFER_SIZEMIN FSP_FSCTL_TRANSACT_REQ_SIZEMAX
#define FSP_FSCTL_TRANSACT_USERCONTEXT(s,i) (((PUINT64)&(s).UserContext)[i])
/* 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 */
@ -144,6 +146,10 @@ typedef struct
UINT32 HardLinks:1; /* unimplemented; set to 0 */ UINT32 HardLinks:1; /* unimplemented; set to 0 */
UINT32 ExtendedAttributes:1; /* unimplemented; set to 0 */ UINT32 ExtendedAttributes:1; /* unimplemented; set to 0 */
UINT32 ReadOnlyVolume:1; 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 Prefix[FSP_FSCTL_VOLUME_PREFIX_SIZE / sizeof(WCHAR)]; /* UNC prefix (\Server\Share) */
WCHAR FileSystemName[FSP_FSCTL_VOLUME_FSNAME_SIZE / sizeof(WCHAR)]; WCHAR FileSystemName[FSP_FSCTL_VOLUME_FSNAME_SIZE / sizeof(WCHAR)];
} FSP_FSCTL_VOLUME_PARAMS; } FSP_FSCTL_VOLUME_PARAMS;

View File

@ -795,6 +795,7 @@ typedef struct _FSP_FILE_SYSTEM
UINT32 DebugLog; UINT32 DebugLog;
FSP_FILE_SYSTEM_OPERATION_GUARD_STRATEGY OpGuardStrategy; FSP_FILE_SYSTEM_OPERATION_GUARD_STRATEGY OpGuardStrategy;
SRWLOCK OpGuardLock; SRWLOCK OpGuardLock;
BOOLEAN UmFileNodeIsUserContext2;
} FSP_FILE_SYSTEM; } FSP_FILE_SYSTEM;
/** /**
* Create a file system object. * Create a file system object.

View File

@ -106,6 +106,8 @@ FSP_API NTSTATUS FspFileSystemCreate(PWSTR DevicePath,
FileSystem->EnterOperation = FspFileSystemOpEnter; FileSystem->EnterOperation = FspFileSystemOpEnter;
FileSystem->LeaveOperation = FspFileSystemOpLeave; FileSystem->LeaveOperation = FspFileSystemOpLeave;
FileSystem->UmFileNodeIsUserContext2 = !!VolumeParams->UmFileNodeIsUserContext2;
*PFileSystem = FileSystem; *PFileSystem = FileSystem;
return STATUS_SUCCESS; return STATUS_SUCCESS;

View File

@ -17,6 +17,9 @@
#include <dll/library.h> #include <dll/library.h>
#define USERCONTEXT(s) \
FSP_FSCTL_TRANSACT_USERCONTEXT(s, FileSystem->UmFileNodeIsUserContext2)
FSP_API NTSTATUS FspFileSystemOpEnter(FSP_FILE_SYSTEM *FileSystem, FSP_API NTSTATUS FspFileSystemOpEnter(FSP_FILE_SYSTEM *FileSystem,
FSP_FSCTL_TRANSACT_REQ *Request, FSP_FSCTL_TRANSACT_RSP *Response) 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) || 10/*FileRenameInformation*/ == Request->Req.SetInformation.FileInformationClass) ||
FspFsctlTransactSetVolumeInformationKind == Request->Kind || FspFsctlTransactSetVolumeInformationKind == Request->Kind ||
(FspFsctlTransactFlushBuffersKind == Request->Kind && (FspFsctlTransactFlushBuffersKind == Request->Kind &&
0 == Request->Req.FlushBuffers.UserContext)) 0 == Request->Req.FlushBuffers.UserContext &&
0 == Request->Req.FlushBuffers.UserContext2))
{ {
AcquireSRWLockExclusive(&FileSystem->OpGuardLock); AcquireSRWLockExclusive(&FileSystem->OpGuardLock);
} }
@ -68,7 +72,8 @@ FSP_API NTSTATUS FspFileSystemOpLeave(FSP_FILE_SYSTEM *FileSystem,
10/*FileRenameInformation*/ == Request->Req.SetInformation.FileInformationClass) || 10/*FileRenameInformation*/ == Request->Req.SetInformation.FileInformationClass) ||
FspFsctlTransactSetVolumeInformationKind == Request->Kind || FspFsctlTransactSetVolumeInformationKind == Request->Kind ||
(FspFsctlTransactFlushBuffersKind == Request->Kind && (FspFsctlTransactFlushBuffersKind == Request->Kind &&
0 == Request->Req.FlushBuffers.UserContext)) 0 == Request->Req.FlushBuffers.UserContext &&
0 == Request->Req.FlushBuffers.UserContext2))
{ {
ReleaseSRWLockExclusive(&FileSystem->OpGuardLock); ReleaseSRWLockExclusive(&FileSystem->OpGuardLock);
} }
@ -338,7 +343,7 @@ static NTSTATUS FspFileSystemOpCreate_FileCreate(FSP_FILE_SYSTEM *FileSystem,
return Result; return Result;
Response->IoStatus.Information = FILE_CREATED; 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; Response->Rsp.Create.Opened.GrantedAccess = GrantedAccess;
memcpy(&Response->Rsp.Create.Opened.FileInfo, &FileInfo, sizeof FileInfo); memcpy(&Response->Rsp.Create.Opened.FileInfo, &FileInfo, sizeof FileInfo);
return STATUS_SUCCESS; return STATUS_SUCCESS;
@ -365,7 +370,7 @@ static NTSTATUS FspFileSystemOpCreate_FileOpen(FSP_FILE_SYSTEM *FileSystem,
return Result; return Result;
Response->IoStatus.Information = FILE_OPENED; 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; Response->Rsp.Create.Opened.GrantedAccess = GrantedAccess;
memcpy(&Response->Rsp.Create.Opened.FileInfo, &FileInfo, sizeof FileInfo); memcpy(&Response->Rsp.Create.Opened.FileInfo, &FileInfo, sizeof FileInfo);
return STATUS_SUCCESS; return STATUS_SUCCESS;
@ -428,7 +433,7 @@ static NTSTATUS FspFileSystemOpCreate_FileOpenIf(FSP_FILE_SYSTEM *FileSystem,
} }
Response->IoStatus.Information = Create ? FILE_CREATED : FILE_OPENED; 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; Response->Rsp.Create.Opened.GrantedAccess = GrantedAccess;
memcpy(&Response->Rsp.Create.Opened.FileInfo, &FileInfo, sizeof FileInfo); memcpy(&Response->Rsp.Create.Opened.FileInfo, &FileInfo, sizeof FileInfo);
return STATUS_SUCCESS; return STATUS_SUCCESS;
@ -456,7 +461,7 @@ static NTSTATUS FspFileSystemOpCreate_FileOverwrite(FSP_FILE_SYSTEM *FileSystem,
return Result; return Result;
Response->IoStatus.Information = Supersede ? FILE_SUPERSEDED : FILE_OVERWRITTEN; 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; Response->Rsp.Create.Opened.GrantedAccess = GrantedAccess;
memcpy(&Response->Rsp.Create.Opened.FileInfo, &FileInfo, sizeof FileInfo); memcpy(&Response->Rsp.Create.Opened.FileInfo, &FileInfo, sizeof FileInfo);
return STATUS_SUCCESS; return STATUS_SUCCESS;
@ -519,7 +524,7 @@ static NTSTATUS FspFileSystemOpCreate_FileOverwriteIf(FSP_FILE_SYSTEM *FileSyste
} }
Response->IoStatus.Information = Create ? FILE_CREATED : FILE_OVERWRITTEN; 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; Response->Rsp.Create.Opened.GrantedAccess = GrantedAccess;
memcpy(&Response->Rsp.Create.Opened.FileInfo, &FileInfo, sizeof FileInfo); memcpy(&Response->Rsp.Create.Opened.FileInfo, &FileInfo, sizeof FileInfo);
return STATUS_SUCCESS; return STATUS_SUCCESS;
@ -558,7 +563,7 @@ static NTSTATUS FspFileSystemOpCreate_FileOpenTargetDirectory(FSP_FILE_SYSTEM *F
} }
Response->IoStatus.Information = Information; 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; Response->Rsp.Create.Opened.GrantedAccess = GrantedAccess;
memcpy(&Response->Rsp.Create.Opened.FileInfo, &FileInfo, sizeof FileInfo); memcpy(&Response->Rsp.Create.Opened.FileInfo, &FileInfo, sizeof FileInfo);
return STATUS_SUCCESS; return STATUS_SUCCESS;
@ -604,7 +609,7 @@ FSP_API NTSTATUS FspFileSystemOpOverwrite(FSP_FILE_SYSTEM *FileSystem,
memset(&FileInfo, 0, sizeof FileInfo); memset(&FileInfo, 0, sizeof FileInfo);
Result = FileSystem->Interface->Overwrite(FileSystem, Request, Result = FileSystem->Interface->Overwrite(FileSystem, Request,
(PVOID)Request->Req.Overwrite.UserContext, (PVOID)USERCONTEXT(Request->Req.Overwrite),
Request->Req.Overwrite.FileAttributes, Request->Req.Overwrite.FileAttributes,
Request->Req.Overwrite.Supersede, Request->Req.Overwrite.Supersede,
&FileInfo); &FileInfo);
@ -612,7 +617,7 @@ FSP_API NTSTATUS FspFileSystemOpOverwrite(FSP_FILE_SYSTEM *FileSystem,
{ {
if (0 != FileSystem->Interface->Close) if (0 != FileSystem->Interface->Close)
FileSystem->Interface->Close(FileSystem, Request, FileSystem->Interface->Close(FileSystem, Request,
(PVOID)Request->Req.Overwrite.UserContext); (PVOID)USERCONTEXT(Request->Req.Overwrite));
return Result; return Result;
} }
@ -625,7 +630,7 @@ FSP_API NTSTATUS FspFileSystemOpCleanup(FSP_FILE_SYSTEM *FileSystem,
{ {
if (0 != FileSystem->Interface->Cleanup) if (0 != FileSystem->Interface->Cleanup)
FileSystem->Interface->Cleanup(FileSystem, Request, 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->FileName.Size ? (PWSTR)Request->Buffer : 0,
0 != Request->Req.Cleanup.Delete); 0 != Request->Req.Cleanup.Delete);
@ -637,7 +642,7 @@ FSP_API NTSTATUS FspFileSystemOpClose(FSP_FILE_SYSTEM *FileSystem,
{ {
if (0 != FileSystem->Interface->Close) if (0 != FileSystem->Interface->Close)
FileSystem->Interface->Close(FileSystem, Request, FileSystem->Interface->Close(FileSystem, Request,
(PVOID)Request->Req.Close.UserContext); (PVOID)USERCONTEXT(Request->Req.Close));
return STATUS_SUCCESS; return STATUS_SUCCESS;
} }
@ -653,7 +658,7 @@ FSP_API NTSTATUS FspFileSystemOpRead(FSP_FILE_SYSTEM *FileSystem,
BytesTransferred = 0; BytesTransferred = 0;
Result = FileSystem->Interface->Read(FileSystem, Request, Result = FileSystem->Interface->Read(FileSystem, Request,
(PVOID)Request->Req.Read.UserContext, (PVOID)USERCONTEXT(Request->Req.Read),
(PVOID)Request->Req.Read.Address, (PVOID)Request->Req.Read.Address,
Request->Req.Read.Offset, Request->Req.Read.Offset,
Request->Req.Read.Length, Request->Req.Read.Length,
@ -679,7 +684,7 @@ FSP_API NTSTATUS FspFileSystemOpWrite(FSP_FILE_SYSTEM *FileSystem,
BytesTransferred = 0; BytesTransferred = 0;
Result = FileSystem->Interface->Write(FileSystem, Request, Result = FileSystem->Interface->Write(FileSystem, Request,
(PVOID)Request->Req.Write.UserContext, (PVOID)USERCONTEXT(Request->Req.Write),
(PVOID)Request->Req.Write.Address, (PVOID)Request->Req.Write.Address,
Request->Req.Write.Offset, Request->Req.Write.Offset,
Request->Req.Write.Length, Request->Req.Write.Length,
@ -706,7 +711,7 @@ FSP_API NTSTATUS FspFileSystemOpFlushBuffers(FSP_FILE_SYSTEM *FileSystem,
return STATUS_SUCCESS; /* liar! */ return STATUS_SUCCESS; /* liar! */
return FileSystem->Interface->Flush(FileSystem, Request, return FileSystem->Interface->Flush(FileSystem, Request,
(PVOID)Request->Req.FlushBuffers.UserContext); (PVOID)USERCONTEXT(Request->Req.FlushBuffers));
} }
FSP_API NTSTATUS FspFileSystemOpQueryInformation(FSP_FILE_SYSTEM *FileSystem, 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); memset(&FileInfo, 0, sizeof FileInfo);
Result = FileSystem->Interface->GetFileInfo(FileSystem, Request, Result = FileSystem->Interface->GetFileInfo(FileSystem, Request,
(PVOID)Request->Req.QueryInformation.UserContext, &FileInfo); (PVOID)USERCONTEXT(Request->Req.QueryInformation), &FileInfo);
if (!NT_SUCCESS(Result)) if (!NT_SUCCESS(Result))
return Result; return Result;
@ -741,7 +746,7 @@ FSP_API NTSTATUS FspFileSystemOpSetInformation(FSP_FILE_SYSTEM *FileSystem,
case 4/*FileBasicInformation*/: case 4/*FileBasicInformation*/:
if (0 != FileSystem->Interface->SetBasicInfo) if (0 != FileSystem->Interface->SetBasicInfo)
Result = FileSystem->Interface->SetBasicInfo(FileSystem, Request, 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.FileAttributes,
Request->Req.SetInformation.Info.Basic.CreationTime, Request->Req.SetInformation.Info.Basic.CreationTime,
Request->Req.SetInformation.Info.Basic.LastAccessTime, Request->Req.SetInformation.Info.Basic.LastAccessTime,
@ -751,14 +756,14 @@ FSP_API NTSTATUS FspFileSystemOpSetInformation(FSP_FILE_SYSTEM *FileSystem,
case 19/*FileAllocationInformation*/: case 19/*FileAllocationInformation*/:
if (0 != FileSystem->Interface->SetFileSize) if (0 != FileSystem->Interface->SetFileSize)
Result = FileSystem->Interface->SetFileSize(FileSystem, Request, Result = FileSystem->Interface->SetFileSize(FileSystem, Request,
(PVOID)Request->Req.SetInformation.UserContext, (PVOID)USERCONTEXT(Request->Req.SetInformation),
Request->Req.SetInformation.Info.Allocation.AllocationSize, TRUE, Request->Req.SetInformation.Info.Allocation.AllocationSize, TRUE,
&FileInfo); &FileInfo);
break; break;
case 20/*FileEndOfFileInformation*/: case 20/*FileEndOfFileInformation*/:
if (0 != FileSystem->Interface->SetFileSize) if (0 != FileSystem->Interface->SetFileSize)
Result = FileSystem->Interface->SetFileSize(FileSystem, Request, Result = FileSystem->Interface->SetFileSize(FileSystem, Request,
(PVOID)Request->Req.SetInformation.UserContext, (PVOID)USERCONTEXT(Request->Req.SetInformation),
Request->Req.SetInformation.Info.EndOfFile.FileSize, FALSE, Request->Req.SetInformation.Info.EndOfFile.FileSize, FALSE,
&FileInfo); &FileInfo);
break; break;
@ -766,7 +771,7 @@ FSP_API NTSTATUS FspFileSystemOpSetInformation(FSP_FILE_SYSTEM *FileSystem,
if (0 != FileSystem->Interface->GetFileInfo) if (0 != FileSystem->Interface->GetFileInfo)
{ {
Result = FileSystem->Interface->GetFileInfo(FileSystem, Request, 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)) if (NT_SUCCESS(Result) && 0 != (FileInfo.FileAttributes & FILE_ATTRIBUTE_READONLY))
{ {
Result = STATUS_CANNOT_DELETE; Result = STATUS_CANNOT_DELETE;
@ -776,7 +781,7 @@ FSP_API NTSTATUS FspFileSystemOpSetInformation(FSP_FILE_SYSTEM *FileSystem,
if (0 != FileSystem->Interface->CanDelete) if (0 != FileSystem->Interface->CanDelete)
if (Request->Req.SetInformation.Info.Disposition.Delete) if (Request->Req.SetInformation.Info.Disposition.Delete)
Result = FileSystem->Interface->CanDelete(FileSystem, Request, Result = FileSystem->Interface->CanDelete(FileSystem, Request,
(PVOID)Request->Req.SetInformation.UserContext, (PVOID)USERCONTEXT(Request->Req.SetInformation),
(PWSTR)Request->Buffer); (PWSTR)Request->Buffer);
else else
Result = STATUS_SUCCESS; Result = STATUS_SUCCESS;
@ -793,7 +798,7 @@ FSP_API NTSTATUS FspFileSystemOpSetInformation(FSP_FILE_SYSTEM *FileSystem,
break; break;
} }
Result = FileSystem->Interface->Rename(FileSystem, Request, Result = FileSystem->Interface->Rename(FileSystem, Request,
(PVOID)Request->Req.SetInformation.UserContext, (PVOID)USERCONTEXT(Request->Req.SetInformation),
(PWSTR)Request->Buffer, (PWSTR)Request->Buffer,
(PWSTR)(Request->Buffer + Request->Req.SetInformation.Info.Rename.NewFileName.Offset), (PWSTR)(Request->Buffer + Request->Req.SetInformation.Info.Rename.NewFileName.Offset),
0 != Request->Req.SetInformation.Info.Rename.AccessToken); 0 != Request->Req.SetInformation.Info.Rename.AccessToken);
@ -862,7 +867,7 @@ FSP_API NTSTATUS FspFileSystemOpQueryDirectory(FSP_FILE_SYSTEM *FileSystem,
BytesTransferred = 0; BytesTransferred = 0;
Result = FileSystem->Interface->ReadDirectory(FileSystem, Request, Result = FileSystem->Interface->ReadDirectory(FileSystem, Request,
(PVOID)Request->Req.QueryDirectory.UserContext, (PVOID)USERCONTEXT(Request->Req.QueryDirectory),
(PVOID)Request->Req.QueryDirectory.Address, (PVOID)Request->Req.QueryDirectory.Address,
Request->Req.QueryDirectory.Offset, Request->Req.QueryDirectory.Offset,
Request->Req.QueryDirectory.Length, Request->Req.QueryDirectory.Length,
@ -896,7 +901,7 @@ FSP_API NTSTATUS FspFileSystemOpFileSystemControl(FSP_FILE_SYSTEM *FileSystem,
Size = FSP_FSCTL_TRANSACT_RSP_BUFFER_SIZEMAX; Size = FSP_FSCTL_TRANSACT_RSP_BUFFER_SIZEMAX;
Result = FileSystem->Interface->GetReparsePoint(FileSystem, Request, Result = FileSystem->Interface->GetReparsePoint(FileSystem, Request,
(PVOID)Request->Req.FileSystemControl.UserContext, (PVOID)USERCONTEXT(Request->Req.FileSystemControl),
(PWSTR)Request->Buffer, ReparseData, &Size); (PWSTR)Request->Buffer, ReparseData, &Size);
if (NT_SUCCESS(Result)) if (NT_SUCCESS(Result))
{ {
@ -913,7 +918,7 @@ FSP_API NTSTATUS FspFileSystemOpFileSystemControl(FSP_FILE_SYSTEM *FileSystem,
(Request->Buffer + Request->Req.FileSystemControl.Buffer.Offset); (Request->Buffer + Request->Req.FileSystemControl.Buffer.Offset);
Result = FileSystem->Interface->SetReparsePoint(FileSystem, Request, Result = FileSystem->Interface->SetReparsePoint(FileSystem, Request,
(PVOID)Request->Req.FileSystemControl.UserContext, (PVOID)USERCONTEXT(Request->Req.FileSystemControl),
(PWSTR)Request->Buffer, (PWSTR)Request->Buffer,
ReparseData, ReparseData,
Request->Req.FileSystemControl.Buffer.Size); Request->Req.FileSystemControl.Buffer.Size);
@ -926,7 +931,7 @@ FSP_API NTSTATUS FspFileSystemOpFileSystemControl(FSP_FILE_SYSTEM *FileSystem,
(Request->Buffer + Request->Req.FileSystemControl.Buffer.Offset); (Request->Buffer + Request->Req.FileSystemControl.Buffer.Offset);
Result = FileSystem->Interface->DeleteReparsePoint(FileSystem, Request, Result = FileSystem->Interface->DeleteReparsePoint(FileSystem, Request,
(PVOID)Request->Req.FileSystemControl.UserContext, (PVOID)USERCONTEXT(Request->Req.FileSystemControl),
(PWSTR)Request->Buffer, (PWSTR)Request->Buffer,
ReparseData, ReparseData,
Request->Req.FileSystemControl.Buffer.Size); 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; SecurityDescriptorSize = FSP_FSCTL_TRANSACT_RSP_SIZEMAX - sizeof *Response;
Result = FileSystem->Interface->GetSecurity(FileSystem, Request, Result = FileSystem->Interface->GetSecurity(FileSystem, Request,
(PVOID)Request->Req.QuerySecurity.UserContext, (PVOID)USERCONTEXT(Request->Req.QuerySecurity),
Response->Buffer, &SecurityDescriptorSize); Response->Buffer, &SecurityDescriptorSize);
if (!NT_SUCCESS(Result)) if (!NT_SUCCESS(Result))
return STATUS_BUFFER_OVERFLOW != Result ? Result : STATUS_INVALID_SECURITY_DESCR; 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 STATUS_INVALID_DEVICE_REQUEST;
return FileSystem->Interface->SetSecurity(FileSystem, Request, return FileSystem->Interface->SetSecurity(FileSystem, Request,
(PVOID)Request->Req.SetSecurity.UserContext, (PVOID)USERCONTEXT(Request->Req.SetSecurity),
Request->Req.SetSecurity.SecurityInformation, Request->Req.SetSecurity.SecurityInformation,
(PSECURITY_DESCRIPTOR)Request->Buffer); (PSECURITY_DESCRIPTOR)Request->Buffer);
} }

View File

@ -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.ReparsePointsAccessCheck = FALSE;
opt_data.VolumeParams.NamedStreams = !!opt_data.NamedStreams; opt_data.VolumeParams.NamedStreams = !!opt_data.NamedStreams;
opt_data.VolumeParams.ReadOnlyVolume = !!opt_data.ReadOnlyVolume; opt_data.VolumeParams.ReadOnlyVolume = !!opt_data.ReadOnlyVolume;
opt_data.VolumeParams.UmFileNodeIsUserContext2 = TRUE;
if (L'\0' == opt_data.VolumeParams.FileSystemName[0]) if (L'\0' == opt_data.VolumeParams.FileSystemName[0])
memcpy(opt_data.VolumeParams.FileSystemName, L"FUSE", 5 * sizeof(WCHAR)); memcpy(opt_data.VolumeParams.FileSystemName, L"FUSE", 5 * sizeof(WCHAR));

View File

@ -32,7 +32,8 @@ VOID fsp_fuse_op_enter_lock(FSP_FILE_SYSTEM *FileSystem,
10/*FileRenameInformation*/ == Request->Req.SetInformation.FileInformationClass) || 10/*FileRenameInformation*/ == Request->Req.SetInformation.FileInformationClass) ||
FspFsctlTransactSetVolumeInformationKind == Request->Kind || FspFsctlTransactSetVolumeInformationKind == Request->Kind ||
(FspFsctlTransactFlushBuffersKind == 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 */ /* FSCTL_SET_REPARSE_POINT manipulates namespace */
(FspFsctlTransactFileSystemControlKind == Request->Kind && (FspFsctlTransactFileSystemControlKind == Request->Kind &&
FSCTL_SET_REPARSE_POINT == Request->Req.FileSystemControl.FsControlCode)) 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) || 10/*FileRenameInformation*/ == Request->Req.SetInformation.FileInformationClass) ||
FspFsctlTransactSetVolumeInformationKind == Request->Kind || FspFsctlTransactSetVolumeInformationKind == Request->Kind ||
(FspFsctlTransactFlushBuffersKind == 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 */ /* FSCTL_SET_REPARSE_POINT manipulates namespace */
(FspFsctlTransactFileSystemControlKind == Request->Kind && (FspFsctlTransactFileSystemControlKind == Request->Kind &&
FSCTL_SET_REPARSE_POINT == Request->Req.FileSystemControl.FsControlCode)) FSCTL_SET_REPARSE_POINT == Request->Req.FileSystemControl.FsControlCode))
@ -223,8 +225,6 @@ NTSTATUS fsp_fuse_op_enter(FSP_FILE_SYSTEM *FileSystem,
context->gid = Gid; context->gid = Gid;
contexthdr = FSP_FUSE_HDR_FROM_CONTEXT(context); contexthdr = FSP_FUSE_HDR_FROM_CONTEXT(context);
contexthdr->Request = Request;
contexthdr->Response = Response;
contexthdr->PosixPath = PosixPath; contexthdr->PosixPath = PosixPath;
Result = STATUS_SUCCESS; Result = STATUS_SUCCESS;
@ -876,7 +876,7 @@ static NTSTATUS fsp_fuse_intf_Create(FSP_FILE_SYSTEM *FileSystem,
if (!NT_SUCCESS(Result)) if (!NT_SUCCESS(Result))
goto exit; goto exit;
*PFileNode = 0; *PFileNode = filedesc;
memcpy(FileInfo, &FileInfoBuf, sizeof FileInfoBuf); memcpy(FileInfo, &FileInfoBuf, sizeof FileInfoBuf);
filedesc->PosixPath = contexthdr->PosixPath; filedesc->PosixPath = contexthdr->PosixPath;
@ -887,7 +887,6 @@ static NTSTATUS fsp_fuse_intf_Create(FSP_FILE_SYSTEM *FileSystem,
filedesc->DirBuffer = 0; filedesc->DirBuffer = 0;
filedesc->DirBufferSize = 0; filedesc->DirBufferSize = 0;
contexthdr->PosixPath = 0; contexthdr->PosixPath = 0;
contexthdr->Response->Rsp.Create.Opened.UserContext2 = (UINT64)(UINT_PTR)filedesc;
Result = STATUS_SUCCESS; Result = STATUS_SUCCESS;
@ -996,7 +995,7 @@ static NTSTATUS fsp_fuse_intf_Open(FSP_FILE_SYSTEM *FileSystem,
* Ignore fuse_file_info::nonseekable. * Ignore fuse_file_info::nonseekable.
*/ */
*PFileNode = 0; *PFileNode = filedesc;
memcpy(FileInfo, &FileInfoBuf, sizeof FileInfoBuf); memcpy(FileInfo, &FileInfoBuf, sizeof FileInfoBuf);
filedesc->PosixPath = contexthdr->PosixPath; filedesc->PosixPath = contexthdr->PosixPath;
@ -1007,7 +1006,6 @@ static NTSTATUS fsp_fuse_intf_Open(FSP_FILE_SYSTEM *FileSystem,
filedesc->DirBuffer = 0; filedesc->DirBuffer = 0;
filedesc->DirBufferSize = 0; filedesc->DirBufferSize = 0;
contexthdr->PosixPath = 0; contexthdr->PosixPath = 0;
contexthdr->Response->Rsp.Create.Opened.UserContext2 = (UINT64)(UINT_PTR)filedesc;
Result = STATUS_SUCCESS; Result = STATUS_SUCCESS;
@ -1024,8 +1022,7 @@ static NTSTATUS fsp_fuse_intf_Overwrite(FSP_FILE_SYSTEM *FileSystem,
FSP_FSCTL_FILE_INFO *FileInfo) FSP_FSCTL_FILE_INFO *FileInfo)
{ {
struct fuse *f = FileSystem->UserContext; struct fuse *f = FileSystem->UserContext;
struct fsp_fuse_file_desc *filedesc = struct fsp_fuse_file_desc *filedesc = FileNode;
(PVOID)(UINT_PTR)Request->Req.Overwrite.UserContext2;
UINT32 Uid, Gid, Mode; UINT32 Uid, Gid, Mode;
struct fuse_file_info fi; struct fuse_file_info fi;
int err; int err;
@ -1062,8 +1059,7 @@ static VOID fsp_fuse_intf_Cleanup(FSP_FILE_SYSTEM *FileSystem,
PVOID FileNode, PWSTR FileName, BOOLEAN Delete) PVOID FileNode, PWSTR FileName, BOOLEAN Delete)
{ {
struct fuse *f = FileSystem->UserContext; struct fuse *f = FileSystem->UserContext;
struct fsp_fuse_file_desc *filedesc = struct fsp_fuse_file_desc *filedesc = FileNode;
(PVOID)(UINT_PTR)Request->Req.Cleanup.UserContext2;
/* /*
* In Windows a DeleteFile/RemoveDirectory is the sequence of the following: * 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) PVOID FileNode)
{ {
struct fuse *f = FileSystem->UserContext; struct fuse *f = FileSystem->UserContext;
struct fsp_fuse_file_desc *filedesc = struct fsp_fuse_file_desc *filedesc = FileNode;
(PVOID)(UINT_PTR)Request->Req.Close.UserContext2;
struct fuse_file_info fi; struct fuse_file_info fi;
memset(&fi, 0, sizeof fi); memset(&fi, 0, sizeof fi);
@ -1136,8 +1131,7 @@ static NTSTATUS fsp_fuse_intf_Read(FSP_FILE_SYSTEM *FileSystem,
PULONG PBytesTransferred) PULONG PBytesTransferred)
{ {
struct fuse *f = FileSystem->UserContext; struct fuse *f = FileSystem->UserContext;
struct fsp_fuse_file_desc *filedesc = struct fsp_fuse_file_desc *filedesc = FileNode;
(PVOID)(UINT_PTR)Request->Req.Read.UserContext2;
struct fuse_file_info fi; struct fuse_file_info fi;
int bytes; int bytes;
NTSTATUS Result; NTSTATUS Result;
@ -1173,8 +1167,7 @@ static NTSTATUS fsp_fuse_intf_Write(FSP_FILE_SYSTEM *FileSystem,
PULONG PBytesTransferred, FSP_FSCTL_FILE_INFO *FileInfo) PULONG PBytesTransferred, FSP_FSCTL_FILE_INFO *FileInfo)
{ {
struct fuse *f = FileSystem->UserContext; struct fuse *f = FileSystem->UserContext;
struct fsp_fuse_file_desc *filedesc = struct fsp_fuse_file_desc *filedesc = FileNode;
(PVOID)(UINT_PTR)Request->Req.Write.UserContext2;
UINT32 Uid, Gid, Mode; UINT32 Uid, Gid, Mode;
struct fuse_file_info fi; struct fuse_file_info fi;
FSP_FSCTL_FILE_INFO FileInfoBuf; FSP_FSCTL_FILE_INFO FileInfoBuf;
@ -1235,8 +1228,7 @@ static NTSTATUS fsp_fuse_intf_Flush(FSP_FILE_SYSTEM *FileSystem,
PVOID FileNode) PVOID FileNode)
{ {
struct fuse *f = FileSystem->UserContext; struct fuse *f = FileSystem->UserContext;
struct fsp_fuse_file_desc *filedesc = struct fsp_fuse_file_desc *filedesc = FileNode;
(PVOID)(UINT_PTR)Request->Req.FlushBuffers.UserContext2;
struct fuse_file_info fi; struct fuse_file_info fi;
int err; int err;
NTSTATUS Result; NTSTATUS Result;
@ -1277,8 +1269,7 @@ static NTSTATUS fsp_fuse_intf_GetFileInfo(FSP_FILE_SYSTEM *FileSystem,
FSP_FSCTL_FILE_INFO *FileInfo) FSP_FSCTL_FILE_INFO *FileInfo)
{ {
struct fuse *f = FileSystem->UserContext; struct fuse *f = FileSystem->UserContext;
struct fsp_fuse_file_desc *filedesc = struct fsp_fuse_file_desc *filedesc = FileNode;
(PVOID)(UINT_PTR)Request->Req.QueryInformation.UserContext2;
UINT32 Uid, Gid, Mode; UINT32 Uid, Gid, Mode;
struct fuse_file_info fi; struct fuse_file_info fi;
@ -1297,8 +1288,7 @@ static NTSTATUS fsp_fuse_intf_SetBasicInfo(FSP_FILE_SYSTEM *FileSystem,
FSP_FSCTL_FILE_INFO *FileInfo) FSP_FSCTL_FILE_INFO *FileInfo)
{ {
struct fuse *f = FileSystem->UserContext; struct fuse *f = FileSystem->UserContext;
struct fsp_fuse_file_desc *filedesc = struct fsp_fuse_file_desc *filedesc = FileNode;
(PVOID)(UINT_PTR)Request->Req.SetInformation.UserContext2;
UINT32 Uid, Gid, Mode; UINT32 Uid, Gid, Mode;
struct fuse_file_info fi; struct fuse_file_info fi;
FSP_FSCTL_FILE_INFO FileInfoBuf; FSP_FSCTL_FILE_INFO FileInfoBuf;
@ -1376,8 +1366,7 @@ static NTSTATUS fsp_fuse_intf_SetFileSize(FSP_FILE_SYSTEM *FileSystem,
FSP_FSCTL_FILE_INFO *FileInfo) FSP_FSCTL_FILE_INFO *FileInfo)
{ {
struct fuse *f = FileSystem->UserContext; struct fuse *f = FileSystem->UserContext;
struct fsp_fuse_file_desc *filedesc = struct fsp_fuse_file_desc *filedesc = FileNode;
(PVOID)(UINT_PTR)Request->Req.SetInformation.UserContext2;
UINT32 Uid, Gid, Mode; UINT32 Uid, Gid, Mode;
struct fuse_file_info fi; struct fuse_file_info fi;
FSP_FSCTL_FILE_INFO FileInfoBuf; FSP_FSCTL_FILE_INFO FileInfoBuf;
@ -1460,8 +1449,7 @@ static NTSTATUS fsp_fuse_intf_CanDelete(FSP_FILE_SYSTEM *FileSystem,
PVOID FileNode, PWSTR FileName) PVOID FileNode, PWSTR FileName)
{ {
struct fuse *f = FileSystem->UserContext; struct fuse *f = FileSystem->UserContext;
struct fsp_fuse_file_desc *filedesc = struct fsp_fuse_file_desc *filedesc = FileNode;
(PVOID)(UINT_PTR)Request->Req.SetInformation.UserContext2;
struct fuse_file_info fi; struct fuse_file_info fi;
struct fuse_dirhandle dh; struct fuse_dirhandle dh;
int err; 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); struct fsp_fuse_context_header *contexthdr = FSP_FUSE_HDR_FROM_CONTEXT(context);
UINT32 Uid, Gid, Mode; UINT32 Uid, Gid, Mode;
FSP_FSCTL_FILE_INFO FileInfoBuf; FSP_FSCTL_FILE_INFO FileInfoBuf;
struct fsp_fuse_file_desc *filedesc = struct fsp_fuse_file_desc *filedesc = FileNode;
(PVOID)(UINT_PTR)Request->Req.SetInformation.UserContext2;
int err; int err;
NTSTATUS Result; NTSTATUS Result;
@ -1531,8 +1518,7 @@ static NTSTATUS fsp_fuse_intf_GetSecurity(FSP_FILE_SYSTEM *FileSystem,
PSECURITY_DESCRIPTOR SecurityDescriptorBuf, SIZE_T *PSecurityDescriptorSize) PSECURITY_DESCRIPTOR SecurityDescriptorBuf, SIZE_T *PSecurityDescriptorSize)
{ {
struct fuse *f = FileSystem->UserContext; struct fuse *f = FileSystem->UserContext;
struct fsp_fuse_file_desc *filedesc = struct fsp_fuse_file_desc *filedesc = FileNode;
(PVOID)(UINT_PTR)Request->Req.QuerySecurity.UserContext2;
struct fuse_file_info fi; struct fuse_file_info fi;
UINT32 FileAttributes; UINT32 FileAttributes;
@ -1550,8 +1536,7 @@ static NTSTATUS fsp_fuse_intf_SetSecurity(FSP_FILE_SYSTEM *FileSystem,
SECURITY_INFORMATION SecurityInformation, PSECURITY_DESCRIPTOR Ignored) SECURITY_INFORMATION SecurityInformation, PSECURITY_DESCRIPTOR Ignored)
{ {
struct fuse *f = FileSystem->UserContext; struct fuse *f = FileSystem->UserContext;
struct fsp_fuse_file_desc *filedesc = struct fsp_fuse_file_desc *filedesc = FileNode;
(PVOID)(UINT_PTR)Request->Req.SetSecurity.UserContext2;
struct fuse_file_info fi; struct fuse_file_info fi;
UINT32 Uid, Gid, Mode, NewUid, NewGid, NewMode; UINT32 Uid, Gid, Mode, NewUid, NewGid, NewMode;
FSP_FSCTL_FILE_INFO FileInfo; FSP_FSCTL_FILE_INFO FileInfo;
@ -1684,8 +1669,7 @@ static NTSTATUS fsp_fuse_intf_ReadDirectory(FSP_FILE_SYSTEM *FileSystem,
PULONG PBytesTransferred) PULONG PBytesTransferred)
{ {
struct fuse *f = FileSystem->UserContext; struct fuse *f = FileSystem->UserContext;
struct fsp_fuse_file_desc *filedesc = struct fsp_fuse_file_desc *filedesc = FileNode;
(PVOID)(UINT_PTR)Request->Req.QueryDirectory.UserContext2;
struct fuse_file_info fi; struct fuse_file_info fi;
struct fuse_dirhandle dh; struct fuse_dirhandle dh;
struct fsp_fuse_dirinfo *di; struct fsp_fuse_dirinfo *di;
@ -1891,8 +1875,7 @@ static NTSTATUS fsp_fuse_intf_GetReparsePoint(FSP_FILE_SYSTEM *FileSystem,
PVOID FileNode, PVOID FileNode,
PWSTR FileName, PVOID Buffer, PSIZE_T PSize) PWSTR FileName, PVOID Buffer, PSIZE_T PSize)
{ {
struct fsp_fuse_file_desc *filedesc = struct fsp_fuse_file_desc *filedesc = FileNode;
(PVOID)(UINT_PTR)Request->Req.FileSystemControl.UserContext2;
struct fuse_file_info fi; struct fuse_file_info fi;
memset(&fi, 0, sizeof 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 *f = FileSystem->UserContext;
struct fuse_context *context = fsp_fuse_get_context(f->env); struct fuse_context *context = fsp_fuse_get_context(f->env);
struct fsp_fuse_file_desc *filedesc = struct fsp_fuse_file_desc *filedesc = FileNode;
(PVOID)(UINT_PTR)Request->Req.FileSystemControl.UserContext2;
struct fuse_file_info fi; struct fuse_file_info fi;
UINT32 Uid, Gid, Mode, Dev; UINT32 Uid, Gid, Mode, Dev;
FSP_FSCTL_FILE_INFO FileInfo; FSP_FSCTL_FILE_INFO FileInfo;

View File

@ -51,8 +51,6 @@ struct fuse
struct fsp_fuse_context_header struct fsp_fuse_context_header
{ {
FSP_FSCTL_TRANSACT_REQ *Request;
FSP_FSCTL_TRANSACT_RSP *Response;
char *PosixPath; char *PosixPath;
__declspec(align(MEMORY_ALLOCATION_ALIGNMENT)) UINT8 ContextBuf[]; __declspec(align(MEMORY_ALLOCATION_ALIGNMENT)) UINT8 ContextBuf[];
}; };