ObGetSiloRootDirectoryPath

NTSTATUS __stdcall ObGetSiloRootDirectoryPath(_EJOB *Silo, _UNICODE_STRING *DirectoryName){
  NTSTATUS result; 
  _EJOB *v5; 
  UINT64 v6; 
  unsigned int v7; 
  VOID **PoolWithTag; 
  PVOID ReturnedSiloContext[2]; 
  _UNICODE_STRING Source; 
  char v11; 

  *(_QWORD *)&Source.Length = 262146i64;
  Source.Buffer = (wchar_t *)L"\\";
  result = PsGetPermanentSiloContext(Silo, (unsigned int)PsObjectDirectorySiloContextSlot, ReturnedSiloContext);
  if( result >= 0 )
  {
    LODWORD(v5) = PsGetParentSilo((INT64)Silo);
    if( PsGetCurrentSilo() != v5 )
      return -1073740007;
    v6 = 0i64;
    ReturnedSiloContext[0] = (PVOID)1441792;
    ReturnedSiloContext[1] = &v11;
    if( Silo )
      v6 = *((unsigned int *)Silo + 309);
    result = RtlIntegerToUnicodeString(v6, 0xAui64, (_UNICODE_STRING *)ReturnedSiloContext);
    if( result >= 0 )
    {
      v7 = LOWORD(ReturnedSiloContext[0]) + 14;
      if( DirectoryName->Buffer )
      {
        if( DirectoryName->MaximumLength < v7 )
          return -1073741789;
      }
      else
      {
        PoolWithTag = ExAllocatePoolWithTag(1ui64, v7, 1833853519i64);
        DirectoryName->Buffer = (wchar_t *)PoolWithTag;
        if( !PoolWithTag )
          return -1073741670;
        DirectoryName->Length = 0;
        DirectoryName->MaximumLength = v7;
      }
      RtlCopyUnicodeString(DirectoryName, &ObpSilosDirectoryName);
      RtlAppendUnicodeStringToString(DirectoryName, &Source);
      RtlAppendUnicodeStringToString(DirectoryName, (_UNICODE_STRING *)ReturnedSiloContext);
      return 0;
    }
  }
  return result;
}

Referenced by:

NtQueryInformationJobObject
PspConvertSiloToServerSilo