ObCreateSiloRootDirectory
NTSTATUS __stdcall ObCreateSiloRootDirectory(_EJOB *Silo, UINT64 Flags){
_ADAPTER_OBJECT *v2;
_ADAPTER_OBJECT *v3;
char v4;
INT64 v6;
__int64 v7;
__int64 v8;
PKINTERRUPT_ROUTINE **v9;
UINT32 v10;
PKINTERRUPT_ROUTINE *v11;
__int64 v12;
INT64 v14;
_EJOB *v15;
_EJOB *v16;
UINT64 v17;
int SilosRootDirectory;
NTSTATUS v19;
void *v20;
PVOID *Object;
_HANDLE Handle[2];
void *ReturnedSiloContext;
PVOID DosDevicesShadowDirectory;
VOID *RootHandle;
VOID *DirectoryHandle;
_OBJECT_ATTRIBUTES ObjectAttributes;
PVOID v28;
_UNICODE_STRING String;
char v30;
DosDevicesShadowDirectory = 0i64;
RootHandle = 0i64;
v2 = 0i64;
DirectoryHandle = 0i64;
v3 = 0i64;
*(_QWORD *)Handle = 0i64;
v4 = Flags;
ReturnedSiloContext = 0i64;
memset(&ObjectAttributes, 0, sizeof(ObjectAttributes));
if( (Flags & 0xFFFFFFF8) != 0 || (Flags & 6) == 4 || !PsIsJobParentImmutable((INT64)Silo) )
return -1073741811;
LODWORD(v7) = PsGetParentSilo(v6);
v8 = v7;
LODWORD(v12) = HalSystemVectorDispatchEntry(v10, v9, v11);
if( v8 != v12 )
return -1073740007;
LODWORD(v14) = PsGetParentSilo((INT64)Silo);
LODWORD(v15) = PsAttachSiloToCurrentThread(v14);
v16 = v15;
*(_QWORD *)&String.Length = 1441792i64;
String.Buffer = (wchar_t *)&v30;
if( Silo )
v17 = *((unsigned int *)Silo + 309);
else
v17 = 0i64;
SilosRootDirectory = RtlIntegerToUnicodeString(v17, 0xAui64, &String);
if( SilosRootDirectory >= 0 )
{
SilosRootDirectory = ObpGetSilosRootDirectory(&RootHandle);
if( SilosRootDirectory >= 0 )
{
if( (v4 & 1) == 0
|| (ObjectAttributes.RootDirectory = 0i64,
ObjectAttributes.ObjectName = (_UNICODE_STRING *)&ObpRootDirectoryName,
ObjectAttributes.Length = 48,
ObjectAttributes.Attributes = 512,
*(_OWORD *)&ObjectAttributes.SecurityDescriptor = 0i64,
SilosRootDirectory = ZwOpenDirectoryObject(&DirectoryHandle, 3, &ObjectAttributes),
SilosRootDirectory >= 0) )
{
ObjectAttributes.SecurityQualityOfService = 0i64;
LODWORD(Object) = 0;
ObjectAttributes.RootDirectory = RootHandle;
ObjectAttributes.ObjectName = &String;
ObjectAttributes.SecurityDescriptor = (void *)SePublicDefaultUnrestrictedSd;
ObjectAttributes.Length = 48;
ObjectAttributes.Attributes = 592;
SilosRootDirectory = ZwCreateDirectoryObjectEx(
(VOID **)Handle,
0xF000Fui64,
&ObjectAttributes,
DirectoryHandle,
(UINT64)Object);
if( SilosRootDirectory >= 0 )
{
v28 = 0i64;
v19 = ObReferenceObjectByHandle(*(VOID **)Handle, 0xF000Fui64, DmaAdapter, 0, &v28, 0i64);
v2 = (_ADAPTER_OBJECT *)v28;
SilosRootDirectory = v19;
if( v19 >= 0 )
{
SilosRootDirectory = PsCreateSiloContext(
(INT64)Silo,
8ui64,
1i64,
(INT64)ObpDirectoryTeardownCallback,
(INT64 *)&ReturnedSiloContext);
if( SilosRootDirectory < 0 )
{
v3 = (_ADAPTER_OBJECT *)ReturnedSiloContext;
}
else
{
ObfReferenceObjectWithTag(v2, 0x7254624Fui64);
v3 = (_ADAPTER_OBJECT *)ReturnedSiloContext;
v20 = ReturnedSiloContext;
*(_QWORD *)ReturnedSiloContext = v2;
SilosRootDirectory = PsInsertSiloContext(Silo, (unsigned int)PsObjectDirectoryTeardownSlot, v20);
if( SilosRootDirectory >= 0 )
{
SilosRootDirectory = PsInsertPermanentSiloContextEx(
Silo,
(unsigned int)PsObjectDirectorySiloContextSlot,
v2,
1i64);
if( SilosRootDirectory >= 0 && (v4 & 2) != 0 )
{
if( (v4 & 4) == 0
|| (ObjectAttributes.RootDirectory = 0i64,
ObjectAttributes.ObjectName = (_UNICODE_STRING *)&ObpGlobalDosDevicesShortName,
ObjectAttributes.Length = 48,
ObjectAttributes.Attributes = 512,
*(_OWORD *)&ObjectAttributes.SecurityDescriptor = 0i64,
SilosRootDirectory = ZwOpenDirectoryObject(&DosDevicesShadowDirectory, 3, &ObjectAttributes),
SilosRootDirectory >= 0) )
{
SilosRootDirectory = ObpInitializeRootNamespace(Silo, *(VOID **)Handle, DosDevicesShadowDirectory);
}
}
}
}
}
}
}
}
}
if( DosDevicesShadowDirectory )
ZwClose((_HANDLE)DosDevicesShadowDirectory);
if( RootHandle )
ZwClose((_HANDLE)RootHandle);
if( *(_QWORD *)Handle )
ZwClose(Handle[0]);
if( v2 )
HalPutDmaAdapter(v2);
if( DirectoryHandle )
ZwClose((_HANDLE)DirectoryHandle);
if( v3 )
HalPutDmaAdapter(v3);
PsDetachSiloFromCurrentThread(v16);
return SilosRootDirectory;
}Referenced by:
NtSetInformationJobObject