Пример #1
0
 internal static bool RestoreTokenPrivilege(string privilegeName, ref Win32Native.TOKEN_PRIVILEGE previousPrivilegeState)
 {
     if (previousPrivilegeState.PrivilegeCount != 0)
     {
         bool flag = false;
         Win32Native.TOKEN_PRIVILEGE tOKENPRIVILEGE = new Win32Native.TOKEN_PRIVILEGE();
         if (Win32Native.LookupPrivilegeValue(null, privilegeName, ref tOKENPRIVILEGE.Privilege.Luid) && tOKENPRIVILEGE.Privilege.Luid.HighPart == previousPrivilegeState.Privilege.Luid.HighPart && tOKENPRIVILEGE.Privilege.Luid.LowPart == previousPrivilegeState.Privilege.Luid.LowPart)
         {
             IntPtr currentProcess = Win32Native.GetCurrentProcess();
             if (currentProcess != IntPtr.Zero)
             {
                 IntPtr zero = IntPtr.Zero;
                 if (Win32Native.OpenProcessToken(currentProcess, 40, out zero))
                 {
                     int num  = Marshal.SizeOf(typeof(Win32Native.TOKEN_PRIVILEGE));
                     int num1 = 0;
                     if (Win32Native.AdjustTokenPrivileges(zero, false, ref previousPrivilegeState, num, out tOKENPRIVILEGE, ref num1) && Marshal.GetLastWin32Error() == 0)
                     {
                         flag = true;
                     }
                 }
                 if (zero != IntPtr.Zero)
                 {
                     Win32Native.CloseHandle(zero);
                 }
                 Win32Native.CloseHandle(currentProcess);
             }
         }
         return(flag);
     }
     else
     {
         return(true);
     }
 }
Пример #2
0
        public void Revert()
        {
            int num = 0;

            if (!this.currentThread.Equals(Thread.CurrentThread))
            {
                throw new InvalidOperationException(Environment.GetResourceString("InvalidOperation_MustBeSameThread"));
            }
            if (this.NeedToRevert)
            {
                RuntimeHelpers.PrepareConstrainedRegions();
                try
                {
                }
                finally
                {
                    bool flag = true;
                    try
                    {
                        if (this.stateWasChanged && ((this.tlsContents.ReferenceCountValue > 1) || !this.tlsContents.IsImpersonating))
                        {
                            Win32Native.TOKEN_PRIVILEGE newState = new Win32Native.TOKEN_PRIVILEGE {
                                PrivilegeCount = 1
                            };
                            newState.Privilege.Luid       = this.luid;
                            newState.Privilege.Attributes = this.initialState ? 2 : 0;
                            Win32Native.TOKEN_PRIVILEGE structure = new Win32Native.TOKEN_PRIVILEGE();
                            uint returnLength = 0;
                            int  introduced5  = Marshal.SizeOf(structure);
                            if (!Win32Native.AdjustTokenPrivileges(this.tlsContents.ThreadHandle, false, ref newState, (uint)introduced5, ref structure, ref returnLength))
                            {
                                num  = Marshal.GetLastWin32Error();
                                flag = false;
                            }
                        }
                    }
                    finally
                    {
                        if (flag)
                        {
                            this.Reset();
                        }
                    }
                }
                switch (num)
                {
                case 8:
                    throw new OutOfMemoryException();

                case 5:
                    throw new UnauthorizedAccessException();
                }
                if (num != 0)
                {
                    throw new InvalidOperationException();
                }
            }
        }
