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