ObpInitializeRootNamespace

NTSTATUS __stdcall ObpInitializeRootNamespace(_EJOB *Silo, PVOID RootDirectory, PVOID DosDevicesShadowDirectory){
  UINT8 IsHostSilo; 
  NTSTATUS KernelObjectsSD; 
  bool v7; 
  PVOID *Object; 
  HANDLE Handle; 
  HANDLE DirectoryHandle; 
  struct _OBJECT_ATTRIBUTES ObjectAttributes; 
  PVOID v13; 
  __int128 SecurityDescriptor[2]; 
  __int64 v15; 
  Handle = 0i64;
  DirectoryHandle = 0i64;
  memset(&ObjectAttributes, 0, sizeof(ObjectAttributes));
  IsHostSilo = PsIsHostSilo(Silo);
  v15 = 0i64;
  memset(SecurityDescriptor, 0, sizeof(SecurityDescriptor));
  KernelObjectsSD = ObCreateKernelObjectsSD(SecurityDescriptor);
  if( KernelObjectsSD >= 0 )
  {
    if( IsHostSilo
      || (ObjectAttributes.RootDirectory = 0i64,
          ObjectAttributes.ObjectName = (_UNICODE_STRING *)&ObpKernelObjectsPathString,
          ObjectAttributes.Length = 48,
          ObjectAttributes.Attributes = 592,
          *(_OWORD *)&ObjectAttributes.SecurityDescriptor = 0i64,
          KernelObjectsSD = ZwOpenDirectoryObject(&DirectoryHandle, 0xF000Fui64, &ObjectAttributes),
          KernelObjectsSD >= 0) )
    {
      ObjectAttributes.SecurityQualityOfService = 0i64;
      LODWORD(Object) = 0;
      ObjectAttributes.ObjectName = (_UNICODE_STRING *)&ObpKernelObjectsNameString;
      ObjectAttributes.Length = 48;
      ObjectAttributes.SecurityDescriptor = SecurityDescriptor;
      ObjectAttributes.RootDirectory = RootDirectory;
      ObjectAttributes.Attributes = 592;
      KernelObjectsSD = ZwCreateDirectoryObjectEx(
                          &Handle,
                          0xF000Fui64,
                          &ObjectAttributes,
                          DirectoryHandle,
                          (UINT64)Object);
      if( KernelObjectsSD >= 0 )
      {
        ZwClose(Handle);
        Handle = 0i64;
        ObjectAttributes.ObjectName = (_UNICODE_STRING *)ObpObjectTypesNameString;
        ObjectAttributes.Length = 48;
        ObjectAttributes.RootDirectory = RootDirectory;
        ObjectAttributes.Attributes = 592;
        *(_OWORD *)&ObjectAttributes.SecurityDescriptor = 0i64;
        if( IsHostSilo )
        {
          KernelObjectsSD = ZwCreateDirectoryObject(&Handle, 0xF000Fui64, &ObjectAttributes);
          if( KernelObjectsSD < 0 )
            goto LABEL_9;
          v13 = 0i64;
          KernelObjectsSD = ObReferenceObjectByHandle(Handle, 0, ObpDirectoryObjectType, 0, &v13, 0i64);
          ObpTypeDirectoryObject = (PADAPTER_OBJECT)v13;
          v7 = KernelObjectsSD < 0;
        }
        else
        {
          KernelObjectsSD = ZwCreateSymbolicLinkObject(
                              &Handle,
                              0xF0001ui64,
                              &ObjectAttributes,
                              (UNICODE_STRING *)&ObpObjectTypesPathString);
          if( KernelObjectsSD < 0 )
            goto LABEL_9;
          KernelObjectsSD = ZwSetInformationSymbolicLink((INT64)Handle);
          v7 = KernelObjectsSD < 0;
        }
        if( !v7 )
          KernelObjectsSD = ObpCreateDosDevicesDirectory(Silo, RootDirectory);
      }
    }
  }
LABEL_9:
  if( Handle )
    ZwClose(Handle);
  if( DirectoryHandle )
    ZwClose(DirectoryHandle);
  ObCleanupSecurityDescriptor(SecurityDescriptor);
  return KernelObjectsSD;
}

Referenced by:

ObCreateSiloRootDirectory
ObInitSystem