Пример #3
0
        public void Revert()
        {
            int num = 0;

            if (!this.currentThread.Equals(Thread.CurrentThread))
            {
                throw new InvalidOperationException(Environment.GetResourceString("InvalidOperation_MustBeSameThread"));
            }
            if (!this.NeedToRevert)
            {
                return;
            }
            RuntimeHelpers.PrepareConstrainedRegions();
            try
            {
            }
            finally
            {
                bool flag = true;
                try
                {
                    if (this.stateWasChanged && (this.tlsContents.ReferenceCountValue > 1 || !this.tlsContents.IsImpersonating))
                    {
                        Win32Native.TOKEN_PRIVILEGE token_PRIVILEGE = default(Win32Native.TOKEN_PRIVILEGE);
                        token_PRIVILEGE.PrivilegeCount       = 1U;
                        token_PRIVILEGE.Privilege.Luid       = this.luid;
                        token_PRIVILEGE.Privilege.Attributes = (this.initialState ? 2U : 0U);
                        Win32Native.TOKEN_PRIVILEGE structure = default(Win32Native.TOKEN_PRIVILEGE);
                        uint num2 = 0U;
                        if (!Win32Native.AdjustTokenPrivileges(this.tlsContents.ThreadHandle, false, ref token_PRIVILEGE, (uint)Marshal.SizeOf <Win32Native.TOKEN_PRIVILEGE>(structure), ref structure, ref num2))
                        {
                            num  = Marshal.GetLastWin32Error();
                            flag = false;
                        }
                    }
                }
                finally
                {
                    if (flag)
                    {
                        this.Reset();
                    }
                }
            }
            if (num == 8)
            {
                throw new OutOfMemoryException();
            }
            if (num == 5)
            {
                throw new UnauthorizedAccessException();
            }
            if (num != 0)
            {
                throw new InvalidOperationException();
            }
        }
Пример #4
0
        internal static bool EnableTokenPrivilege(string privilegeName, ref Win32Native.TOKEN_PRIVILEGE oldPrivilegeState)
        {
            bool flag = false;

            Win32Native.TOKEN_PRIVILEGE tOKENPRIVILEGE = new Win32Native.TOKEN_PRIVILEGE();
            if (Win32Native.LookupPrivilegeValue(null, privilegeName, ref tOKENPRIVILEGE.Privilege.Luid))
            {
                IntPtr currentProcess = Win32Native.GetCurrentProcess();
                if (currentProcess != IntPtr.Zero)
                {
                    IntPtr zero = IntPtr.Zero;
                    if (Win32Native.OpenProcessToken(currentProcess, 40, out zero))
                    {
                        Win32Native.PRIVILEGE_SET luid = new Win32Native.PRIVILEGE_SET();
                        luid.Privilege.Luid = tOKENPRIVILEGE.Privilege.Luid;
                        luid.PrivilegeCount = 1;
                        luid.Control        = 1;
                        bool flag1 = false;
                        if (!Win32Native.PrivilegeCheck(zero, ref luid, out flag1) || !flag1)
                        {
                            tOKENPRIVILEGE.PrivilegeCount       = 1;
                            tOKENPRIVILEGE.Privilege.Attributes = 2;
                            int num  = Marshal.SizeOf(typeof(Win32Native.TOKEN_PRIVILEGE));
                            int num1 = 0;
                            if (Win32Native.AdjustTokenPrivileges(zero, false, ref tOKENPRIVILEGE, num, out oldPrivilegeState, ref num1))
                            {
                                int lastWin32Error = Marshal.GetLastWin32Error();
                                if (lastWin32Error != 0)
                                {
                                    if (lastWin32Error == 0x514)
                                    {
                                        oldPrivilegeState.PrivilegeCount = 0;
                                        flag = true;
                                    }
                                }
                                else
                                {
                                    flag = true;
                                }
                            }
                        }
                        else
                        {
                            oldPrivilegeState.PrivilegeCount = 0;
                            flag = true;
                        }
                    }
                    if (zero != IntPtr.Zero)
                    {
                        Win32Native.CloseHandle(zero);
                    }
                    Win32Native.CloseHandle(currentProcess);
                }
            }
            return(flag);
        }
