ObGetSiloRootDirectoryPath

NTSTATUS __stdcall ObGetSiloRootDirectoryPath(_EJOB *Silo, _UNICODE_STRING *DirectoryName){
  NTSTATUS result; 
  _EJOB *ParentSilo; 
  UINT64 JobId; 
  UNICODE_STRING *v7; 
  unsigned int v8; 
  wchar_t *PoolWithTag; 
  struct _UNICODE_STRING String; 
  UNICODE_STRING Source; 
  char v12; 
  *(_QWORD *)&Source.Length = 262146i64;
  Source.Buffer = (wchar_t *)L"\\";
  result = PsGetPermanentSiloContext(Silo, (unsigned int)PsObjectDirectorySiloContextSlot, (PVOID *)&String);
  if( result >= 0 )
  {
    ParentSilo = (_EJOB *)PsGetParentSilo((INT64)Silo);
    if( PsGetCurrentSilo() != ParentSilo )
      return -1073740007;
    JobId = 0i64;
    *(_QWORD *)&String.Length = 1441792i64;
    String.Buffer = (wchar_t *)&v12;
    if( Silo )
      JobId = Silo->JobId;
    result = RtlIntegerToUnicodeString(JobId, 0xAui64, &String);
    if( result >= 0 )
    {
      v8 = String.Length + 14;
      if( DirectoryName->Buffer )
      {
        if( DirectoryName->MaximumLength < v8 )
          return -1073741789;
      }
      else
      {
        PoolWithTag = (wchar_t *)ExAllocatePoolWithTag(PagedPool, v8, 0x6D4E624Fui64);
        DirectoryName->Buffer = PoolWithTag;
        if( !PoolWithTag )
          return -1073741670;
        DirectoryName->Length = 0;
        DirectoryName->MaximumLength = v8;
      }
      RtlCopyUnicodeString(DirectoryName, (UNICODE_STRING *)&ObpSilosDirectoryName, v7);
      RtlAppendUnicodeStringToString(DirectoryName, &Source);
      RtlAppendUnicodeStringToString(DirectoryName, &String);
      return 0;
    }
  }
  return result;
}

Referenced by:

NtQueryInformationJobObject
PspConvertSiloToServerSilo