JobFlags in the EJOB

Windows 8 formalised the nature of the old JobFlags member of the EJOB by putting it in a union with a structure of ULONG bit fields. These have been remarkably stable. With only one exception, all changes just define new bits at the most significant end. By the 1703 release of Windows 10, no spare bits remained and additions continue into a JobFlags2.

Mask Definition Versions
0x00000001
ULONG CloseDone : 1;
6.2 and higher
0x00000002
ULONG MultiGroup : 1;
6.2 and higher
0x00000004
ULONG OutstandingNotification : 1;
6.2 and higher
0x00000008
ULONG NotificationInProgress : 1;
6.2 and higher
0x00000010
ULONG UILimits : 1;
6.2 and higher
0x00000020
ULONG CpuRateControlActive : 1;
6.2 and higher
0x00000040
ULONG OwnCpuRateControl : 1;
6.2 and higher
0x00000080
ULONG Terminating : 1;
6.2 and higher
0x00000100
ULONG WorkingSetLock : 1;
6.2 and higher
0x00000200
ULONG JobFrozen : 1;
6.2 and higher
0x00000400
ULONG Background : 1;
6.2 and higher
0x00000800
ULONG WakeNotificationAllocated : 1;
6.2 and higher
0x00001000
ULONG WakeNotificationEnabled : 1;
6.2 and higher
0x00002000
ULONG WakeNotificationPending : 1;
6.2 and higher
0x00004000
ULONG LimitNotificationRequired : 1;
6.2 and higher
0x00008000
ULONG ZeroCountNotificationRequired : 1;
6.2 and higher
0x00010000
ULONG CycleTimeNotificationRequired : 1;
6.2 and higher
0x00020000
ULONG CycleTimeNotificationPending : 1;
6.2 and higher
0x00040000
ULONG TimersVirtualized : 1;
6.2 and higher
0x00080000
ULONG JobSwapped : 1;
6.2 and higher
0x00100000
ULONG ViolationDetected : 1;
6.2 and higher
0x00200000
ULONG EmptyJobNotified : 1;
6.2 and higher
0x00400000
ULONG NoSystemCharge : 1;
6.2 and higher
0x00800000
ULONG DropNoWakeCharges : 1;
6.3 and higher
0x01000000
ULONG NoWakeChargePolicyDetected : 1;
6.3 and higher
0x02000000
ULONG NetRateControlActive : 1;
10.0 and higher
0x04000000
ULONG OwnNetRateControl : 1;
10.0 and higher
0x08000000
ULONG IoRateControlActive : 1;
10.0 and higher
0x10000000
ULONG OwnIoRateControl : 1;
10.0 and higher
0x20000000
ULONG IsContainerRoot : 1;
10.0 only
ULONG DisallowNewProcesses : 1;
1511 and higher
0x40000000
ULONG Silo : 1;
1607 and higher
0x80000000
ULONG ContainerTelemetryIdSet : 1;
1703 and higher
 
ULONG SpareJobFlags : 9;
6.2 only
ULONG SpareJobFlags : 7;
6.3 only
ULONG SpareJobFlags : 2;
10.0 to 1511
ULONG Spare : 1;
1607 only

The Silo flag that was added for Version 1607 marks in some sense the completion of Microsoft’s faltering progress from implementing silos as their own type of object, as for the original Windows 10, to making them a special type of job object. Version 1511 had already done away with the silo object: a job is a silo if it has a SILO_CONTEXT pointed to from its Container member. In Version 1607 and higher, the one indicator that a job is a silo is the set Silo bit. If in addition an EJOB has ServerSiloGlobals pointing to an ESERVERSILO_GLOBALS, then the job is specifically a server silo.