Пример #5
0
        private void ToggleState(bool enable)
        {
            int num = 0;

            if (!this.currentThread.Equals(Thread.CurrentThread))
            {
                throw new InvalidOperationException(Environment.GetResourceString("InvalidOperation_MustBeSameThread"));
            }
            if (this.needToRevert)
            {
                throw new InvalidOperationException(Environment.GetResourceString("InvalidOperation_MustRevertPrivilege"));
            }
            RuntimeHelpers.PrepareConstrainedRegions();
            try
            {
            }
            finally
            {
                try
                {
                    this.tlsContents = Thread.GetData(tlsSlot) as TlsContents;
                    if (this.tlsContents == null)
                    {
                        this.tlsContents = new TlsContents();
                        Thread.SetData(tlsSlot, this.tlsContents);
                    }
                    else
                    {
                        this.tlsContents.IncrementReferenceCount();
                    }
                    Win32Native.TOKEN_PRIVILEGE newState = new Win32Native.TOKEN_PRIVILEGE {
                        PrivilegeCount = 1
                    };
                    newState.Privilege.Luid       = this.luid;
                    newState.Privilege.Attributes = enable ? 2 : 0;
                    Win32Native.TOKEN_PRIVILEGE structure = new Win32Native.TOKEN_PRIVILEGE();
                    uint returnLength = 0;
                    int  introduced4  = Marshal.SizeOf(structure);
                    if (!Win32Native.AdjustTokenPrivileges(this.tlsContents.ThreadHandle, false, ref newState, (uint)introduced4, ref structure, ref returnLength))
                    {
                        num = Marshal.GetLastWin32Error();
                    }
                    else if (0x514 == Marshal.GetLastWin32Error())
                    {
                        num = 0x514;
                    }
                    else
                    {
                        this.initialState    = (structure.Privilege.Attributes & 2) != 0;
                        this.stateWasChanged = this.initialState != enable;
                        this.needToRevert    = this.tlsContents.IsImpersonating || this.stateWasChanged;
                    }
                }
                finally
                {
                    if (!this.needToRevert)
                    {
                        this.Reset();
                    }
                }
            }
            switch (num)
            {
            case 0x514:
                throw new PrivilegeNotHeldException(privileges[this.luid] as string);

            case 8:
                throw new OutOfMemoryException();

            case 5:
            case 0x543:
                throw new UnauthorizedAccessException();
            }
            if (num != 0)
            {
                throw new InvalidOperationException();
            }
        }
Пример #6
0
        public void Revert()
        {
            int error = 0;

            if (!this.currentThread.Equals(Thread.CurrentThread))
            {
                throw new InvalidOperationException(Environment.GetResourceString("InvalidOperation_MustBeSameThread"));
            }

            if (!this.NeedToRevert)
            {
                return;
            }

            //
            // This code must be eagerly prepared and non-interruptible.
            //

            RuntimeHelpers.PrepareConstrainedRegions();
            try
            {
                //
                // The payload is entirely in the finally block
                // This is how we ensure that the code will not be
                // interrupted by catastrophic exceptions
                //
            }
            finally
            {
                bool success = true;

                try
                {
                    //
                    // Only call AdjustTokenPrivileges if we're not going to be reverting to self,
                    // on this Revert, since doing the latter obliterates the thread token anyway
                    //

                    if (this.stateWasChanged &&
                        (this.tlsContents.ReferenceCountValue > 1 ||
                         !this.tlsContents.IsImpersonating))
                    {
                        Win32Native.TOKEN_PRIVILEGE newState = new Win32Native.TOKEN_PRIVILEGE();
                        newState.PrivilegeCount       = 1;
                        newState.Privilege.Luid       = this.luid;
                        newState.Privilege.Attributes = (this.initialState ? Win32Native.SE_PRIVILEGE_ENABLED : Win32Native.SE_PRIVILEGE_DISABLED);

                        Win32Native.TOKEN_PRIVILEGE previousState = new Win32Native.TOKEN_PRIVILEGE();
                        uint previousSize = 0;

                        if (false == Win32Native.AdjustTokenPrivileges(
                                this.tlsContents.ThreadHandle,
                                false,
                                ref newState,
                                ( uint )Marshal.SizeOf(previousState),
                                ref previousState,
                                ref previousSize))
                        {
                            error   = Marshal.GetLastWin32Error();
                            success = false;
                        }
                    }
                }
                finally
                {
                    if (success)
                    {
                        this.Reset();
                    }
                }
            }

            if (error == Win32Native.ERROR_NOT_ENOUGH_MEMORY)
            {
                throw new OutOfMemoryException();
            }
            else if (error == Win32Native.ERROR_ACCESS_DENIED)
            {
                throw new UnauthorizedAccessException();
            }
            else if (error != 0)
            {
                Contract.Assert(false, string.Format(CultureInfo.InvariantCulture, "AdjustTokenPrivileges() failed with unrecognized error code {0}", error));
                throw new InvalidOperationException();
            }
        }
