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