SKETCH OF HOW RESEARCH MIGHT CONTINUE AND RESULTS BE PRESENTED
ESERVERSILO_GLOBALS
The ESERVERSILO_GLOBALS (formally _ESERVERSILO_GLOBALS) holds the essence of system state that is presented differently to software in the corresponding server silo.
Variability
The ESERVERSILO_GLOBALS is highly susceptible to changing between builds. The following changes of size give some rough indication:
Version | Size (x86) | Size (x64) |
---|---|---|
10.0 to 1511 | 0x44 | 0x80 |
1607 | 0x0288 | 0x0430 |
1703 | 0x0290 | 0x0460 |
1709 to 1903 | 0x02A0 | 0x0480 |
2004 | 0x02A0 | 0x0490 |
Much of the expansion for Version 1607 came ultimately from one change. Earlier versions provide for arbitrary callers to obtain storage for their own context to associate with each server silo. The kernel used this internally to support the ETW_SILODRIVERSTATE, OBP_SILODRIVERSTATE, SEP_RM_LSA_CONNECTION_STATE, SEP_SILOSTATE and WNF_SILODRIVERSTATE structures as per-silo state for specialised purposes. Version 1607 moved all these, or at least a pointer to them, into the ESERVERSILO_GLOBALS as if built-in.
Layout
The sizes in the preceding table and the offsets, names and types in the next are from NTOSP.H for the first two releases of Windows 10 and are thereafter from type information in public symbol files for the kernel.
Offset (x86) | Offset (x64) | Definition | Versions | Remarks |
---|---|---|---|---|
0x00 (10.0 to 1511) | 0x00 (10.0 to 1511) |
ULONG ServiceSessionId; |
10.0 to 1511 | |
0x04 (10.0 to 1511) | 0x08 (10.0 to 1511) |
UNICODE_STRING SiloRootDirectoryName; |
10.0 to 1511 | next at 0x023C and 0x03C8 |
0x0C (10.0 to 1511) | 0x18 (10.0 to 1511) |
HANDLE SiloRootDirectoryHandle; |
10.0 to 1511 | |
0x10 (10.0 to 1511) | 0x20 (10.0 to 1511) |
ULONG HardErrorState; |
10.0 to 1511 | next at 0x01F8 and 0x0370 |
0x14 (10.0 to 1511) |
0x28 (10.0 to 1511) |
EPROCESS *ExpDefaultErrorPortProcess; |
10.0 to 1511 | next at 0x01F0 and 0x0360 |
0x18 (10.0 to 1511) |
0x30 (10.0 to 1511) |
HANDLE ExpDefaultErrorPort; |
10.0 to 1511 | next at 0x01F4 and 0x0368 |
0x1C (10.0 to 1511) | 0x38 (10.0 to 1511) |
EPROCESS *MiSessionLeaderProcess; |
10.0 to 1511 | next at 0x01EC and 0x0358 |
0x20 (10.0 to 1511) | 0x40 (10.0 to 1511) |
PVOID *MonitorContextArray; |
10.0 to 1511 | |
0x24 (10.0 to 1511) | 0x48 (10.0 to 1511) |
ULONG MonitorContextArrayLength; |
10.0 to 1511 |
In the first draft of support for server silos, calling PsRegisterMonitorServerSilo to register as a monitor of server silos creates a SERVER_SILO_MONITOR structure and allocates to it a slot in ever server silo’s MonitorContextArray. The monitor may then call PsAllocateMonitorContextServerSilo to obtain storage whose address the function puts into the monitor’s slot of a given server silo’s MonitorContextArray.
Version 1607 reworked this, arguably for better. The MonitorContextArray goes away but the structures that the kernel itself used to insert as monitor contexts were neither thrown away nor adapted to the replacement interface. They were instead absorbed into a reworked ESERVERSILO_GLOBALS:
Offset (x86) | Offset (x64) | Definition | Versions | Remarks |
---|---|---|---|---|
0x00 | 0x00 |
OBP_SILODRIVERSTATE ObSiloState; |
1607 and higher | |
0x01A4 | 0x02E0 |
SEP_SILOSTATE SeSiloState; |
1607 and higher | |
0x01B8 (1607); 0x01C0 |
0x0300 (1607); 0x0310 |
SEP_RM_LSA_CONNECTION_STATE SeRmSiloState; |
1607 and higher | |
0x01E8 (1607); 0x01F0 |
0x0350 (1607); 0x0360 |
ETW_SILODRIVERSTATE *EtwSiloState; |
1607 and higher | |
0x01EC (1607); 0x01F4 |
0x0358 (1607); 0x0368 |
EPROCESS *MiSessionLeaderProcess; |
1607 and higher | previously at 0x1C and 0x38 |
0x01F0 (1607); 0x01F8 |
0x0360 (1607); 0x0370 |
EPROCESS *ExpDefaultErrorPortProcess; |
1607 and higher | previously at 0x14 and 0x28 |
0x01F4 (1607); 0x01FC |
0x0368 (1607); 0x0378 |
HANDLE ExpDefaultErrorPort; |
1607 and higher | previously at 0x18 and 0x30 |
0x01F8 (1607); 0x0200 |
0x0370 (1607); 0x0380 |
ULONG HardErrorState; |
1607 and higher | previously at 0x10 and 0x20 |
0x0204 | 0x0388 |
EXP_LICENSE_STATE *ExpLicenseState; |
2004 and higher | |
0x0200 (1607); 0x0208 |
0x0378 (1607); 0x0388 (1703 to 1903); 0x0390 |
WNF_SILODRIVERSTATE WnfSiloState; |
1607 and higher | |
0x0238 | 0x03C0 (1709 to 1903); 0x03C8 |
DBGK_SILOSTATE DbgkSiloState; |
1709 and higher | |
0x0238 (1703); 0x0248 |
0x03C0 (1703); 0x03E0 (1709 to 1903); 0x03E8 |
UNICODE_STRING PsProtectedCurrentDirectory; |
1703 and higher | |
0x0240 (1703); 0x0250 |
0x03D0 (1703); 0x03F0 (1709 to 1903); 0x03F8 |
UNICODE_STRING PsProtectedEnvironment; |
1703 and higher | |
0x0230 (1607); 0x0248 (1703); 0x0258 |
0x03B0 (1607); 0x03E0 (1703); 0x0400 (1709 to 1903); 0x0408 |
PVOID ApiSetSection; |
1607 and higher | |
0x0234 (1607); 0x024C (1703); 0x025C |
0x03B8 (1607); 0x03E8 (1703); 0x0408 (1709 to 1903); 0x0410 |
PVOID ApiSetSchema; |
1607 and higher | |
0x0238 (1607); 0x0250 (1703); 0x0260 |
0x03C0 (1607); 0x03F0 (1703); 0x0410 (1709 to 1903); 0x0418 |
BOOLEAN OneCoreForwardersEnabled; |
1607 and higher | |
0x0254 (1703); 0x0264 |
0x03F8 (1703); 0x0418 (1709 to 1903); 0x0420 |
UNICODE_STRING NtSystemRoot; |
1703 and higher | |
0x023C (1607); 0x025C (1703); 0x026C |
0x03C8 (1607); 0x0408 (1703); 0x0428 (1709 to 1903); 0x0430 |
UNICODE_STRING SiloRootDirectoryName; |
1607 and higher | previously at 0x04 and 0x08 |
0x0244 (1607); 0x0264 (1703); 0x0274 |
0x03D8 (1607); 0x0418 (1703); 0x0438 (1709 to 1903); 0x0440 |
PSP_STORAGE *Storage; |
1607 and higher | |
0x28 (10.0 to 1511) | 0x50 (10.0 to 1511) |
WORK_QUEUE_ITEM TerminateWorkItem; |
10.0 to 1511 | next at 0x0278 and 0x0410 |
0x38 (10.0 to 1511); 0x0248 (1607); 0x0268 (1703); 0x0278 |
0x70 (10.0 to 1511); 0x03E0 (1607); 0x0420 (1703); 0x0440 (1709 to 1903); 0x0448 |
SERVERSILO_STATE State; |
10.0 and higher | |
0x3C (10.0 to 1511); 0x024C (1607); 0x026C (1703); 0x027C |
0x74 (10.0 to 1511); 0x03E4 (1607); 0x0424 (1703); 0x0444 (1709 to 1903); 0x044C |
COMPARTMENT_ID DefaultCompartmentId; |
10.0 only | |
NTSTATUS ExitStatus; |
1511 and higher | |||
0x40 (10.0 to 1511) | 0x78 (10.0 to 1511) |
PVOID SystemProcessSecurityPort; |
10.0 to 1511 | |
0x0250 (1607); 0x0270 (1703); 0x0280 |
0x03E8 (1607); 0x0428 (1703); 0x0448 (1709 to 1903); 0x0450 |
KEVENT *DeleteEvent; |
1607 and higher | |
0x0258 (1607); 0x0274 (1703); 0x0284 |
0x03F0 (1607); 0x0430 (1703); 0x0450 (1709 to 1903); 0x0458 |
SILO_USER_SHARED_DATA UserSharedData; |
1607 only | |
SILO_USER_SHARED_DATA *UserSharedData; |
1703 and higher | |||
0x0278 (1703); 0x0288 |
0x0438 (1703); 0x0458 (1709 to 1903); 0x0460 |
PVOID UserSharedSection; |
1703 and higher | |
0x0278 (1607); 0x027C (1703); 0x028C |
0x0410 (1607); 0x0440 (1703); 0x0460 (1709 to 1903); 0x0468 |
EX_WORK_QUEUE_ITEM TerminateWorkItem; |
1607 and higher | previously at 0x28 and 0x50 |
0x029C | 0x0488 |
BOOLEAN IsDownlevelContainer; |
2004 and higher |