internal static NtResult <string> GetFileBasePath(SessionState state)
        {
            var current_path = state.Path.CurrentLocation;

            if (!current_path.Provider.Name.Equals("FileSystem", StringComparison.OrdinalIgnoreCase))
            {
                return(NtResult <string> .CreateResultFromError(NtStatus.STATUS_OBJECT_PATH_NOT_FOUND, false));
            }
            return(NtFileUtils.DosFileNameToNt(current_path.Path, false));
        }
Ejemplo n.º 2
0
        /// <summary>
        /// Get the base object manager path for the current powershell directory.
        /// </summary>
        /// <returns>The base path.</returns>
        protected virtual NtResult <string> GetBasePath()
        {
            var current_path = SessionState.Path.CurrentLocation;

            if (current_path.Drive is ObjectManagerPSDriveInfo drive)
            {
                string root_path = drive.DirectoryRoot.FullPath;
                if (root_path == @"\")
                {
                    root_path = string.Empty;
                }

                string relative_path = RemoveDrive(current_path.Path);
                if (relative_path.Length == 0)
                {
                    return(NtResult <string> .CreateResult($@"{root_path}"));
                }
                return(NtResult <string> .CreateResult($@"{root_path}\{relative_path}"));
            }
            return(NtResult <string> .CreateResultFromError(NtStatus.STATUS_OBJECT_PATH_NOT_FOUND, false));
        }
        private protected NtResult <O> ReOpen <O, X>(NtObjectWithDuplicate <O, X> obj) where O : NtObject where X : Enum
        {
            AccessMask mask = GenericAccessRights.MaximumAllowed;

            using (var o = obj.ReOpen(mask.ToSpecificAccess <X>(), false))
            {
                if (o.IsSuccess)
                {
                    return(o.Map(x => (O)x.DuplicateObject()));
                }
            }

            AccessMask granted_mask = 0;
            AccessMask valid_access = obj.NtType.ValidAccess;
            uint       test_mask    = 1;

            while (test_mask < 0x00200000)
            {
                if (valid_access.IsAccessGranted(test_mask))
                {
                    mask = test_mask;
                    using (var o = obj.ReOpen(mask.ToSpecificAccess <X>(), false))
                    {
                        if (o.IsSuccess)
                        {
                            granted_mask |= test_mask;
                        }
                    }
                }

                test_mask <<= 1;
            }

            if (granted_mask.IsEmpty)
            {
                return(NtResult <O> .CreateResultFromError(NtStatus.STATUS_ACCESS_DENIED, false));
            }
            return(obj.ReOpen(granted_mask.ToSpecificAccess <X>(), false));
        }