Constants and Catalogs
Single-page view · as markdown
Constants and catalogs
Peios / Using Peios / Constants and Catalogs
Numeric constants — right bits, type values, enum members, limits — are catalogued in exactly one place each. This topic is either that place or a pointer to it.
What lives here #
| Page | Holds |
|---|---|
| Access mask bits | Per-object-type rights for files, processes, tokens, registry keys and services; the GenericMapping tables; the *_ALL_ACCESS and STANDARD_RIGHTS_* aggregates. |
| Other constants | Impersonation levels, integrity levels, logon types, elevation types, PIP tiers, audit policy flags, create dispositions, SECURITY_INFORMATION flags, and the kernel's size limits. |
What lives elsewhere #
Three catalogues are owned by documents that also define their semantics, and are not duplicated here.
| Catalogue | Canonical home |
|---|---|
| ACE types, ACE flags, and their numeric values | PCDS §5.4 — see ACE types and flags |
| Well-known SIDs | PCDS §4.4 — see Well-known SIDs |
| Every privilege, with its LUID bit | Peios Kernel TRM §3.4.2 — see Privilege catalog |
The three pages above are signposts. Following one gets you to the table.
Related catalogues #
- Every event type the system emits: the Peios Events Index.
- Every audit event's payload schema: the same book, chapters 3 to 8.
Well-known SIDs
Peios / Using Peios / Constants and Catalogs
The well-known SID catalogue is PCDS §4.4, in the Peios Core Data Structures specification. It is normative there, and is not duplicated here.
It covers the universal SIDs (S-1-1-0 Everyone, S-1-3-0 CREATOR OWNER, and the rest), the NT authority SIDs under S-1-5, the BUILTIN groups under S-1-5-32, domain SID structure, integrity label SIDs under S-1-16, capability SIDs under S-1-15, service SIDs under S-1-5-80, and the PIP trust labels under S-1-19.
For the conceptual treatment — which principals matter and why — read Well-known principals.
A note on the BUILTIN range #
PCDS lists the BUILTIN groups KACS assigns meaning to. It deliberately does not enumerate S-1-5-32-547 through S-1-5-32-583, which Active Directory defines: KACS gives them no special semantics, and they participate in ACE matching like any other group SID.
An older revision of this reference tabulated them. That table was removed on purpose, not lost — enumerating names the system does not act on implies a behaviour that does not exist.
PIP trust labels #
The S-1-19-T-L ladder encodes two dimensions: T is the PIP type axis, L the trust axis. Dominance requires both to be greater than or equal.
The numeric tiers are in Other constants, and the full SID list is in PCDS §4.4. The mechanism is Process integrity protection.
Privilege catalog
Peios / Using Peios / Constants and Catalogs
The per-privilege catalogue — every name, its LUID bit position, and what it does — is in the Peios Kernel TRM §3.4.2, "Catalogue". It is not duplicated here.
The conceptual treatment is Privileges, and the four-category model is Categories.
Five privileges influence an access check #
Only five can contribute bits to a granted mask, and therefore only five can appear in a privilege-use event:
SeSecurityPrivilegeSeTakeOwnershipPrivilegeSeBackupPrivilegeSeRestorePrivilegeSeRelabelPrivilege
Any other bit fails the audit encoder closed rather than emitting an unnamed privilege. See the Events Index §3.3.
Two are enforced but not nameable #
SeTakeOwnershipPrivilege and SeRelabelPrivilege are enforced by KACS but absent from the published privilege table, so they cannot be named in a service's RequiredPrivileges. A service needing either declares nothing and takes its source token's defaults, or fails to start if it tries to name one.
That asymmetry is peinit's, not the kernel's — see the peinit TRM §4.5.
ACE types and flags
Peios / Using Peios / Constants and Catalogs
The ACE catalogue is PCDS §5.4, in the Peios Core Data Structures specification. It is normative there, and is not duplicated here.
It covers every AceType value from 0x00 to 0x15 — the body layout of each family, the AceFlags bits, and the ACL revision rules that constrain which types may appear.
Twenty of those values have behaviour. Two do not: 0x04 (ACCESS_ALLOWED_COMPOUND_ACE, never implemented anywhere) and 0x15 (SYSTEM_ACCESS_FILTER_ACE, an MS-DTYP type Peios has not implemented). Both are named by the kernel ABI so that a decoder can label the byte, but neither affects an access decision: they are skipped when the descriptor is evaluated and preserved unchanged when it is written back. sd has no name for either and prints them as OTHER(0x04) and OTHER(0x15).
Two names per type #
PCDS names both the ACE structure and the AceType constant that selects it, because a reader may arrive with either — one from a declaration, the other from a hex dump. ACCESS_ALLOWED_ACE is the structure; ACCESS_ALLOWED_ACE_TYPE is the constant whose value is 0x00.
The headers use a third spelling, moving the qualifier to the front: KACS_ACE_TYPE_ACCESS_ALLOWED. The Peios Kernel TRM §3.A maps the two vocabularies.
Inheritance flags #
The four propagation flags and the INHERITED_ACE provenance flag are catalogued with the inheritance algorithm in PCDS §5.6, rather than with the type values.
MIC policy bits #
The mask of a SYSTEM_MANDATORY_LABEL_ACE carries policy bits saying what a non-dominant caller may not do. Those bits are in PCDS §5.4 alongside the ACE type; the mechanism is Mandatory integrity control.
Access mask bits
Peios / Using Peios / Constants and Catalogs
The 32-bit access mask has the same shape for every object type. Bits 0–15 are object-specific, 16–20 are standard rights, 24–25 are special, 28–31 are generic. The standard, special and generic regions are uniform; the object-specific bits carry different meanings for different object types.
This page is the catalogue of right values. What the mask means — how it is evaluated, how generic bits expand — is PCDS §5.3, which is normative. The bit layout of the mask within a descriptor is PCDS §5.1.
| Bit range | Region | Examples |
|---|---|---|
| 0–15 | Object-specific | FILE_READ_DATA, PROCESS_TERMINATE, TOKEN_QUERY |
| 16–20 | Standard rights | DELETE, READ_CONTROL, WRITE_DAC, WRITE_OWNER, SYNCHRONIZE |
| 21–23 | Reserved | Rejected at parse. PCDS §5.3. |
| 24–25 | Special | ACCESS_SYSTEM_SECURITY, MAXIMUM_ALLOWED |
| 26–27 | Reserved | Rejected at parse. |
| 28–31 | Generic | GENERIC_ALL, GENERIC_EXECUTE, GENERIC_WRITE, GENERIC_READ |
File access rights #
| Right | Value | For files | For directories (alias) |
|---|---|---|---|
FILE_READ_DATA | 0x0001 | Read file content | FILE_LIST_DIRECTORY — list entries |
FILE_WRITE_DATA | 0x0002 | Write file content | FILE_ADD_FILE — create files |
FILE_APPEND_DATA | 0x0004 | Append-only write | FILE_ADD_SUBDIRECTORY — create subdirectory |
FILE_READ_EA | 0x0008 | Read extended attributes | Same |
FILE_WRITE_EA | 0x0010 | Write extended attributes | Same |
FILE_EXECUTE | 0x0020 | Execute file | FILE_TRAVERSE — traverse through |
FILE_DELETE_CHILD | 0x0040 | (not applicable) | Delete children regardless of their permissions |
FILE_READ_ATTRIBUTES | 0x0080 | Read attributes | Same |
FILE_WRITE_ATTRIBUTES | 0x0100 | Write attributes | Same |
The directory names are aliases: identical bit values, different naming convention depending on whether the object is a file or a directory.
File GenericMapping #
| Generic right | Maps to |
|---|---|
GENERIC_READ | FILE_READ_DATA | FILE_READ_ATTRIBUTES | FILE_READ_EA | READ_CONTROL | SYNCHRONIZE |
GENERIC_WRITE | FILE_WRITE_DATA | FILE_APPEND_DATA | FILE_WRITE_ATTRIBUTES | FILE_WRITE_EA | READ_CONTROL | SYNCHRONIZE |
GENERIC_EXECUTE | FILE_EXECUTE | FILE_READ_ATTRIBUTES | READ_CONTROL | SYNCHRONIZE |
GENERIC_ALL | Every file-specific bit, plus DELETE, READ_CONTROL, WRITE_DAC, WRITE_OWNER, SYNCHRONIZE |
FILE_ALL_ACCESS = STANDARD_RIGHTS_REQUIRED | SYNCHRONIZE | 0x1FF = 0x001F01FF.
Process access rights #
| Right | Value | Meaning |
|---|---|---|
PROCESS_TERMINATE | 0x0001 | Send terminating signals. |
PROCESS_SIGNAL | 0x0002 | Send non-terminating informational signals — SIGCHLD, SIGURG, SIGWINCH. |
PROCESS_VM_READ | 0x0010 | Read process memory — ptrace(PTRACE_PEEK*), process_vm_readv, /proc/<pid>/mem reads. |
PROCESS_VM_WRITE | 0x0020 | Write process memory — ptrace(PTRACE_POKE*, ATTACH), process_vm_writev. |
PROCESS_DUP_HANDLE | 0x0040 | Duplicate file descriptors out via pidfd_getfd. |
PROCESS_SET_INFORMATION | 0x0200 | Change process attributes — priority, affinity, rlimits, /proc/<pid>/* writes. |
PROCESS_QUERY_INFORMATION | 0x0400 | Detailed process info — token, full /proc/<pid>/* reads. |
PROCESS_SUSPEND_RESUME | 0x0800 | Send stop and continue signals. |
PROCESS_QUERY_LIMITED | 0x1000 | Basic info — PID, image name, state. Required by pidfd_open. |
Bits 0x0004, 0x0008, 0x0080 and 0x0100 are unused.
Process GenericMapping #
| Generic right | Maps to |
|---|---|
GENERIC_READ | PROCESS_QUERY_INFORMATION | PROCESS_VM_READ | READ_CONTROL |
GENERIC_WRITE | PROCESS_SET_INFORMATION | PROCESS_VM_WRITE | WRITE_DAC |
GENERIC_EXECUTE | PROCESS_TERMINATE | PROCESS_SUSPEND_RESUME | PROCESS_QUERY_LIMITED |
GENERIC_ALL | All process-specific bits, plus STANDARD_RIGHTS_REQUIRED | SYNCHRONIZE |
PROCESS_ALL_ACCESS = STANDARD_RIGHTS_REQUIRED | SYNCHRONIZE | 0x1FFF = 0x001F1FFF.
Token access rights #
| Right | Value | Meaning |
|---|---|---|
TOKEN_ASSIGN_PRIMARY | 0x0001 | Install as a process's primary token. |
TOKEN_DUPLICATE | 0x0002 | Create a copy. |
TOKEN_IMPERSONATE | 0x0004 | Install as a thread's impersonation token. |
TOKEN_QUERY | 0x0008 | Read token information. |
TOKEN_QUERY_SOURCE | 0x0010 | Subsumed by TOKEN_QUERY. Reserved for format compatibility. |
TOKEN_ADJUST_PRIVILEGES | 0x0020 | Enable, disable or remove privileges. |
TOKEN_ADJUST_GROUPS | 0x0040 | Enable or disable groups. |
TOKEN_ADJUST_DEFAULT | 0x0080 | Change default DACL, owner index, primary group index. |
TOKEN_ADJUST_SESSIONID | 0x0100 | Change interactive_session_id. Additionally requires SeTcbPrivilege. |
TOKEN_QUERY_SOURCE is a documented bit position rather than an enforced right: a token fd granting TOKEN_QUERY suffices for everything, and TOKEN_QUERY_SOURCE is not separately checked.
Token GenericMapping #
| Generic right | Maps to |
|---|---|
GENERIC_READ | TOKEN_QUERY | READ_CONTROL |
GENERIC_WRITE | TOKEN_ADJUST_PRIVILEGES | TOKEN_ADJUST_GROUPS | TOKEN_ADJUST_DEFAULT | WRITE_DAC |
GENERIC_EXECUTE | TOKEN_IMPERSONATE |
GENERIC_ALL | TOKEN_ALL_ACCESS |
TOKEN_ALL_ACCESS = STANDARD_RIGHTS_REQUIRED | 0x01FF = 0x000F01FF. Note the absence of SYNCHRONIZE, unlike the file and process aggregates.
Registry-key access rights #
| Right | Value | Meaning |
|---|---|---|
KEY_QUERY_VALUE | 0x0001 | Read a value. |
KEY_SET_VALUE | 0x0002 | Write a value. |
KEY_CREATE_SUB_KEY | 0x0004 | Create a subkey. |
KEY_ENUMERATE_SUB_KEYS | 0x0008 | Enumerate subkeys. |
KEY_NOTIFY | 0x0010 | Watch for changes. |
KEY_CREATE_LINK | 0x0020 | Create a symbolic link to another key. |
Bits from 0x0040 upward are reserved.
Registry GenericMapping #
| Generic right | Maps to |
|---|---|
GENERIC_READ | KEY_QUERY_VALUE | KEY_ENUMERATE_SUB_KEYS | KEY_NOTIFY | READ_CONTROL |
GENERIC_WRITE | KEY_SET_VALUE | KEY_CREATE_SUB_KEY | READ_CONTROL |
GENERIC_EXECUTE | READ_CONTROL |
GENERIC_ALL | All key-specific bits, plus STANDARD_RIGHTS_REQUIRED | SYNCHRONIZE |
Service access rights #
| Right | Value | Meaning |
|---|---|---|
SERVICE_QUERY_CONFIG | 0x0001 | Read configuration. |
SERVICE_CHANGE_CONFIG | 0x0002 | Modify configuration. |
SERVICE_QUERY_STATUS | 0x0004 | Read runtime status. |
SERVICE_ENUMERATE_DEPENDENTS | 0x0008 | List dependent services. |
SERVICE_START | 0x0010 | Start the service. |
SERVICE_STOP | 0x0020 | Stop the service. |
SERVICE_PAUSE_CONTINUE | 0x0040 | Pause and resume. |
SERVICE_INTERROGATE | 0x0080 | Request a status update. |
SERVICE_USER_DEFINED_CONTROL | 0x0100 | Send service-specific control codes. |
Standard, special and generic rights #
| Right | Value |
|---|---|
DELETE | 0x00010000 |
READ_CONTROL | 0x00020000 |
WRITE_DAC | 0x00040000 |
WRITE_OWNER | 0x00080000 |
SYNCHRONIZE | 0x00100000 |
ACCESS_SYSTEM_SECURITY | 0x01000000 |
MAXIMUM_ALLOWED | 0x02000000 |
GENERIC_ALL | 0x10000000 |
GENERIC_EXECUTE | 0x20000000 |
GENERIC_WRITE | 0x40000000 |
GENERIC_READ | 0x80000000 |
The STANDARD_RIGHTS aggregates #
| Constant | Value | Composition |
|---|---|---|
STANDARD_RIGHTS_REQUIRED | 0x000F0000 | DELETE | READ_CONTROL | WRITE_DAC | WRITE_OWNER |
STANDARD_RIGHTS_READ | 0x00020000 | Alias of READ_CONTROL |
STANDARD_RIGHTS_WRITE | 0x00020000 | Alias of READ_CONTROL |
STANDARD_RIGHTS_EXECUTE | 0x00020000 | Alias of READ_CONTROL |
STANDARD_RIGHTS_ALL | 0x001F0000 | All five standard rights |
Three of these are the same value. STANDARD_RIGHTS_READ, _WRITE and _EXECUTE are all aliases of READ_CONTROL, which surprises people reading a mask and expecting them to differ. Only STANDARD_RIGHTS_REQUIRED and STANDARD_RIGHTS_ALL name distinct values.
STANDARD_RIGHTS_REQUIRED is the conventional minimum included in every *_ALL_ACCESS aggregate.
Other constants
Peios / Using Peios / Constants and Catalogs
Enumerated values that are not access rights. Access rights are catalogued separately in Access mask bits.
Impersonation levels #
A token's impersonation level. The conceptual model is Impersonation levels.
| Constant | Value | Meaning |
|---|---|---|
KACS_IMLEVEL_ANONYMOUS | 0 | No identity. |
KACS_IMLEVEL_IDENTIFICATION | 1 | Inspect only. Cannot be used for an access check. |
KACS_IMLEVEL_IMPERSONATION | 2 | Act as the client locally. The default. |
KACS_IMLEVEL_DELEGATION | 3 | Act as the client locally, and forward credentials to remote machines. |
Older documents spell these KACS_LEVEL_*. That spelling does not exist in any header.
A primary token reports level 0.
Integrity levels #
The RIDs used in S-1-16-* SIDs and in a token's integrity_level field. The model is Mandatory integrity control.
| Constant | RID | Name |
|---|---|---|
INTEGRITY_LEVEL_UNTRUSTED | 0 | Untrusted |
INTEGRITY_LEVEL_LOW | 4096 | Low |
INTEGRITY_LEVEL_MEDIUM | 8192 | Medium |
INTEGRITY_LEVEL_HIGH | 12288 | High |
INTEGRITY_LEVEL_SYSTEM | 16384 | System |
Spaced by 4096, so future levels can be inserted between existing ones.
These are named levels, not a closed enum. The integrity level is the S-1-16 SID's single sub-authority as an unsigned integer, compared numerically. Any such value is valid, and non-standard ones appear in Windows-interop descriptors — medium-plus at 8448, protected at 20480. Code that switches on the five names will mishandle those.
Mandatory policy flags #
A token's mandatory_policy field. Both are immutable after token creation.
| Flag | Value | Meaning |
|---|---|---|
NO_WRITE_UP | 0x01 | MIC blocks write-category access from lower integrity. |
NEW_PROCESS_MIN | 0x02 | At exec, lower the token's integrity to match the binary if the binary is lower. |
Logon types #
A session's logon_type field. The model is Logon types.
| Constant | Value | Meaning |
|---|---|---|
LOGON_TYPE_INTERACTIVE | 2 | Console, SSH, terminal services. |
LOGON_TYPE_NETWORK | 3 | Network resource access — SMB, RPC, federated. |
LOGON_TYPE_BATCH | 4 | Scheduled job. |
LOGON_TYPE_SERVICE | 5 | Service running under a specific principal. |
LOGON_TYPE_NETWORK_CLEARTEXT | 8 | Network logon with a cleartext credential. |
LOGON_TYPE_NEW_CREDENTIALS | 9 | Keep the local identity; use alternative credentials outbound. |
Values 1, 6, 7 and 10 upward are reserved.
Elevation types #
A token's elevation_type field.
| Constant | Value | Meaning |
|---|---|---|
KACS_ELEVATION_DEFAULT | 1 | Not part of a linked pair. |
KACS_ELEVATION_FULL | 2 | The elevated half of a linked pair. |
KACS_ELEVATION_LIMITED | 3 | The non-elevated half. |
PIP tiers #
A process's PSB pip_type field.
| Value | Meaning |
|---|---|
| 0 | None. Unprotected, the default for unsigned binaries. |
| 512 | Protected. Standard PIP protection. |
| 1024 | Isolated. Reserved; no signing key targets it. |
There are no public constants for these. Nothing in uapi/pkm/ names the tiers, and PIP_TYPE_NONE / _PROTECTED / _ISOLATED — which older documents use — exist nowhere in the tree. Protected survives only as the kernel-private PKM_KACS_PIP_TYPE_PROTECTED.
A program reasoning about tiers compares the numbers. The Peios Kernel TRM §3.7 says the same.
Token audit policy flags #
A token's audit_policy field. These are what force the audit events in the Events Index.
| Flag | Value | Meaning |
|---|---|---|
OBJECT_ACCESS_SUCCESS | 0x01 | Force an audit event on every successful access. |
OBJECT_ACCESS_FAILURE | 0x02 | Force an audit event on every failed access. |
PRIVILEGE_USE_SUCCESS | 0x04 | Emit a privilege-use event when a privilege's bits survive. |
PRIVILEGE_USE_FAILURE | 0x08 | Emit a privilege-use event when its bits are stripped. |
Create dispositions #
For kacs_open.
| Constant | Value | Behaviour |
|---|---|---|
KACS_DISPOSITION_SUPERSEDE | 0 | If it exists, delete and recreate; otherwise create. |
KACS_DISPOSITION_OPEN | 1 | If it exists, open; otherwise fail with ENOENT. |
KACS_DISPOSITION_CREATE | 2 | If it exists, fail with EEXIST; otherwise create. |
KACS_DISPOSITION_OPEN_IF | 3 | If it exists, open; otherwise create. |
KACS_DISPOSITION_OVERWRITE | 4 | If it exists, truncate and open; otherwise fail with ENOENT. |
KACS_DISPOSITION_OVERWRITE_IF | 5 | If it exists, truncate and open; otherwise create. |
Older documents spell these KACS_FILE_SUPERSEDE, KACS_FILE_OPEN and so on. That spelling does not exist in any header.
SECURITY_INFORMATION flags #
For kacs_get_sd and kacs_set_sd. Declared as KACS_SECINFO_*; the names below are the MS-DTYP spellings PCDS uses.
| Flag | Value | Right to read | Right to write |
|---|---|---|---|
OWNER_SECURITY_INFORMATION | 0x01 | READ_CONTROL | WRITE_OWNER |
GROUP_SECURITY_INFORMATION | 0x02 | READ_CONTROL | WRITE_OWNER |
DACL_SECURITY_INFORMATION | 0x04 | READ_CONTROL | WRITE_DAC |
SACL_SECURITY_INFORMATION | 0x08 | ACCESS_SYSTEM_SECURITY | ACCESS_SYSTEM_SECURITY |
LABEL_SECURITY_INFORMATION | 0x10 | READ_CONTROL | WRITE_OWNER, plus the integrity rules |
SACL_SECURITY_INFORMATION and LABEL_SECURITY_INFORMATION are mutually exclusive in one call.
Process mitigation flags #
The KACS_MIT_* flags on the PSB. The catalogue of what each one gates is Process mitigations.
Size and count limits #
| Limit | Value | Context |
|---|---|---|
| Max SD size | 65,535 bytes | Any SD blob. Normative in PCDS §5.1. |
| Max ACL size | 64 KB | Any ACL within an SD |
| Max single ACE size | 64 KB | Bounded by the ACL size |
| Min SID size | 8 bytes | Revision, count and authority, no sub-authorities |
| Max SID size | 68 bytes | 15 sub-authorities |
| Max token wire spec | 64 KB | kacs_create_token input |
| Max session wire spec | 4096 bytes | kacs_create_session input |
| Max CAAP wire spec | 256 KB | kacs_set_caap input |
| Max CAAP rules per policy | 256 | |
| Max applies-to expression | 64 KB | Per CAAP rule |
| Max conditional stack depth | 1024 | Evaluator limit |
| Max TLP cache entries | 64 | Trusted Library Path prefixes |
| Max TLP path length | 4096 bytes | Per prefix |
| Max mount template SD | 64 KB | kacs_set_mount_policy template |