Пример #7
0
        private void ToggleState(bool enable)
        {
            int error = 0;

            //
            // All privilege operations must take place on the same thread
            //

            if (!this.currentThread.Equals(Thread.CurrentThread))
            {
                throw new InvalidOperationException(Environment.GetResourceString("InvalidOperation_MustBeSameThread"));
            }

            //
            // This privilege was already altered and needs to be reverted before it can be altered again
            //

            if (this.needToRevert)
            {
                throw new InvalidOperationException(Environment.GetResourceString("InvalidOperation_MustRevertPrivilege"));
            }

            //
            // Need to make this block of code non-interruptible so that it would preserve
            // consistency of thread oken state even in the face of catastrophic exceptions
            //

            RuntimeHelpers.PrepareConstrainedRegions();
            try
            {
                //
                // The payload is entirely in the finally block
                // This is how we ensure that the code will not be
                // interrupted by catastrophic exceptions
                //
            }
            finally
            {
                try
                {
                    //
                    // Retrieve TLS state
                    //

                    this.tlsContents = Thread.GetData(tlsSlot) as TlsContents;

                    if (this.tlsContents == null)
                    {
                        this.tlsContents = new TlsContents();
                        Thread.SetData(tlsSlot, this.tlsContents);
                    }
                    else
                    {
                        this.tlsContents.IncrementReferenceCount();
                    }

                    Win32Native.TOKEN_PRIVILEGE newState = new Win32Native.TOKEN_PRIVILEGE();
                    newState.PrivilegeCount       = 1;
                    newState.Privilege.Luid       = this.luid;
                    newState.Privilege.Attributes = enable ? Win32Native.SE_PRIVILEGE_ENABLED : Win32Native.SE_PRIVILEGE_DISABLED;

                    Win32Native.TOKEN_PRIVILEGE previousState = new Win32Native.TOKEN_PRIVILEGE();
                    uint previousSize = 0;

                    //
                    // Place the new privilege on the thread token and remember the previous state.
                    //

                    if (false == Win32Native.AdjustTokenPrivileges(
                            this.tlsContents.ThreadHandle,
                            false,
                            ref newState,
                            ( uint )Marshal.SizeOf(previousState),
                            ref previousState,
                            ref previousSize))
                    {
                        error = Marshal.GetLastWin32Error();
                    }
                    else if (Win32Native.ERROR_NOT_ALL_ASSIGNED == Marshal.GetLastWin32Error())
                    {
                        error = Win32Native.ERROR_NOT_ALL_ASSIGNED;
                    }
                    else
                    {
                        //
                        // This is the initial state that revert will have to go back to
                        //

                        this.initialState = ((previousState.Privilege.Attributes & Win32Native.SE_PRIVILEGE_ENABLED) != 0);

                        //
                        // Remember whether state has changed at all
                        //

                        this.stateWasChanged = (this.initialState != enable);

                        //
                        // If we had to impersonate, or if the privilege state changed we'll need to revert
                        //

                        this.needToRevert = this.tlsContents.IsImpersonating || this.stateWasChanged;
                    }
                }
                finally
                {
                    if (!this.needToRevert)
                    {
                        this.Reset();
                    }
                }
            }

            if (error == Win32Native.ERROR_NOT_ALL_ASSIGNED)
            {
                throw new PrivilegeNotHeldException(privileges[this.luid] as string);
            }
            if (error == Win32Native.ERROR_NOT_ENOUGH_MEMORY)
            {
                throw new OutOfMemoryException();
            }
            else if (error == Win32Native.ERROR_ACCESS_DENIED ||
                     error == Win32Native.ERROR_CANT_OPEN_ANONYMOUS)
            {
                throw new UnauthorizedAccessException();
            }
            else if (error != 0)
            {
                Contract.Assert(false, string.Format(CultureInfo.InvariantCulture, "AdjustTokenPrivileges() failed with unrecognized error code {0}", error));
                throw new InvalidOperationException();
            }
        }
