internal IntPtr MakeAcl(IntPtr oldAcl)
 {
     IntPtr ptr;
     CheckEnvironment();
     int count = base.List.Count;
     System.Messaging.Interop.NativeMethods.ExplicitAccess[] accessArray = new System.Messaging.Interop.NativeMethods.ExplicitAccess[count];
     GCHandle handle = GCHandle.Alloc(accessArray, GCHandleType.Pinned);
     try
     {
         for (int i = 0; i < count; i++)
         {
             int num4;
             int sidSize = 0;
             int domainSize = 0;
             AccessControlEntry entry = (AccessControlEntry) base.List[i];
             if (entry.Trustee == null)
             {
                 throw new InvalidOperationException(Res.GetString("InvalidTrustee"));
             }
             string name = entry.Trustee.Name;
             if (name == null)
             {
                 throw new InvalidOperationException(Res.GetString("InvalidTrusteeName"));
             }
             if ((entry.Trustee.TrusteeType == TrusteeType.Computer) && !name.EndsWith("$"))
             {
                 name = name + "$";
             }
             if (!System.Messaging.Interop.UnsafeNativeMethods.LookupAccountName(entry.Trustee.SystemName, name, IntPtr.Zero, ref sidSize, null, ref domainSize, out num4))
             {
                 int num6 = Marshal.GetLastWin32Error();
                 if (num6 != 0x7a)
                 {
                     throw new InvalidOperationException(Res.GetString("CouldntResolve", new object[] { entry.Trustee.Name, num6 }));
                 }
             }
             accessArray[i].data = Marshal.AllocHGlobal(sidSize);
             StringBuilder domainName = new StringBuilder(domainSize);
             if (!System.Messaging.Interop.UnsafeNativeMethods.LookupAccountName(entry.Trustee.SystemName, name, accessArray[i].data, ref sidSize, domainName, ref domainSize, out num4))
             {
                 throw new InvalidOperationException(Res.GetString("CouldntResolveName", new object[] { entry.Trustee.Name }));
             }
             accessArray[i].grfAccessPermissions = entry.accessFlags;
             accessArray[i].grfAccessMode = (int) entry.EntryType;
             accessArray[i].grfInheritance = 0;
             accessArray[i].pMultipleTrustees = IntPtr.Zero;
             accessArray[i].MultipleTrusteeOperation = 0;
             accessArray[i].TrusteeForm = 0;
             accessArray[i].TrusteeType = (int) entry.Trustee.TrusteeType;
         }
         int error = SafeNativeMethods.SetEntriesInAclW(count, handle.AddrOfPinnedObject(), oldAcl, out ptr);
         if (error != 0)
         {
             throw new Win32Exception(error);
         }
     }
     finally
     {
         handle.Free();
         for (int j = 0; j < count; j++)
         {
             if (accessArray[j].data != IntPtr.Zero)
             {
                 Marshal.FreeHGlobal(accessArray[j].data);
             }
         }
     }
     return ptr;
 }
        internal IntPtr MakeAcl(IntPtr oldAcl)
        {
            IntPtr ptr;

            CheckEnvironment();
            int count = base.List.Count;

            System.Messaging.Interop.NativeMethods.ExplicitAccess[] accessArray = new System.Messaging.Interop.NativeMethods.ExplicitAccess[count];
            GCHandle handle = GCHandle.Alloc(accessArray, GCHandleType.Pinned);

            try
            {
                for (int i = 0; i < count; i++)
                {
                    int num4;
                    int sidSize              = 0;
                    int domainSize           = 0;
                    AccessControlEntry entry = (AccessControlEntry)base.List[i];
                    if (entry.Trustee == null)
                    {
                        throw new InvalidOperationException(Res.GetString("InvalidTrustee"));
                    }
                    string name = entry.Trustee.Name;
                    if (name == null)
                    {
                        throw new InvalidOperationException(Res.GetString("InvalidTrusteeName"));
                    }
                    if ((entry.Trustee.TrusteeType == TrusteeType.Computer) && !name.EndsWith("$"))
                    {
                        name = name + "$";
                    }
                    if (!System.Messaging.Interop.UnsafeNativeMethods.LookupAccountName(entry.Trustee.SystemName, name, IntPtr.Zero, ref sidSize, null, ref domainSize, out num4))
                    {
                        int num6 = Marshal.GetLastWin32Error();
                        if (num6 != 0x7a)
                        {
                            throw new InvalidOperationException(Res.GetString("CouldntResolve", new object[] { entry.Trustee.Name, num6 }));
                        }
                    }
                    accessArray[i].data = Marshal.AllocHGlobal(sidSize);
                    StringBuilder domainName = new StringBuilder(domainSize);
                    if (!System.Messaging.Interop.UnsafeNativeMethods.LookupAccountName(entry.Trustee.SystemName, name, accessArray[i].data, ref sidSize, domainName, ref domainSize, out num4))
                    {
                        throw new InvalidOperationException(Res.GetString("CouldntResolveName", new object[] { entry.Trustee.Name }));
                    }
                    accessArray[i].grfAccessPermissions     = entry.accessFlags;
                    accessArray[i].grfAccessMode            = (int)entry.EntryType;
                    accessArray[i].grfInheritance           = 0;
                    accessArray[i].pMultipleTrustees        = IntPtr.Zero;
                    accessArray[i].MultipleTrusteeOperation = 0;
                    accessArray[i].TrusteeForm = 0;
                    accessArray[i].TrusteeType = (int)entry.Trustee.TrusteeType;
                }
                int error = SafeNativeMethods.SetEntriesInAclW(count, handle.AddrOfPinnedObject(), oldAcl, out ptr);
                if (error != 0)
                {
                    throw new Win32Exception(error);
                }
            }
            finally
            {
                handle.Free();
                for (int j = 0; j < count; j++)
                {
                    if (accessArray[j].data != IntPtr.Zero)
                    {
                        Marshal.FreeHGlobal(accessArray[j].data);
                    }
                }
            }
            return(ptr);
        }