In windows 10 there is no good old EtwpGuidHashTable and all registered Etw stored in SILO. Let`s see how we can extract them
Check first function exported function
EtwRegister:
call _PsGetCurrentServerSiloGlobals@0 ; PsGetCurrentServerSiloGlobals()
push [ebp+arg_C]
mov edx, [ebp+arg_0]
push dword ptr [ebp+4]
mov ecx, [eax+1F0h] ; ESERVERSILO_GLOBALS.EtwSiloState
push [ebp+arg_8]
push [ebp+arg_4]
push 3
call _EtwpRegisterProvider@28 ; EtwpRegisterProvider(x,x,x,x,x,x,x)
Function PsGetCurrentServerSiloGlobals returns processes SILO or default SILO
PspHostSiloGlobals stored in kernel which has type ESERVERSILO_GLOBALS. Field EtwSiloState has type ETW_SILODRIVERSTATE:
struct _ETW_SILODRIVERSTATE {
/* 0x0 */ /*|0x4|*/ struct _ESERVERSILO_GLOBALS* SiloGlobals;
/* 0x8 */ /*|0x168|*/ struct _ETW_GUID_ENTRY EtwpSecurityProviderGuidEntry;
/* 0x170 */ /*|0x100|*/ struct _EX_RUNDOWN_REF_CACHE_AWARE* EtwpLoggerRundown[64];
/* 0x270 */ /*|0x100|*/ struct _WMI_LOGGER_CONTEXT* WmipLoggerContext[64];
/* 0x370 */ /*|0x700|*/ struct _ETW_HASH_BUCKET EtwpGuidHashTable[64];
/* 0xa70 */ /*|0x10|*/ unsigned short EtwpSecurityLoggers[8];
/* 0xa80 */ /*|0x1|*/ unsigned char EtwpSecurityProviderEnableMask;
/* 0xa84 */ /*|0x4|*/ long EtwpShutdownInProgress;
/* 0xa88 */ /*|0x4|*/ unsigned long EtwpSecurityProviderPID;
/* 0xa8c */ /*|0x10|*/ struct _ETW_PRIV_HANDLE_DEMUX_TABLE PrivHandleDemuxTable;
/* 0xa9c */ /*|0x10|*/ struct _ETW_COUNTERS EtwpCounters;
/* 0xab0 */ /*|0x8|*/ union _LARGE_INTEGER LogfileBytesWritten;
/* 0xab8 */ /*|0x4|*/ struct _ETW_SILO_TRACING_BLOCK* ProcessorBlocks;
};