PsRegisterSiloMonitor

INT64 __fastcall PsRegisterSiloMonitor(INT64 a1, CHAR **a2){
  _WORD *v4; 
  _EJOB *CurrentSilo; 
  __int64 v6; 
  char *PoolWithTag; 
  char *v8; 
  UNICODE_STRING *v9; 
  int v10; 
  if( !*(_BYTE *)a1 )
    return 3221225485i64;
  v4 = *(_WORD **)(a1 + 8);
  if( !v4 || !*v4 || !*(_QWORD *)(a1 + 16) && !*(_QWORD *)(a1 + 24) )
    return 3221225485i64;
  CurrentSilo = PsGetCurrentSilo();
  if( !PsIsHostSilo(CurrentSilo) )
    return 3221225569i64;
  v6 = **(unsigned __int16 **)(a1 + 8);
  PoolWithTag = (char *)ExAllocatePoolWithTag(PagedPool, v6 + 56, 0x4D6C6953ui64);
  v8 = PoolWithTag;
  if( !PoolWithTag )
    return 3221225626i64;
  memset((INT64)PoolWithTag, 0i64);
  v8[16] = *(_BYTE *)(a1 + 1);
  v8[17] = *(_BYTE *)(a1 + 2);
  *((_QWORD *)v8 + 3) = *(_QWORD *)(a1 + 16);
  *((_QWORD *)v8 + 4) = *(_QWORD *)(a1 + 24);
  *((_QWORD *)v8 + 6) = v8 + 56;
  *((_WORD *)v8 + 21) = v6;
  RtlCopyUnicodeString((UNICODE_STRING *)(v8 + 40), *(UNICODE_STRING **)(a1 + 8), v9);
  v10 = PspStorageAllocSlot((UINT64)(v8 + 20));
  if( v10 < 0 )
  {
    ExFreePoolWithTag(v8, 0x4D6C6953u);
    return(unsigned int)v10;
  }
  else
  {
    *a2 = v8;
    return 0i64;
  }
}

Referenced by:

No references.