Пример #8
0
        public void Revert()
        {
            int num = 0;

            if (!this.currentThread.Equals((object)Thread.CurrentThread))
            {
                throw new InvalidOperationException(Environment.GetResourceString("InvalidOperation_MustBeSameThread"));
            }
            if (!this.NeedToRevert)
            {
                return;
            }
            RuntimeHelpers.PrepareConstrainedRegions();
            try
            {
            }
            finally
            {
                bool flag = true;
                try
                {
                    if (this.stateWasChanged)
                    {
                        if (this.tlsContents.ReferenceCountValue <= 1)
                        {
                            if (this.tlsContents.IsImpersonating)
                            {
                                goto label_16;
                            }
                        }
                        Win32Native.TOKEN_PRIVILEGE NewState = new Win32Native.TOKEN_PRIVILEGE();
                        NewState.PrivilegeCount       = 1U;
                        NewState.Privilege.Luid       = this.luid;
                        NewState.Privilege.Attributes = this.initialState ? 2U : 0U;
                        Win32Native.TOKEN_PRIVILEGE PreviousState = new Win32Native.TOKEN_PRIVILEGE();
                        uint ReturnLength = 0;
                        if (!Win32Native.AdjustTokenPrivileges(this.tlsContents.ThreadHandle, false, ref NewState, (uint)Marshal.SizeOf <Win32Native.TOKEN_PRIVILEGE>(PreviousState), out PreviousState, out ReturnLength))
                        {
                            num  = Marshal.GetLastWin32Error();
                            flag = false;
                        }
                    }
                }
                finally
                {
                    if (flag)
                    {
                        this.Reset();
                    }
                }
                label_16 :;
            }
            if (num == 8)
            {
                throw new OutOfMemoryException();
            }
            if (num == 5)
            {
                throw new UnauthorizedAccessException();
            }
            if (num != 0)
            {
                throw new InvalidOperationException();
            }
        }
Пример #9
0
        private void ToggleState(bool enable)
        {
            int num = 0;

            if (!this.currentThread.Equals((object)Thread.CurrentThread))
            {
                throw new InvalidOperationException(Environment.GetResourceString("InvalidOperation_MustBeSameThread"));
            }
            if (this.needToRevert)
            {
                throw new InvalidOperationException(Environment.GetResourceString("InvalidOperation_MustRevertPrivilege"));
            }
            RuntimeHelpers.PrepareConstrainedRegions();
            try
            {
            }
            finally
            {
                try
                {
                    this.tlsContents = Thread.GetData(Privilege.tlsSlot) as Privilege.TlsContents;
                    if (this.tlsContents == null)
                    {
                        this.tlsContents = new Privilege.TlsContents();
                        Thread.SetData(Privilege.tlsSlot, (object)this.tlsContents);
                    }
                    else
                    {
                        this.tlsContents.IncrementReferenceCount();
                    }
                    Win32Native.TOKEN_PRIVILEGE NewState = new Win32Native.TOKEN_PRIVILEGE();
                    NewState.PrivilegeCount       = 1U;
                    NewState.Privilege.Luid       = this.luid;
                    NewState.Privilege.Attributes = enable ? 2U : 0U;
                    Win32Native.TOKEN_PRIVILEGE PreviousState = new Win32Native.TOKEN_PRIVILEGE();
                    uint ReturnLength = 0;
                    if (!Win32Native.AdjustTokenPrivileges(this.tlsContents.ThreadHandle, false, ref NewState, (uint)Marshal.SizeOf <Win32Native.TOKEN_PRIVILEGE>(PreviousState), out PreviousState, out ReturnLength))
                    {
                        num = Marshal.GetLastWin32Error();
                    }
                    else if (1300 == Marshal.GetLastWin32Error())
                    {
                        num = 1300;
                    }
                    else
                    {
                        this.initialState    = (PreviousState.Privilege.Attributes & 2U) > 0U;
                        this.stateWasChanged = this.initialState != enable;
                        this.needToRevert    = this.tlsContents.IsImpersonating || this.stateWasChanged;
                    }
                }
                finally
                {
                    if (!this.needToRevert)
                    {
                        this.Reset();
                    }
                }
            }
            if (num == 1300)
            {
                throw new PrivilegeNotHeldException(Privilege.privileges[(object)this.luid] as string);
            }
            if (num == 8)
            {
                throw new OutOfMemoryException();
            }
            if (num == 5 || num == 1347)
            {
                throw new UnauthorizedAccessException();
            }
            if (num != 0)
            {
                throw new InvalidOperationException();
            }
        }