public Result OpenBaseFileSystem(out ReferenceCountedDisposable <IFileSystemSf> fileSystem,
                                         BaseFileSystemId fileSystemId)
        {
            UnsafeHelpers.SkipParamInit(out fileSystem);

            Result rc = CheckCapabilityById(fileSystemId, _processId);

            if (rc.IsFailure())
            {
                return(rc);
            }

            ReferenceCountedDisposable <IFileSystem> fs = null;

            try
            {
                // Open the file system
                rc = _serviceImpl.OpenBaseFileSystem(out fs, fileSystemId);
                if (rc.IsFailure())
                {
                    return(rc);
                }

                // Create an SF adapter for the file system
                fileSystem = FileSystemInterfaceAdapter.CreateShared(ref fs);

                return(Result.Success);
            }
            finally
            {
                fs?.Dispose();
            }
        }
        private Result CheckCapabilityById(BaseFileSystemId id, ulong processId)
        {
            Result rc = GetProgramInfo(out ProgramInfo programInfo, processId);

            if (rc.IsFailure())
            {
                return(rc);
            }

            if (id == BaseFileSystemId.TemporaryDirectory)
            {
                Accessibility accessibility =
                    programInfo.AccessControl.GetAccessibilityFor(AccessibilityType.MountTemporaryDirectory);

                if (!accessibility.CanRead || !accessibility.CanWrite)
                {
                    return(ResultFs.PermissionDenied.Log());
                }
            }
            else
            {
                Accessibility accessibility =
                    programInfo.AccessControl.GetAccessibilityFor(AccessibilityType.MountAllBaseFileSystem);

                if (!accessibility.CanRead || !accessibility.CanWrite)
                {
                    return(ResultFs.PermissionDenied.Log());
                }
            }

            return(Result.Success);
        }