sys,dll: symbolic link (reparse point) support: WIP

This commit is contained in:
Bill Zissimopoulos 2016-08-04 11:25:35 -07:00
parent ab278d7b60
commit 7337f3c6cd
7 changed files with 12 additions and 7 deletions

View File

@ -118,6 +118,8 @@
</ResourceCompile> </ResourceCompile>
</ItemGroup> </ItemGroup>
<ItemGroup> <ItemGroup>
<CustomBuild Include="..\..\src\dll\fuse\fuse.pc" /> <CustomBuild Include="..\..\src\dll\fuse\fuse.pc">
<Filter>Source\fuse</Filter>
</CustomBuild>
</ItemGroup> </ItemGroup>
</Project> </Project>

View File

@ -125,8 +125,8 @@ typedef struct
UINT32 UnicodeOnDisk:1; /* file system supports Unicode in file names */ UINT32 UnicodeOnDisk:1; /* file system supports Unicode in file names */
UINT32 PersistentAcls:1; /* file system preserves and enforces access control lists */ UINT32 PersistentAcls:1; /* file system preserves and enforces access control lists */
UINT32 ReparsePoints:1; /* file system supports reparse points */ UINT32 ReparsePoints:1; /* file system supports reparse points */
UINT32 ReparsePointPrivilegeCheck:1;/* file system perform reparse point privilege checks */ UINT32 ReparsePointsPrivilegeCheck:1; /* file system performs reparse point privilege checks */
UINT32 SymbolicLinksOnly:1; /* file system supports only symbolic link reparse points */ UINT32 ReparsePointsSymbolicLinks:1; /* file system supports only symbolic link reparse points */
UINT32 NamedStreams:1; /* file system supports named streams (!!!: unimplemented) */ UINT32 NamedStreams:1; /* file system supports named streams (!!!: unimplemented) */
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 */

View File

@ -752,6 +752,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;
UINT32 ReparsePointsSymbolicLinks:1;
} 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->ReparsePointsSymbolicLinks = VolumeParams->ReparsePointsSymbolicLinks;
*PFileSystem = FileSystem; *PFileSystem = FileSystem;
return STATUS_SUCCESS; return STATUS_SUCCESS;

View File

@ -906,7 +906,7 @@ FSP_API NTSTATUS FspFileSystemOpFileSystemControl(FSP_FILE_SYSTEM *FileSystem,
SymlinkReparseData = (PREPARSE_DATA_BUFFER)Response->Buffer; SymlinkReparseData = (PREPARSE_DATA_BUFFER)Response->Buffer;
memset(SymlinkReparseData, 0, sizeof *SymlinkReparseData); memset(SymlinkReparseData, 0, sizeof *SymlinkReparseData);
if (1/*!!!: SymbolicLinksOnly*/) if (FileSystem->ReparsePointsSymbolicLinks)
{ {
Size = FSP_FSCTL_TRANSACT_RSP_SIZEMAX - FIELD_OFFSET(FSP_FSCTL_TRANSACT_RSP, Buffer) - Size = FSP_FSCTL_TRANSACT_RSP_SIZEMAX - FIELD_OFFSET(FSP_FSCTL_TRANSACT_RSP, Buffer) -
sizeof(*SymlinkReparseData); sizeof(*SymlinkReparseData);
@ -968,7 +968,7 @@ FSP_API NTSTATUS FspFileSystemOpFileSystemControl(FSP_FILE_SYSTEM *FileSystem,
SymlinkReparseData = (PREPARSE_DATA_BUFFER) SymlinkReparseData = (PREPARSE_DATA_BUFFER)
(Request->Buffer + Request->Req.FileSystemControl.Buffer.Offset); (Request->Buffer + Request->Req.FileSystemControl.Buffer.Offset);
if (1/*!!!: SymbolicLinksOnly*/) if (FileSystem->ReparsePointsSymbolicLinks)
{ {
Result = FileSystem->Interface->SetReparsePoint(FileSystem, Request, Result = FileSystem->Interface->SetReparsePoint(FileSystem, Request,
(PVOID)Request->Req.FileSystemControl.UserContext, (PVOID)Request->Req.FileSystemControl.UserContext,

View File

@ -449,7 +449,7 @@ static int fsp_fuse_core_opt_proc(void *opt_data0, const char *arg, int key,
" -o VolumeSerialNumber=N 32-bit wide\n" " -o VolumeSerialNumber=N 32-bit wide\n"
" -o FileInfoTimeout=N FileInfo/Security/VolumeInfo timeout (millisec)\n" " -o FileInfoTimeout=N FileInfo/Security/VolumeInfo timeout (millisec)\n"
" -o CaseInsensitiveSearch file system supports case-insensitive file names\n" " -o CaseInsensitiveSearch file system supports case-insensitive file names\n"
//" -o ReparsePoints file system supports reparse points\n" " -o ReparsePoints file system supports reparse points\n"
//" -o NamedStreams file system supports named streams\n" //" -o NamedStreams file system supports named streams\n"
//" -o ReadOnlyVolume file system is read only\n" //" -o ReadOnlyVolume file system is read only\n"
" --UNC=U --VolumePrefix=U UNC prefix (\\Server\\Share)\n"); " --UNC=U --VolumePrefix=U UNC prefix (\\Server\\Share)\n");

View File

@ -126,7 +126,7 @@ static NTSTATUS FspFsvolFileSystemControlReparsePoint(
ReparseTag = ((PREPARSE_DATA_BUFFER)InputBuffer)->ReparseTag; ReparseTag = ((PREPARSE_DATA_BUFFER)InputBuffer)->ReparseTag;
/* NTFS severely limits symbolic links; we will not do that unless our file system asks */ /* NTFS severely limits symbolic links; we will not do that unless our file system asks */
if (FsvolDeviceExtension->VolumeParams.ReparsePointPrivilegeCheck) if (FsvolDeviceExtension->VolumeParams.ReparsePointsPrivilegeCheck)
{ {
if (IO_REPARSE_TAG_SYMLINK == ReparseTag && if (IO_REPARSE_TAG_SYMLINK == ReparseTag &&
KernelMode != Irp->RequestorMode && KernelMode != Irp->RequestorMode &&