NtCreatePrivateNamespace

NTSTATUS __fastcall NtCreatePrivateNamespace(
        VOID **NamespaceHandle,
        UINT64 DesiredAccess,
        _OBJECT_ATTRIBUTES *ObjectAttributes,
        VOID *BoundaryDescriptor,
        INT64 a5,
        INT64 a6,
        INT64 a7,
        INT64 a8){
  unsigned int v9; 
  char PreviousMode; 
  __int64 v12; 
  NTSTATUS result; 
  _DWORD *v14; 
  NTSTATUS v15; 
  UINT64 v16; 
  unsigned __int64 v17; 
  PVOID *p_Object; 
  NTSTATUS v19; 
  _QWORD *v20; 
  unsigned __int64 v21; 
  __int64 v22; 
  __int64 v23; 
  int inserted; 
  _KSPIN_LOCK *v25; 
  _ESERVERSILO_GLOBALS *CurrentServerSiloGlobals; 
  _ETHREAD *CurrentThread; 
  _QWORD *v28; 
  __int64 v29; 
  _QWORD *v30; 
  __int64 v31; 
  _QWORD *v32; 
  VOID *Flags; 
  UINT64 Flagsa; 
  UINT64 ObjectBodySize; 
  UINT64 PagedPoolCharge; 
  UINT64 NonPagedPoolCharge; 
  PVOID Object; 
  PVOID P; 
  PVOID Handle; 

  v9 = DesiredAccess;
  Object = 0i64;
  Handle = 0i64;
  P = 0i64;
  PreviousMode = KeGetCurrentThread()->PreviousMode;
  if( PreviousMode )
  {
    v12 = 0x7FFFFFFF0000i64;
    if( (unsigned __int64)NamespaceHandle < 0x7FFFFFFF0000i64 )
      v12 = (__int64)NamespaceHandle;
    *(_QWORD *)v12 = *(_QWORD *)v12;
  }
  result = (unsigned int)ObpCaptureBoundaryDescriptor(
                           (_KNOWN_CONTROLLER_TYPE)BoundaryDescriptor,
                           (_KNOWN_CONTROLLER_TYPE **)&P);
  if( result >= 0 )
  {
    v14 = P;
    v15 = ObpVerifyCreatorAccessCheck((_DWORD *)P + 12);
    if( v15 >= 0 )
    {
      v17 = (unsigned int)(v14[6] + 392);
      if( v17 < *((_QWORD *)v14 + 3) )
      {
        v15 = -1073741811;
      }
      else
      {
        p_Object = &Object;
        LODWORD(NonPagedPoolCharge) = 0;
        LODWORD(PagedPoolCharge) = 0;
        LODWORD(ObjectBodySize) = v14[6] + 392;
        LOBYTE(v16) = PreviousMode;
        LOBYTE(p_Object) = PreviousMode;
        v19 = ObCreateObjectEx(
                (UINT64)p_Object,
                DmaAdapter,
                ObjectAttributes,
                v16,
                Flags,
                ObjectBodySize,
                PagedPoolCharge,
                NonPagedPoolCharge,
                &Object,
                0i64);
        if( v19 >= 0 )
        {
          v20 = Object;
          memset(Object, 0i64, v17);
          v21 = ((unsigned __int64)v20 + 351) & 0xFFFFFFFFFFFFFFF8ui64;
          *(_QWORD *)(v21 + 8) = v21;
          *(_QWORD *)v21 = v21;
          v22 = *((_QWORD *)v14 + 3);
          *(_QWORD *)(v21 + 24) = v22;
          *(_QWORD *)(v21 + 16) = 0i64;
          *(_BYTE *)(v21 + 40) = *((_BYTE *)v14 + 40);
          memmove((VOID *)(v21 + 48), v14 + 12, v22);
          ExFreePoolWithTag(v14, 0x534E624Fu);
          v20[37] = 0i64;
          *((_DWORD *)v20 + 85) = -1;
          *((_DWORD *)v20 + 84) = 1;
          if( (*((_BYTE *)v20 - 22) & 2) != 0 )
            v23 = (__int64)v20 - *((unsigned __int8 *)&dword_140C25D60 + (*((_BYTE *)v20 - 22) & 3)) - 48;
          else
            v23 = 0i64;
          if( v23 )
          {
            inserted = -1073741773;
          }
          else
          {
            inserted = ObpRegisterPrivateNamespace(((unsigned __int64)v20 + 351) & 0xFFFFFFFFFFFFFFF8ui64);
            if( inserted >= 0 )
            {
              ObfReferenceObject(v20);
              LODWORD(Flagsa) = 0;
              inserted = ObInsertObjectEx(v20, 0i64, v9, 0i64, Flagsa, 0i64, &Handle);
              CurrentServerSiloGlobals = PsGetCurrentServerSiloGlobals(v25);
              CurrentThread = (_ETHREAD *)KeGetCurrentThread();
              --CurrentThread->Tcb.KernelApcDisable;
              ExAcquirePushLockExclusiveEx(
                &CurrentServerSiloGlobals->ObSiloState.PrivateNamespaceLookupTable.Lock,
                0i64);
              if( inserted < 0 )
              {
                v29 = *(_QWORD *)v21;
                v30 = *(_QWORD **)(v21 + 8);
                if( *(_QWORD *)(*(_QWORD *)v21 + 8i64) == v21 && *v30 == v21 )
                {
                  *v30 = v29;
                  *(_QWORD *)(v29 + 8) = v30;
LABEL_32:
                  --CurrentServerSiloGlobals->ObSiloState.PrivateNamespaceLookupTable.NumberOfPrivateSpaces;
                  HalPutDmaAdapter((PADAPTER_OBJECT)Object);
LABEL_16:
                  ExReleasePushLockEx((_DWORD)CurrentServerSiloGlobals + 720, 0);
                  KeLeaveCriticalRegionThread(KeGetCurrentThread());
                  if( inserted >= 0 )
                    *NamespaceHandle = Handle;
                  return inserted;
                }
              }
              else
              {
                if( (v20[42] & 2) == 0 )
                {
                  v28 = Object;
                  *(_QWORD *)(v21 + 16) = Object;
                  v28[40] = v21;
                  goto LABEL_16;
                }
                v31 = *(_QWORD *)v21;
                v32 = *(_QWORD **)(v21 + 8);
                if( *(_QWORD *)(*(_QWORD *)v21 + 8i64) == v21 && *v32 == v21 )
                {
                  *v32 = v31;
                  *(_QWORD *)(v31 + 8) = v32;
                  goto LABEL_32;
                }
              }
              __fastfail(3u);
            }
          }
          HalPutDmaAdapter((PADAPTER_OBJECT)v20);
          return inserted;
        }
        v15 = v19;
      }
    }
    ExFreePoolWithTag(v14, 0x534E624Fu);
    return v15;
  }
  return result;
}

Referenced by:

No references.