public static AccessEntry[] GetAccessEntries(ObjectType type)
        {
            AccessEntry[] entries;

            switch (type)
            {
            case ObjectType.AlpcPort:
                entries = new AccessEntry[]
                {
                    new AccessEntry("Full control", PortAccess.All, true, true),
                    new AccessEntry("Connect", PortAccess.Connect, true, true)
                };
                break;

            case ObjectType.DebugObject:
                entries = new AccessEntry[]
                {
                    new AccessEntry("Full control", DebugObjectAccess.All, true, true),
                    new AccessEntry("Read events", DebugObjectAccess.ReadEvent, true, true),
                    new AccessEntry("Assign processes", DebugObjectAccess.ProcessAssign, true, true),
                    new AccessEntry("Query information", DebugObjectAccess.QueryInformation, true, true),
                    new AccessEntry("Set information", DebugObjectAccess.SetInformation, true, true)
                };
                break;

            case ObjectType.Desktop:
                entries = new AccessEntry[]
                {
                    new AccessEntry("Full control", DesktopAccess.All, true, true),
                    new AccessEntry("Read", DesktopAccess.GenericRead, true, false),
                    new AccessEntry("Write", DesktopAccess.GenericWrite, true, false),
                    new AccessEntry("Execute", DesktopAccess.GenericExecute, true, false),
                    new AccessEntry("Enumerate", DesktopAccess.Enumerate, false, true),
                    new AccessEntry("Read objects", DesktopAccess.ReadObjects, false, true),
                    new AccessEntry("Playback journals", DesktopAccess.JournalPlayback, false, true),
                    new AccessEntry("Write objects", DesktopAccess.WriteObjects, false, true),
                    new AccessEntry("Create windows", DesktopAccess.CreateWindow, false, true),
                    new AccessEntry("Create menus", DesktopAccess.CreateMenu, false, true),
                    new AccessEntry("Create window hooks", DesktopAccess.HookControl, false, true),
                    new AccessEntry("Record journals", DesktopAccess.JournalRecord, false, true),
                    new AccessEntry("Switch desktop", DesktopAccess.SwitchDesktop, false, true)
                };
                break;

            case ObjectType.Directory:
                entries = new AccessEntry[]
                {
                    new AccessEntry("Full control", DirectoryAccess.All, true, true),
                    new AccessEntry("Query", DirectoryAccess.Query, true, true),
                    new AccessEntry("Traverse", DirectoryAccess.Traverse, true, true),
                    new AccessEntry("Create objects", DirectoryAccess.CreateObject, true, true),
                    new AccessEntry("Create subdirectories", DirectoryAccess.CreateSubdirectory, true, true)
                };
                break;

            case ObjectType.Event:
                entries = new AccessEntry[]
                {
                    new AccessEntry("Full control", EventAccess.All, true, true),
                    new AccessEntry("Query", EventAccess.QueryState, true, true),
                    new AccessEntry("Modify", EventAccess.ModifyState, true, true)
                };
                break;

            case ObjectType.EventPair:
                entries = new AccessEntry[]
                {
                    new AccessEntry("Full control", EventPairAccess.All, true, true)
                };
                break;

            case ObjectType.File:
                entries = new AccessEntry[]
                {
                    new AccessEntry("Full control", FileAccess.All, true, true),
                    new AccessEntry("Read & execute", FileAccess.GenericRead | FileAccess.GenericExecute, true, false),
                    new AccessEntry("Read", FileAccess.GenericRead, true, false),
                    new AccessEntry("Write", FileAccess.GenericWrite, true, false),
                    new AccessEntry("Traverse folder / execute file", FileAccess.Execute, false, true),
                    new AccessEntry("List folder / read data", FileAccess.ReadData, false, true),
                    new AccessEntry("Read attributes", FileAccess.ReadAttributes, false, true),
                    new AccessEntry("Read extended attributes", FileAccess.ReadEa, false, true),
                    new AccessEntry("Create files / write data", FileAccess.WriteData, false, true),
                    new AccessEntry("Create folders / append data", FileAccess.AppendData, false, true),
                    new AccessEntry("Write attributes", FileAccess.WriteAttributes, false, true),
                    new AccessEntry("Write extended attributes", FileAccess.WriteEa, false, true),
                    new AccessEntry("Delete subfolders and files", FileAccess.DeleteChild, false, true)
                };
                break;

            case ObjectType.IoCompletion:
                entries = new AccessEntry[]
                {
                    new AccessEntry("Full control", IoCompletionAccess.All, true, true),
                    new AccessEntry("Query", IoCompletionAccess.QueryState, true, true),
                    new AccessEntry("Modify", IoCompletionAccess.ModifyState, true, true)
                };
                break;

            case ObjectType.Job:
                entries = new AccessEntry[]
                {
                    new AccessEntry("Full control", JobObjectAccess.All, true, true),
                    new AccessEntry("Query", JobObjectAccess.Query, true, true),
                    new AccessEntry("Assign processes", JobObjectAccess.AssignProcess, true, true),
                    new AccessEntry("Set attributes", JobObjectAccess.SetAttributes, true, true),
                    new AccessEntry("Set security attributes", JobObjectAccess.SetSecurityAttributes, true, true),
                    new AccessEntry("Terminate", JobObjectAccess.Terminate, true, true)
                };
                break;

            case ObjectType.Key:
                entries = new AccessEntry[]
                {
                    new AccessEntry("Full control", KeyAccess.All, true, true),
                    new AccessEntry("Read", KeyAccess.GenericRead, true, false),
                    new AccessEntry("Write", KeyAccess.GenericWrite, true, false),
                    new AccessEntry("Execute", KeyAccess.GenericExecute, true, false),
                    new AccessEntry("Enumerate subkeys", KeyAccess.EnumerateSubKeys, false, true),
                    new AccessEntry("Query values", KeyAccess.QueryValue, false, true),
                    new AccessEntry("Notify", KeyAccess.Notify, false, true),
                    new AccessEntry("Set values", KeyAccess.SetValue, false, true),
                    new AccessEntry("Create subkeys", KeyAccess.CreateSubKey, false, true),
                    new AccessEntry("Create links", KeyAccess.CreateLink, false, true)
                };
                break;

            case ObjectType.KeyedEvent:
                entries = new AccessEntry[]
                {
                    new AccessEntry("Full control", KeyedEventAccess.All, true, true),
                    new AccessEntry("Wait", KeyedEventAccess.Wait, true, true),
                    new AccessEntry("Wake", KeyedEventAccess.Wake, true, true)
                };
                break;

            case ObjectType.Mutant:
                entries = new AccessEntry[]
                {
                    new AccessEntry("Full control", MutantAccess.All, true, true),
                    new AccessEntry("Query", MutantAccess.QueryState, true, true)
                };
                break;

            case ObjectType.Process:
                entries = new AccessEntry[]
                {
                    new AccessEntry("Full control",
                                    OSVersion.HasQueryLimitedInformation ?
                                    (ProcessAccess.All | ProcessAccess.QueryLimitedInformation) :
                                    ProcessAccess.All, true, true),
                    OSVersion.HasQueryLimitedInformation ?
                    new AccessEntry("Query limited information", ProcessAccess.QueryLimitedInformation, true, true) :
                    new AccessEntry(null, 0, false, false),
                    new AccessEntry("Query information",
                                    OSVersion.HasQueryLimitedInformation ?
                                    (ProcessAccess.QueryInformation | ProcessAccess.QueryLimitedInformation) :
                                    ProcessAccess.QueryInformation, true, true),
                    new AccessEntry("Set information", ProcessAccess.SetInformation, true, true),
                    new AccessEntry("Set quotas", ProcessAccess.SetQuota, true, true),
                    new AccessEntry("Set session ID", ProcessAccess.SetSessionId, true, true),
                    new AccessEntry("Create threads", ProcessAccess.CreateThread, true, true),
                    new AccessEntry("Create processes", ProcessAccess.CreateProcess, true, true),
                    new AccessEntry("Modify memory", ProcessAccess.VmOperation, true, true),
                    new AccessEntry("Read memory", ProcessAccess.VmRead, true, true),
                    new AccessEntry("Write memory", ProcessAccess.VmWrite, true, true),
                    new AccessEntry("Duplicate handles", ProcessAccess.DupHandle, true, true),
                    new AccessEntry("Suspend / resume / set port", ProcessAccess.SuspendResume, true, true),
                    new AccessEntry("Terminate", ProcessAccess.Terminate, true, true),
                };
                break;

            case ObjectType.Profile:
                entries = new AccessEntry[]
                {
                    new AccessEntry("Full control", ProfileAccess.All, true, true),
                    new AccessEntry("Control", ProfileAccess.Control, true, true)
                };
                break;

            case ObjectType.Section:
                entries = new AccessEntry[]
                {
                    new AccessEntry("Full control", SectionAccess.All, true, true),
                    new AccessEntry("Query", SectionAccess.Query, true, true),
                    new AccessEntry("Map for read", SectionAccess.MapRead, true, true),
                    new AccessEntry("Map for write", SectionAccess.MapWrite, true, true),
                    new AccessEntry("Map for execute", SectionAccess.MapExecute, true, true),
                    new AccessEntry("Map for execute (explicit)", SectionAccess.MapExecuteExplicit, true, true),
                    new AccessEntry("Extend size", SectionAccess.ExtendSize, true, true)
                };
                break;

            case ObjectType.Semaphore:
                entries = new AccessEntry[]
                {
                    new AccessEntry("Full control", SemaphoreAccess.All, true, true),
                    new AccessEntry("Query", SemaphoreAccess.QueryState, true, true),
                    new AccessEntry("Modify", SemaphoreAccess.ModifyState, true, true)
                };
                break;

            case ObjectType.Service:
                entries = new AccessEntry[]
                {
                    new AccessEntry("Full control", ServiceAccess.All, true, true),
                    new AccessEntry("Query status", ServiceAccess.QueryStatus, true, true),
                    new AccessEntry("Query configuration", ServiceAccess.QueryConfig, true, true),
                    new AccessEntry("Modify configuration", ServiceAccess.ChangeConfig, true, true),
                    new AccessEntry("Enumerate dependents", ServiceAccess.EnumerateDependents, true, true),
                    new AccessEntry("Start", ServiceAccess.Start, true, true),
                    new AccessEntry("Stop", ServiceAccess.Stop, true, true),
                    new AccessEntry("Pause / continue", ServiceAccess.PauseContinue, true, true),
                    new AccessEntry("Interrogate", ServiceAccess.Interrogate, true, true),
                    new AccessEntry("User-defined control", ServiceAccess.UserDefinedControl, true, true)
                };
                break;

            case ObjectType.SymbolicLink:
                entries = new AccessEntry[]
                {
                    new AccessEntry("Full control", SymbolicLinkAccess.All, true, true),
                    new AccessEntry("Query", SymbolicLinkAccess.Query, true, true)
                };
                break;

            case ObjectType.Thread:
                entries = new AccessEntry[]
                {
                    new AccessEntry("Full control",
                                    OSVersion.HasQueryLimitedInformation ?
                                    (ThreadAccess.All | ThreadAccess.QueryLimitedInformation | ThreadAccess.SetLimitedInformation) :
                                    ThreadAccess.All, true, true),
                    OSVersion.HasQueryLimitedInformation ?
                    new AccessEntry("Query limited information", ThreadAccess.QueryLimitedInformation, true, true) :
                    new AccessEntry(null, 0, false, false),
                    new AccessEntry("Query information", ThreadAccess.QueryInformation, true, true),
                    OSVersion.HasQueryLimitedInformation ?
                    new AccessEntry("Set limited information", ThreadAccess.SetLimitedInformation, true, true) :
                    new AccessEntry(null, 0, false, false),
                    new AccessEntry("Set information", ThreadAccess.SetInformation, true, true),
                    new AccessEntry("Get context", ThreadAccess.GetContext, true, true),
                    new AccessEntry("Set context", ThreadAccess.SetContext, true, true),
                    new AccessEntry("Set token", ThreadAccess.SetThreadToken, true, true),
                    new AccessEntry("Alert", ThreadAccess.Alert, true, true),
                    new AccessEntry("Impersonate", ThreadAccess.Impersonate, true, true),
                    new AccessEntry("Direct impersonate", ThreadAccess.DirectImpersonation, true, true),
                    new AccessEntry("Suspend / resume", ThreadAccess.SuspendResume, true, true),
                    new AccessEntry("Terminate", ThreadAccess.Terminate, true, true),
                };
                break;

            case ObjectType.Timer:
                entries = new AccessEntry[]
                {
                    new AccessEntry("Full control", TimerAccess.All, true, true),
                    new AccessEntry("Query", TimerAccess.QueryState, true, true),
                    new AccessEntry("Modify", TimerAccess.ModifyState, true, true)
                };
                break;

            case ObjectType.TmEn:
                entries = new AccessEntry[]
                {
                    new AccessEntry("Full control", EnlistmentAccess.All, true, true),
                    new AccessEntry("Read", EnlistmentAccess.GenericRead, true, false),
                    new AccessEntry("Write", EnlistmentAccess.GenericWrite, true, false),
                    new AccessEntry("Execute", EnlistmentAccess.GenericExecute, true, false),
                    new AccessEntry("Query information", EnlistmentAccess.QueryInformation, false, true),
                    new AccessEntry("Set information", EnlistmentAccess.SetInformation, false, true),
                    new AccessEntry("Recover", EnlistmentAccess.Recover, false, true),
                    new AccessEntry("Subordinate rights", EnlistmentAccess.SubordinateRights, false, true),
                    new AccessEntry("Superior rights", EnlistmentAccess.SuperiorRights, false, true)
                };
                break;

            case ObjectType.TmRm:
                entries = new AccessEntry[]
                {
                    new AccessEntry("Full control", ResourceManagerAccess.All, true, true),
                    new AccessEntry("Read", ResourceManagerAccess.GenericRead, true, false),
                    new AccessEntry("Write", ResourceManagerAccess.GenericWrite, true, false),
                    new AccessEntry("Execute", ResourceManagerAccess.GenericExecute, true, false),
                    new AccessEntry("Query information", ResourceManagerAccess.QueryInformation, false, true),
                    new AccessEntry("Set information", ResourceManagerAccess.SetInformation, false, true),
                    new AccessEntry("Get notifications", ResourceManagerAccess.GetNotification, false, true),
                    new AccessEntry("Enlist", ResourceManagerAccess.Enlist, false, true),
                    new AccessEntry("Recover", ResourceManagerAccess.Recover, false, true),
                    new AccessEntry("Register protocols", ResourceManagerAccess.RegisterProtocol, false, true),
                    new AccessEntry("Complete propagation", ResourceManagerAccess.CompletePropagation, false, true)
                };
                break;

            case ObjectType.TmTm:
                entries = new AccessEntry[]
                {
                    new AccessEntry("Full control", TmAccess.All, true, true),
                    new AccessEntry("Read", TmAccess.GenericRead, true, false),
                    new AccessEntry("Write", TmAccess.GenericWrite, true, false),
                    new AccessEntry("Execute", TmAccess.GenericExecute, true, false),
                    new AccessEntry("Query information", TmAccess.QueryInformation, true, false),
                    new AccessEntry("Set information", TmAccess.SetInformation, true, false),
                    new AccessEntry("Recover", TmAccess.Recover, true, false),
                    new AccessEntry("Rename", TmAccess.Rename, true, false),
                    new AccessEntry("Create resource manager", TmAccess.CreateRm, true, false),
                    new AccessEntry("Bind transactions", TmAccess.BindTransaction, true, false)
                };
                break;

            case ObjectType.TmTx:
                entries = new AccessEntry[]
                {
                    new AccessEntry("Full control", TransactionAccess.All, true, true),
                    new AccessEntry("Read", TransactionAccess.GenericRead, true, false),
                    new AccessEntry("Write", TransactionAccess.GenericWrite, true, false),
                    new AccessEntry("Execute", TransactionAccess.GenericExecute, true, false),
                    new AccessEntry("Query information", TransactionAccess.QueryInformation, false, true),
                    new AccessEntry("Set information", TransactionAccess.SetInformation, false, true),
                    new AccessEntry("Enlist", TransactionAccess.Enlist, false, true),
                    new AccessEntry("Commit", TransactionAccess.Commit, false, true),
                    new AccessEntry("Rollback", TransactionAccess.Rollback, false, true),
                    new AccessEntry("Propagate", TransactionAccess.Propagate, false, true),
                };
                break;

            case ObjectType.Token:
                entries = new AccessEntry[]
                {
                    new AccessEntry("Full control", TokenAccess.All, true, true),
                    new AccessEntry("Read", TokenAccess.GenericRead, true, false),
                    new AccessEntry("Write", TokenAccess.GenericWrite, true, false),
                    new AccessEntry("Execute", TokenAccess.GenericExecute, true, false),
                    new AccessEntry("Adjust privileges", TokenAccess.AdjustPrivileges, false, true),
                    new AccessEntry("Adjust groups", TokenAccess.AdjustGroups, false, true),
                    new AccessEntry("Adjust defaults", TokenAccess.AdjustDefault, false, true),
                    new AccessEntry("Adjust session ID", TokenAccess.AdjustSessionId, false, true),
                    new AccessEntry("Assign as primary token", TokenAccess.AssignPrimary, false, true),
                    new AccessEntry("Duplicate", TokenAccess.Duplicate, false, true),
                    new AccessEntry("Impersonate", TokenAccess.Impersonate, false, true),
                    new AccessEntry("Query", TokenAccess.Query, false, true),
                    new AccessEntry("Query source", TokenAccess.QuerySource, false, true)
                };
                break;

            case ObjectType.Type:
                entries = new AccessEntry[]
                {
                    new AccessEntry("Full control", ObjectTypeAccess.All, true, true),
                    new AccessEntry("Create", ObjectTypeAccess.Create, true, true)
                };
                break;

            case ObjectType.WindowStation:
                entries = new AccessEntry[]
                {
                    new AccessEntry("Full control", WindowStationAccess.All, true, true),
                    new AccessEntry("Read", WindowStationAccess.GenericRead, true, false),
                    new AccessEntry("Write", WindowStationAccess.GenericWrite, true, false),
                    new AccessEntry("Execute", WindowStationAccess.GenericExecute, true, false),
                    new AccessEntry("Enumerate", WindowStationAccess.Enumerate, false, true),
                    new AccessEntry("Enumerate desktops", WindowStationAccess.EnumDesktops, false, true),
                    new AccessEntry("Read attributes", WindowStationAccess.ReadAttributes, false, true),
                    new AccessEntry("Read screen", WindowStationAccess.ReadScreen, false, true),
                    new AccessEntry("Access clipboard", WindowStationAccess.AccessClipboard, false, true),
                    new AccessEntry("Access global atoms", WindowStationAccess.AccessGlobalAtoms, false, true),
                    new AccessEntry("Create desktop", WindowStationAccess.CreateDesktop, false, true),
                    new AccessEntry("Write attributes", WindowStationAccess.WriteAttributes, false, true),
                    new AccessEntry("Exit windows", WindowStationAccess.ExitWindows, false, true)
                };
                break;

            default:
                entries = null;
                break;
            }

            // Add the standard rights.
            return(Utils.Concat <AccessEntry>(entries, new AccessEntry[]
            {
                new AccessEntry("Synchronize", StandardRights.Synchronize, false, true),
                new AccessEntry("Delete", StandardRights.Delete, false, true),
                new AccessEntry("Read permissions", StandardRights.ReadControl, false, true),
                new AccessEntry("Change permissions", StandardRights.WriteDac, false, true),
                new AccessEntry("Take ownership", StandardRights.WriteOwner, false, true)
            }));
        }
        public static AccessEntry[] GetAccessEntries(ObjectType type)
        {
            AccessEntry[] entries;

            switch (type)
            {
                case ObjectType.AlpcPort:
                    entries = new AccessEntry[]
                    {
                        new AccessEntry("Full control", PortAccess.All, true, true),
                        new AccessEntry("Connect", PortAccess.Connect, true, true)
                    };
                    break;
                case ObjectType.DebugObject:
                    entries = new AccessEntry[]
                    {
                        new AccessEntry("Full control", DebugObjectAccess.All, true, true),
                        new AccessEntry("Read events", DebugObjectAccess.ReadEvent, true, true),
                        new AccessEntry("Assign processes", DebugObjectAccess.ProcessAssign, true, true),
                        new AccessEntry("Query information", DebugObjectAccess.QueryInformation, true, true),
                        new AccessEntry("Set information", DebugObjectAccess.SetInformation, true, true)
                    };
                    break;
                case ObjectType.Desktop:
                    entries = new AccessEntry[]
                    {
                        new AccessEntry("Full control", DesktopAccess.All, true, true),
                        new AccessEntry("Read", DesktopAccess.GenericRead, true, false),
                        new AccessEntry("Write", DesktopAccess.GenericWrite, true, false),
                        new AccessEntry("Execute", DesktopAccess.GenericExecute, true, false),
                        new AccessEntry("Enumerate", DesktopAccess.Enumerate, false, true),
                        new AccessEntry("Read objects", DesktopAccess.ReadObjects, false, true),
                        new AccessEntry("Playback journals", DesktopAccess.JournalPlayback, false, true),
                        new AccessEntry("Write objects", DesktopAccess.WriteObjects, false, true),
                        new AccessEntry("Create windows", DesktopAccess.CreateWindow, false, true),
                        new AccessEntry("Create menus", DesktopAccess.CreateMenu, false, true),
                        new AccessEntry("Create window hooks", DesktopAccess.HookControl, false, true),
                        new AccessEntry("Record journals", DesktopAccess.JournalRecord, false, true),
                        new AccessEntry("Switch desktop", DesktopAccess.SwitchDesktop, false, true)
                    };
                    break;
                case ObjectType.Directory:
                    entries = new AccessEntry[]
                    {
                        new AccessEntry("Full control", DirectoryAccess.All, true, true),
                        new AccessEntry("Query", DirectoryAccess.Query, true, true),
                        new AccessEntry("Traverse", DirectoryAccess.Traverse, true, true),
                        new AccessEntry("Create objects", DirectoryAccess.CreateObject, true, true),
                        new AccessEntry("Create subdirectories", DirectoryAccess.CreateSubdirectory, true, true)
                    };
                    break;
                case ObjectType.Event:
                    entries = new AccessEntry[]
                    {
                        new AccessEntry("Full control", EventAccess.All, true, true),
                        new AccessEntry("Query", EventAccess.QueryState, true, true),
                        new AccessEntry("Modify", EventAccess.ModifyState, true, true)
                    };
                    break;
                case ObjectType.EventPair:
                    entries = new AccessEntry[]
                    {
                        new AccessEntry("Full control", EventPairAccess.All, true, true)
                    };
                    break;
                case ObjectType.File:
                    entries = new AccessEntry[]
                    {
                        new AccessEntry("Full control", FileAccess.All, true, true),
                        new AccessEntry("Read & execute", FileAccess.GenericRead | FileAccess.GenericExecute, true, false),
                        new AccessEntry("Read", FileAccess.GenericRead, true, false),
                        new AccessEntry("Write", FileAccess.GenericWrite, true, false),
                        new AccessEntry("Traverse folder / execute file", FileAccess.Execute, false, true),
                        new AccessEntry("List folder / read data", FileAccess.ReadData, false, true),
                        new AccessEntry("Read attributes", FileAccess.ReadAttributes, false, true),
                        new AccessEntry("Read extended attributes", FileAccess.ReadEa, false, true),
                        new AccessEntry("Create files / write data", FileAccess.WriteData, false, true),
                        new AccessEntry("Create folders / append data", FileAccess.AppendData, false, true),
                        new AccessEntry("Write attributes", FileAccess.WriteAttributes, false, true),
                        new AccessEntry("Write extended attributes", FileAccess.WriteEa, false, true),
                        new AccessEntry("Delete subfolders and files", FileAccess.DeleteChild, false, true)
                    };
                    break;
                case ObjectType.IoCompletion:
                    entries = new AccessEntry[]
                    {
                        new AccessEntry("Full control", IoCompletionAccess.All, true, true),
                        new AccessEntry("Query", IoCompletionAccess.QueryState, true, true),
                        new AccessEntry("Modify", IoCompletionAccess.ModifyState, true, true)
                    };
                    break;
                case ObjectType.Job:
                    entries = new AccessEntry[]
                    {
                        new AccessEntry("Full control", JobObjectAccess.All, true, true),
                        new AccessEntry("Query", JobObjectAccess.Query, true, true),
                        new AccessEntry("Assign processes", JobObjectAccess.AssignProcess, true, true),
                        new AccessEntry("Set attributes", JobObjectAccess.SetAttributes, true, true),
                        new AccessEntry("Set security attributes", JobObjectAccess.SetSecurityAttributes, true, true),
                        new AccessEntry("Terminate", JobObjectAccess.Terminate, true, true)
                    };
                    break;
                case ObjectType.Key:
                    entries = new AccessEntry[]
                    {
                        new AccessEntry("Full control", KeyAccess.All, true, true),
                        new AccessEntry("Read", KeyAccess.GenericRead, true, false), 
                        new AccessEntry("Write", KeyAccess.GenericWrite, true, false), 
                        new AccessEntry("Execute", KeyAccess.GenericExecute, true, false),
                        new AccessEntry("Enumerate subkeys", KeyAccess.EnumerateSubKeys, false, true),
                        new AccessEntry("Query values", KeyAccess.QueryValue, false, true),
                        new AccessEntry("Notify", KeyAccess.Notify, false, true),
                        new AccessEntry("Set values", KeyAccess.SetValue, false, true),
                        new AccessEntry("Create subkeys", KeyAccess.CreateSubKey, false, true),
                        new AccessEntry("Create links", KeyAccess.CreateLink, false, true)
                    };
                    break;
                case ObjectType.KeyedEvent:
                    entries = new AccessEntry[]
                    {
                        new AccessEntry("Full control", KeyedEventAccess.All, true, true),
                        new AccessEntry("Wait", KeyedEventAccess.Wait, true, true),
                        new AccessEntry("Wake", KeyedEventAccess.Wake, true, true)
                    };
                    break;
                case ObjectType.LsaAccount:
                    entries = new AccessEntry[]
                    {
                        new AccessEntry("Full control", LsaAccountAccess.All, true, true),
                        new AccessEntry("Read", LsaAccountAccess.GenericRead, true, false),
                        new AccessEntry("Write", LsaAccountAccess.GenericWrite, true, false),
                        new AccessEntry("Execute", LsaAccountAccess.GenericExecute, true, false),
                        new AccessEntry("View", LsaAccountAccess.View, false, true),
                        new AccessEntry("Adjust privileges", LsaAccountAccess.AdjustPrivileges, false, true),
                        new AccessEntry("Adjust quotas", LsaAccountAccess.AdjustQuotas, false, true),
                        new AccessEntry("Adjust system access", LsaAccountAccess.AdjustSystemAccess, false, true)
                    };
                    break;
                case ObjectType.LsaPolicy:
                    entries = new AccessEntry[]
                    {
                        new AccessEntry("Full control", LsaPolicyAccess.All, true, true),
                        new AccessEntry("Read", LsaPolicyAccess.GenericRead, true, false),
                        new AccessEntry("Write", LsaPolicyAccess.GenericWrite, true, false),
                        new AccessEntry("Execute", LsaPolicyAccess.GenericExecute, true, false),
                        new AccessEntry("View local information", LsaPolicyAccess.ViewLocalInformation, false, true),
                        new AccessEntry("View audit information", LsaPolicyAccess.ViewAuditInformation, false, true),
                        new AccessEntry("Get private information", LsaPolicyAccess.GetPrivateInformation, false, true),
                        new AccessEntry("Trust admin", LsaPolicyAccess.TrustAdmin, false, true),
                        new AccessEntry("Create account", LsaPolicyAccess.CreateAccount, false, true),
                        new AccessEntry("Create secret", LsaPolicyAccess.CreateSecret, false, true),
                        new AccessEntry("Create privilege", LsaPolicyAccess.CreatePrivilege, false, true),
                        new AccessEntry("Set default quota limits", LsaPolicyAccess.SetDefaultQuotaLimits, false, true),
                        new AccessEntry("Set audit requirements", LsaPolicyAccess.SetAuditRequirements, false, true),
                        new AccessEntry("Audit log admin", LsaPolicyAccess.AuditLogAdmin, false, true),
                        new AccessEntry("Server admin", LsaPolicyAccess.ServerAdmin, false, true),
                        new AccessEntry("Lookup names", LsaPolicyAccess.LookupNames, false, true),
                        new AccessEntry("Notification", LsaPolicyAccess.Notification, false, true)
                    };
                    break;
                case ObjectType.LsaSecret:
                    entries = new AccessEntry[]
                    {
                        new AccessEntry("Full control", LsaSecretAccess.All, true, true),
                        new AccessEntry("Read", LsaSecretAccess.GenericRead, true, false),
                        new AccessEntry("Write", LsaSecretAccess.GenericWrite, true, false),
                        new AccessEntry("Execute", LsaSecretAccess.GenericExecute, true, false),
                        new AccessEntry("Query value", LsaSecretAccess.QueryValue, false, true),
                        new AccessEntry("Set value", LsaSecretAccess.SetValue, false, true)
                    };
                    break;
                case ObjectType.Mutant:
                    entries = new AccessEntry[]
                    {
                        new AccessEntry("Full control", MutantAccess.All, true, true),
                        new AccessEntry("Query", MutantAccess.QueryState, true, true)
                    };
                    break;
                case ObjectType.Process:
                    entries = new AccessEntry[]
                    {
                        new AccessEntry("Full control",
                            OSVersion.HasQueryLimitedInformation ?
                            (ProcessAccess.All | ProcessAccess.QueryLimitedInformation) :
                            ProcessAccess.All, true, true),
                        OSVersion.HasQueryLimitedInformation ?
                            new AccessEntry("Query limited information", ProcessAccess.QueryLimitedInformation, true, true) :
                            new AccessEntry(null, 0, false, false),
                        new AccessEntry("Query information",
                            OSVersion.HasQueryLimitedInformation ?
                            (ProcessAccess.QueryInformation | ProcessAccess.QueryLimitedInformation) :
                            ProcessAccess.QueryInformation, true, true),
                        new AccessEntry("Set information", ProcessAccess.SetInformation, true, true),
                        new AccessEntry("Set quotas", ProcessAccess.SetQuota, true, true),
                        new AccessEntry("Set session ID", ProcessAccess.SetSessionId, true, true),
                        new AccessEntry("Create threads", ProcessAccess.CreateThread, true, true),
                        new AccessEntry("Create processes", ProcessAccess.CreateProcess, true, true),
                        new AccessEntry("Modify memory", ProcessAccess.VmOperation, true, true),
                        new AccessEntry("Read memory", ProcessAccess.VmRead, true, true),
                        new AccessEntry("Write memory", ProcessAccess.VmWrite, true, true),
                        new AccessEntry("Duplicate handles", ProcessAccess.DupHandle, true, true),
                        new AccessEntry("Suspend / resume / set port", ProcessAccess.SuspendResume, true, true),
                        new AccessEntry("Terminate", ProcessAccess.Terminate, true, true),
                    };
                    break;
                case ObjectType.Profile:
                    entries = new AccessEntry[]
                    {
                        new AccessEntry("Full control", ProfileAccess.All, true, true),
                        new AccessEntry("Control", ProfileAccess.Control, true, true)
                    };
                    break;
                case ObjectType.SamAlias:
                    entries = new AccessEntry[]
                    {
                        new AccessEntry("Full control", SamAliasAccess.All, true, true),
                        new AccessEntry("Read", SamAliasAccess.GenericRead, true, false),
                        new AccessEntry("Write", SamAliasAccess.GenericWrite, true, false),
                        new AccessEntry("Execute", SamAliasAccess.GenericExecute, true, false),
                        new AccessEntry("Add member", SamAliasAccess.AddMember, false, true),
                        new AccessEntry("Remove member", SamAliasAccess.RemoveMember, false, true),
                        new AccessEntry("List members", SamAliasAccess.ListMembers, false, true),
                        new AccessEntry("Read information", SamAliasAccess.ReadInformation, false, true),
                        new AccessEntry("Write account", SamAliasAccess.WriteAccount, false, true)
                    };
                    break;
                case ObjectType.SamDomain:
                    entries = new AccessEntry[]
                    {
                        new AccessEntry("Full control", SamDomainAccess.All, true, true),
                        new AccessEntry("Read", SamDomainAccess.GenericRead, true, false),
                        new AccessEntry("Write", SamDomainAccess.GenericWrite, true, false),
                        new AccessEntry("Execute", SamDomainAccess.GenericExecute, true, false),
                        new AccessEntry("Read password parameters", SamDomainAccess.ReadPasswordParameters, false, true),
                        new AccessEntry("Write password parameters", SamDomainAccess.WritePasswordParameters, false, true),
                        new AccessEntry("Read other parameters", SamDomainAccess.ReadOtherParameters, false, true),
                        new AccessEntry("Write other parameters", SamDomainAccess.WriteOtherParameters, false, true),
                        new AccessEntry("Create user", SamDomainAccess.CreateUser, false, true),
                        new AccessEntry("Create group", SamDomainAccess.CreateGroup, false, true),
                        new AccessEntry("Create alias", SamDomainAccess.CreateAlias, false, true),
                        new AccessEntry("Get alias membership", SamDomainAccess.GetAliasMembership, false, true),
                        new AccessEntry("List accounts", SamDomainAccess.ListAccounts, false, true),
                        new AccessEntry("Lookup", SamDomainAccess.Lookup, false, true),
                        new AccessEntry("Administer server", SamDomainAccess.AdministerServer, false, true)
                    };
                    break;
                case ObjectType.SamGroup:
                    entries = new AccessEntry[]
                    {
                        new AccessEntry("Full control", SamGroupAccess.All, true, true),
                        new AccessEntry("Read", SamGroupAccess.GenericRead, true, false),
                        new AccessEntry("Write", SamGroupAccess.GenericWrite, true, false),
                        new AccessEntry("Execute", SamGroupAccess.GenericExecute, true, false),
                        new AccessEntry("Add member", SamGroupAccess.AddMember, false, true),
                        new AccessEntry("Remove member", SamGroupAccess.RemoveMember, false, true),
                        new AccessEntry("List members", SamGroupAccess.ListMembers, false, true),
                        new AccessEntry("Read information", SamGroupAccess.ReadInformation, false, true),
                        new AccessEntry("Write account", SamGroupAccess.WriteAccount, false, true)
                    };
                    break;
                case ObjectType.SamServer:
                    entries = new AccessEntry[]
                    {
                        new AccessEntry("Full control", SamServerAccess.All, true, true),
                        new AccessEntry("Read", SamServerAccess.GenericRead, true, false),
                        new AccessEntry("Write", SamServerAccess.GenericWrite, true, false),
                        new AccessEntry("Execute", SamServerAccess.GenericExecute, true, false),
                        new AccessEntry("Connect", SamServerAccess.Connect, false, true),
                        new AccessEntry("Shutdown", SamServerAccess.Shutdown, false, true),
                        new AccessEntry("Initialize", SamServerAccess.Initialize, false, true),
                        new AccessEntry("Create domain", SamServerAccess.CreateDomain, false, true),
                        new AccessEntry("Enumerate domains", SamServerAccess.EnumerateDomains, false, true),
                        new AccessEntry("Lookup domain", SamServerAccess.LookupDomain, false, true)
                    };
                    break;
                case ObjectType.SamUser:
                    entries = new AccessEntry[]
                    {
                        new AccessEntry("Full control", SamUserAccess.All, true, true),
                        new AccessEntry("Read", SamUserAccess.GenericRead, true, false),
                        new AccessEntry("Write", SamUserAccess.GenericWrite, true, false),
                        new AccessEntry("Execute", SamUserAccess.GenericExecute, true, false),
                        new AccessEntry("Read general", SamUserAccess.ReadGeneral, false, true),
                        new AccessEntry("Read preferences", SamUserAccess.ReadPreferences, false, true),
                        new AccessEntry("Write preferences", SamUserAccess.WritePreferences, false, true),
                        new AccessEntry("Read logon", SamUserAccess.ReadLogon, false, true),
                        new AccessEntry("Read account", SamUserAccess.ReadAccount, false, true),
                        new AccessEntry("Write account", SamUserAccess.WriteAccount, false, true),
                        new AccessEntry("Change password", SamUserAccess.ChangePassword, false, true),
                        new AccessEntry("Force password change", SamUserAccess.ForcePasswordChange, false, true),
                        new AccessEntry("List groups", SamUserAccess.ListGroups, false, true),
                        new AccessEntry("Read group information", SamUserAccess.ReadGroupInformation, false, true),
                        new AccessEntry("Write group information", SamUserAccess.WriteGroupInformation, false, true)
                    };
                    break;
                case ObjectType.Section:
                    entries = new AccessEntry[]
                    {
                        new AccessEntry("Full control", SectionAccess.All, true, true),
                        new AccessEntry("Query", SectionAccess.Query, true, true),
                        new AccessEntry("Map for read", SectionAccess.MapRead, true, true),
                        new AccessEntry("Map for write", SectionAccess.MapWrite, true, true),
                        new AccessEntry("Map for execute", SectionAccess.MapExecute, true, true),
                        new AccessEntry("Map for execute (explicit)", SectionAccess.MapExecuteExplicit, true, true),
                        new AccessEntry("Extend size", SectionAccess.ExtendSize, true, true)
                    };
                    break;
                case ObjectType.Semaphore:
                    entries = new AccessEntry[]
                    {
                        new AccessEntry("Full control", SemaphoreAccess.All, true, true),
                        new AccessEntry("Query", SemaphoreAccess.QueryState, true, true),
                        new AccessEntry("Modify", SemaphoreAccess.ModifyState, true, true)
                    };
                    break;
                case ObjectType.Service:
                    entries = new AccessEntry[]
                    {
                        new AccessEntry("Full control", ServiceAccess.All, true, true),
                        new AccessEntry("Query status", ServiceAccess.QueryStatus, true, true),
                        new AccessEntry("Query configuration", ServiceAccess.QueryConfig, true, true),
                        new AccessEntry("Modify configuration", ServiceAccess.ChangeConfig, true, true),
                        new AccessEntry("Enumerate dependents", ServiceAccess.EnumerateDependents, true, true),
                        new AccessEntry("Start", ServiceAccess.Start, true, true),
                        new AccessEntry("Stop", ServiceAccess.Stop, true, true),
                        new AccessEntry("Pause / continue", ServiceAccess.PauseContinue, true, true),
                        new AccessEntry("Interrogate", ServiceAccess.Interrogate, true, true),
                        new AccessEntry("User-defined control", ServiceAccess.UserDefinedControl, true, true)
                    };
                    break;
                case ObjectType.SymbolicLink:
                    entries = new AccessEntry[]
                    {
                        new AccessEntry("Full control", SymbolicLinkAccess.All, true, true),
                        new AccessEntry("Query", SymbolicLinkAccess.Query, true, true)
                    };
                    break;
                case ObjectType.Thread:
                    entries = new AccessEntry[]
                    {
                        new AccessEntry("Full control",
                            OSVersion.HasQueryLimitedInformation ?
                            (ThreadAccess.All | ThreadAccess.QueryLimitedInformation | ThreadAccess.SetLimitedInformation) :
                            ThreadAccess.All, true, true),
                        OSVersion.HasQueryLimitedInformation ?
                            new AccessEntry("Query limited information", ThreadAccess.QueryLimitedInformation, true, true) :
                            new AccessEntry(null, 0, false, false),
                        new AccessEntry("Query information", ThreadAccess.QueryInformation, true, true),
                        OSVersion.HasQueryLimitedInformation ?
                            new AccessEntry("Set limited information", ThreadAccess.SetLimitedInformation, true, true) :
                            new AccessEntry(null, 0, false, false),
                        new AccessEntry("Set information", ThreadAccess.SetInformation, true, true),
                        new AccessEntry("Get context", ThreadAccess.GetContext, true, true),
                        new AccessEntry("Set context", ThreadAccess.SetContext, true, true),
                        new AccessEntry("Set token", ThreadAccess.SetThreadToken, true, true),
                        new AccessEntry("Alert", ThreadAccess.Alert, true, true),
                        new AccessEntry("Impersonate", ThreadAccess.Impersonate, true, true),
                        new AccessEntry("Direct impersonate", ThreadAccess.DirectImpersonation, true, true),
                        new AccessEntry("Suspend / resume", ThreadAccess.SuspendResume, true, true),
                        new AccessEntry("Terminate", ThreadAccess.Terminate, true, true),
                    };
                    break;
                case ObjectType.Timer:
                    entries = new AccessEntry[]
                    {
                        new AccessEntry("Full control", TimerAccess.All, true, true),
                        new AccessEntry("Query", TimerAccess.QueryState, true, true),
                        new AccessEntry("Modify", TimerAccess.ModifyState, true, true)
                    };
                    break;
                case ObjectType.TmEn:
                    entries = new AccessEntry[]
                    {
                        new AccessEntry("Full control", EnlistmentAccess.All, true, true),
                        new AccessEntry("Read", EnlistmentAccess.GenericRead, true, false),
                        new AccessEntry("Write", EnlistmentAccess.GenericWrite, true, false),
                        new AccessEntry("Execute", EnlistmentAccess.GenericExecute, true, false),
                        new AccessEntry("Query information", EnlistmentAccess.QueryInformation, false, true),
                        new AccessEntry("Set information", EnlistmentAccess.SetInformation, false, true),
                        new AccessEntry("Recover", EnlistmentAccess.Recover, false, true),
                        new AccessEntry("Subordinate rights", EnlistmentAccess.SubordinateRights, false, true),
                        new AccessEntry("Superior rights", EnlistmentAccess.SuperiorRights, false, true)
                    };
                    break;
                case ObjectType.TmRm:
                    entries = new AccessEntry[]
                    {
                        new AccessEntry("Full control", ResourceManagerAccess.All, true, true),
                        new AccessEntry("Read", ResourceManagerAccess.GenericRead, true, false),
                        new AccessEntry("Write", ResourceManagerAccess.GenericWrite, true, false),
                        new AccessEntry("Execute", ResourceManagerAccess.GenericExecute, true, false),
                        new AccessEntry("Query information", ResourceManagerAccess.QueryInformation, false, true),
                        new AccessEntry("Set information", ResourceManagerAccess.SetInformation, false, true),
                        new AccessEntry("Get notifications", ResourceManagerAccess.GetNotification, false, true),
                        new AccessEntry("Enlist", ResourceManagerAccess.Enlist, false, true),
                        new AccessEntry("Recover", ResourceManagerAccess.Recover, false, true),
                        new AccessEntry("Register protocols", ResourceManagerAccess.RegisterProtocol, false, true),
                        new AccessEntry("Complete propagation", ResourceManagerAccess.CompletePropagation, false, true)
                    };
                    break;
                case ObjectType.TmTm:
                    entries = new AccessEntry[]
                    {
                        new AccessEntry("Full control", TmAccess.All, true, true),
                        new AccessEntry("Read", TmAccess.GenericRead, true, false),
                        new AccessEntry("Write", TmAccess.GenericWrite, true, false),
                        new AccessEntry("Execute", TmAccess.GenericExecute, true, false),
                        new AccessEntry("Query information", TmAccess.QueryInformation, false, true),
                        new AccessEntry("Set information", TmAccess.SetInformation, false, true),
                        new AccessEntry("Recover", TmAccess.Recover, false, true),
                        new AccessEntry("Rename", TmAccess.Rename, false, true),
                        new AccessEntry("Create resource manager", TmAccess.CreateRm, false, true),
                        new AccessEntry("Bind transactions", TmAccess.BindTransaction, false, true)
                    };
                    break;
                case ObjectType.TmTx:
                    entries = new AccessEntry[]
                    {
                        new AccessEntry("Full control", TransactionAccess.All, true, true),
                        new AccessEntry("Read", TransactionAccess.GenericRead, true, false),
                        new AccessEntry("Write", TransactionAccess.GenericWrite, true, false),
                        new AccessEntry("Execute", TransactionAccess.GenericExecute, true, false),
                        new AccessEntry("Query information", TransactionAccess.QueryInformation, false, true),
                        new AccessEntry("Set information", TransactionAccess.SetInformation, false, true),
                        new AccessEntry("Enlist", TransactionAccess.Enlist, false, true),
                        new AccessEntry("Commit", TransactionAccess.Commit, false, true),
                        new AccessEntry("Rollback", TransactionAccess.Rollback, false, true),
                        new AccessEntry("Propagate", TransactionAccess.Propagate, false, true),
                    };
                    break;
                case ObjectType.Token:
                    entries = new AccessEntry[]
                    {
                        new AccessEntry("Full control", TokenAccess.All, true, true),
                        new AccessEntry("Read", TokenAccess.GenericRead, true, false),
                        new AccessEntry("Write", TokenAccess.GenericWrite, true, false),
                        new AccessEntry("Execute", TokenAccess.GenericExecute, true, false),
                        new AccessEntry("Adjust privileges", TokenAccess.AdjustPrivileges, false, true),
                        new AccessEntry("Adjust groups", TokenAccess.AdjustGroups, false, true),
                        new AccessEntry("Adjust defaults", TokenAccess.AdjustDefault, false, true),
                        new AccessEntry("Adjust session ID", TokenAccess.AdjustSessionId, false, true),
                        new AccessEntry("Assign as primary token", TokenAccess.AssignPrimary, false, true),
                        new AccessEntry("Duplicate", TokenAccess.Duplicate, false, true),
                        new AccessEntry("Impersonate", TokenAccess.Impersonate, false, true),
                        new AccessEntry("Query", TokenAccess.Query, false, true),
                        new AccessEntry("Query source", TokenAccess.QuerySource, false, true)
                    };
                    break;
                case ObjectType.Type:
                    entries = new AccessEntry[]
                    {
                        new AccessEntry("Full control", TypeObjectAccess.All, true, true),
                        new AccessEntry("Create", TypeObjectAccess.Create, true, true)
                    };
                    break;
                case ObjectType.WindowStation:
                    entries = new AccessEntry[]
                    {
                        new AccessEntry("Full control", WindowStationAccess.All, true, true),
                        new AccessEntry("Read", WindowStationAccess.GenericRead, true, false),
                        new AccessEntry("Write", WindowStationAccess.GenericWrite, true, false),
                        new AccessEntry("Execute", WindowStationAccess.GenericExecute, true, false),
                        new AccessEntry("Enumerate", WindowStationAccess.Enumerate, false, true),
                        new AccessEntry("Enumerate desktops", WindowStationAccess.EnumDesktops, false, true),
                        new AccessEntry("Read attributes", WindowStationAccess.ReadAttributes, false, true),
                        new AccessEntry("Read screen", WindowStationAccess.ReadScreen, false, true),
                        new AccessEntry("Access clipboard", WindowStationAccess.AccessClipboard, false, true),
                        new AccessEntry("Access global atoms", WindowStationAccess.AccessGlobalAtoms, false, true),
                        new AccessEntry("Create desktop", WindowStationAccess.CreateDesktop, false, true),
                        new AccessEntry("Write attributes", WindowStationAccess.WriteAttributes, false, true),
                        new AccessEntry("Exit windows", WindowStationAccess.ExitWindows, false, true)
                    };
                    break;
                default:
                    entries = null;
                    break;
            }

            // Add the standard rights.
            return Utils.Concat<AccessEntry>(entries, new AccessEntry[]
            {
                new AccessEntry("Synchronize", StandardRights.Synchronize, false, true),
                new AccessEntry("Delete", StandardRights.Delete, false, true),
                new AccessEntry("Read permissions", StandardRights.ReadControl, false, true),
                new AccessEntry("Change permissions", StandardRights.WriteDac, false, true),
                new AccessEntry("Take ownership", StandardRights.WriteOwner, false, true)
            });
        }