Exemple #1
0
        internal static unsafe void AcquireReservedMutex(ref bool bHandleObtained)
        {
            SafeWaitHandle handle = null;

            bHandleObtained = false;
            if (Environment.IsW2k3)
            {
                if (s_ReservedMutex == null)
                {
                    Win32Native.SECURITY_ATTRIBUTES security_attributes;
                    MutexSecurity      security = new MutexSecurity();
                    SecurityIdentifier identity = new SecurityIdentifier(WellKnownSidType.WorldSid, null);
                    security.AddAccessRule(new MutexAccessRule(identity, MutexRights.FullControl, AccessControlType.Allow));
                    security_attributes = new Win32Native.SECURITY_ATTRIBUTES {
                        nLength = Marshal.SizeOf(security_attributes)
                    };
                    byte[] securityDescriptorBinaryForm = security.GetSecurityDescriptorBinaryForm();
                    byte * pDest = stackalloc byte[(IntPtr)securityDescriptorBinaryForm.Length];
                    Buffer.memcpy(securityDescriptorBinaryForm, 0, pDest, 0, securityDescriptorBinaryForm.Length);
                    security_attributes.pSecurityDescriptor = pDest;
                    RuntimeHelpers.PrepareConstrainedRegions();
                    try
                    {
                    }
                    finally
                    {
                        handle = Win32Native.CreateMutex(security_attributes, false, @"Global\CLR_RESERVED_MUTEX_NAME");
                        handle.SetAsReservedMutex();
                    }
                    int errorCode = Marshal.GetLastWin32Error();
                    if (handle.IsInvalid)
                    {
                        handle.SetHandleAsInvalid();
                        __Error.WinIOError(errorCode, @"Global\CLR_RESERVED_MUTEX_NAME");
                    }
                    Mutex mutex = new Mutex(handle);
                    Interlocked.CompareExchange <Mutex>(ref s_ReservedMutex, mutex, null);
                }
                RuntimeHelpers.PrepareConstrainedRegions();
                try
                {
                }
                finally
                {
                    try
                    {
                        s_ReservedMutex.WaitOne();
                        bHandleObtained = true;
                    }
                    catch (AbandonedMutexException)
                    {
                        bHandleObtained = true;
                    }
                }
            }
        }
Exemple #2
0
        internal static unsafe void AcquireReservedMutex(ref bool bHandleObtained)
        {
#if FEATURE_MACL
            SafeWaitHandle mutexHandle = null;
            int            errorCode;

            bHandleObtained = false;

            if (!Environment.IsW2k3)
            {
                return;
            }

            if (s_ReservedMutex == null)
            {
                // Create a maximally-permissive security descriptor, to ensure we never get an
                // ACCESS_DENIED error when calling CreateMutex
                MutexSecurity      sec         = new MutexSecurity();
                SecurityIdentifier everyoneSid = new SecurityIdentifier(WellKnownSidType.WorldSid, null);
                sec.AddAccessRule(new MutexAccessRule(everyoneSid, MutexRights.FullControl, AccessControlType.Allow));

                // For ACL's, get the security descriptor from the MutexSecurity.
                Win32Native.SECURITY_ATTRIBUTES secAttrs = new Win32Native.SECURITY_ATTRIBUTES();
                secAttrs.nLength = (int)Marshal.SizeOf(secAttrs);

                byte[] sd           = sec.GetSecurityDescriptorBinaryForm();
                byte * bytesOnStack = stackalloc byte[sd.Length];
                Buffer.Memcpy(bytesOnStack, 0, sd, 0, sd.Length);
                secAttrs.pSecurityDescriptor = bytesOnStack;

                RuntimeHelpers.PrepareConstrainedRegions();
                try {}
                finally {
                    mutexHandle = Win32Native.CreateMutex(secAttrs, false, c_ReservedMutexName);

                    // need to set specially, since this mutex cannot lock on itself while closing itself.
                    mutexHandle.SetAsReservedMutex();
                }

                errorCode = Marshal.GetLastWin32Error();
                if (mutexHandle.IsInvalid)
                {
                    mutexHandle.SetHandleAsInvalid();
                    __Error.WinIOError(errorCode, c_ReservedMutexName);
                }

                Mutex m = new Mutex(mutexHandle);
                Interlocked.CompareExchange(ref s_ReservedMutex, m, null);
            }


            RuntimeHelpers.PrepareConstrainedRegions();
            try { }
            finally {
                try {
                    s_ReservedMutex.WaitOne();
                    bHandleObtained = true;
                }
                catch (AbandonedMutexException)
                {
                    // we don't care if another process holding the Mutex was killed
                    bHandleObtained = true;
                }
            }
#else
            bHandleObtained = true;
#endif
        }