DRAFT: Take more than your usual care.

SERVER_SILO_MONITOR

The SERVER_SILO_MONITOR (formally _SERVER_SILO_MONITOR) represents a registered monitor of server silos in the first two releases of Windows 10. A driver or other kernel-mode software calls the PsRegisterMonitorServerSilo function to express its interest in what’s done with server silos. This creates a SERVER_SILO_MONITOR whose address can then be used when calling several other functions.

The substantial reworking of the silo implementation for Version 1607 discontinued the PsRegisterMonitorServerSilo function in favour of a new PsRegisterSiloMonitor which, among other differences, creates a SILO_MONITOR instead.

Documentation Status

Microsoft is not known ever to have documented the SERVER_SILO_MONITOR or to have published a C-language definition or even to have let a definition slip out as type information in symbol files.

Microsoft’s name for the structure is known from the NTOSP.H headers which Microsoft published, possibly by oversight, in the Windows Driver Kit (WDK) for the original and 1511 releases of WIndows 10. It is there defined only as an opaque type. Public symbol files for the kernel in these versions also name the structure in type information, but only from its declaration, not as a definition.

Variability

The SERVER_SILO_MONITOR likely would have been highly susceptible to changing between builds had it persisted. Even during its short live, it changed size when one member was removed:

Version Size (x86) Size (x64)
10.0 0x48 0x80
1511 0x40 0x70

Layout

Microsoft’s names and types of the structure’s members are not known. Type information in the public symbol files for the kernel shows only the structure’s name as a declaration, not its members from a definition.

Offset (x86) Offset (x64) Definition Versions
0x00 0x00 unknown LIST_ENTRY 10.0 to 1511
0x08 (10.0) 0x10 (10.0) unknown LIST_ENTRY 10.0 only
0x10 (10.0);
0x08
0x20 (10.0);
0x10
unknown 32-bit tag 10.0 to 1511
0x14 (10.0);
0x0C
0x24 (10.0);
0x14
unknown 32-bit flags 10.0 to 1511
0x18 (10.0);
0x10
0x28 (10.0);
0x18
unknown 32-bit reference count 10.0 to 1511
0x1C (10.0);
0x14
0x30 (10.0);
0x20
unknown EX_RUNDOWN_REF 10.0 to 1511
0x20 (10.0);
0x18
0x38 (10.0);
0x28
NTSTATUS 
(*CreateCallback) (
    PESILO);
10.0 to 1511
0x24 (10.0);
0x1C
0x40 (10.0);
0x30
VOID 
(*TerminateCallback) (
    PESILO, 
    PVOID);
10.0 to 1511
0x28 (10.0);
0x20
0x48 (10.0);
0x38
VOID 
(*DriverLoadCallback) (
    PESILO, 
    PVOID);
10.0 to 1511
0x2C (10.0);
0x24
0x50 (10.0);
0x40
VOID 
(*DriverUnloadCallback) (
    PESILO, 
    PVOID);
10.0 to 1511
0x30 (10.0);
0x28
0x58 (10.0);
0x48
VOID 
(*ContextCleanupCallback) (
    PVOID);
10.0 to 1511
0x34 (10.0);
0x2C
0x60 (10.0);
0x50
unknown UNICODE_STRING 10.0 to 1511
0x3C (10.0);
0x34
0x70 0x60 unknown pointer to DRIVER_OBJECT 10.0 to 1511
0x40 (10.0);
0x38
0x78 (10.0);
0x68
unknown 32-bit index 10.0 to 1511
0x44 (10.0);
0x3C
0x7C (10.0);
0x6C
unknown BOOLEAN 10.0 to 1511
0x45 (10.0);
0x3D (1511)
0x7D (10.0);
0x6D
BOOLEAN UsePagedPoolForContexts;
10.0 to 1511

For a few members, names and types are proposed above by inferring a correspondence with members of another structure for which Microsoft’s names and types are known with certainty. The NTOSP.H that Microsoft disclosed, possibly by oversight, in the Windows Driver Kit (WDK) for both the original and 1511 releases of Windows 10 has a C-language definition of the SERVER_SILO_MONITOR_REGISTRATION structure. This is among the inputs to PsRegisterMonitorServerSilo. That Microsoft’s programmers keep the names when transferring into the lasting SERVER_SILO_MONITOR is at least plausible.

These NTOSP.H headers have type definitions for the several callbacks:

They also both define the PESILO type, which is an argument to most of the callbacks, as a pointer to an otherwise undefined structure named _ESILO. To some extent it doesn’t matter, but this type definition of PESILO is correct only for the original Windows 10. By the 1511 release the ESILO exists no more and the PESILO actually points to an EJOB.