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); }