NtOpenPrivateNamespace

NTSTATUS __stdcall NtOpenPrivateNamespace(
        VOID **NamespaceHandle,
        _ACCESS_MASK DesiredAccess,
        _OBJECT_ATTRIBUTES *ObjectAttributes,
        VOID *BoundaryDescriptor,
        INT64 a5,
        INT64 a6,
        INT64 a7,
        INT64 a8){
  char PreviousMode; 
  __int64 v11; 
  NTSTATUS result; 
  _KSPIN_LOCK *v13; 
  _ESERVERSILO_GLOBALS *CurrentServerSiloGlobals; 
  _ETHREAD *CurrentThread; 
  ULONG_PTR v16; 
  __int64 *v17; 
  _ADAPTER_OBJECT *v18; 
  NTSTATUS v19; 
  _KPROCESSOR_MODE AccessMode; 
  unsigned int Attributes; 
  PVOID P; 
  VOID *Handle; 

  P = 0i64;
  Handle = 0i64;
  PreviousMode = KeGetCurrentThread()->PreviousMode;
  Attributes = 0;
  if( PreviousMode )
  {
    v11 = 0x7FFFFFFF0000i64;
    if( (unsigned __int64)NamespaceHandle < 0x7FFFFFFF0000i64 )
      v11 = (__int64)NamespaceHandle;
    *(_QWORD *)v11 = *(_QWORD *)v11;
    if( ObjectAttributes )
    {
      if( ((unsigned __int8)ObjectAttributes & 7) != 0 )
        ExRaiseDatatypeMisalignment();
      Attributes = ObjectAttributes->Attributes;
    }
  }
  else if( ObjectAttributes )
  {
    Attributes = ObjectAttributes->Attributes;
  }
  result = (unsigned int)ObpCaptureBoundaryDescriptor(
                           (_KNOWN_CONTROLLER_TYPE)BoundaryDescriptor,
                           (_KNOWN_CONTROLLER_TYPE **)&P);
  if( result >= 0 )
  {
    CurrentServerSiloGlobals = PsGetCurrentServerSiloGlobals(v13);
    CurrentThread = (_ETHREAD *)KeGetCurrentThread();
    --CurrentThread->Tcb.KernelApcDisable;
    v16 = (_DWORD)CurrentServerSiloGlobals + 720;
    ExAcquirePushLockExclusiveEx(&CurrentServerSiloGlobals->ObSiloState.PrivateNamespaceLookupTable.Lock, 0i64);
    v17 = ObpLookupNamespaceEntry(
            (__int64)&CurrentServerSiloGlobals->ObSiloState.PrivateNamespaceLookupTable,
            (__int64)P);
    ExFreePoolWithTag(P, 0x534E624Fu);
    if( v17 && (v18 = (_ADAPTER_OBJECT *)v17[2]) != 0i64 )
    {
      ObfReferenceObject(v18);
      ExReleasePushLockEx(v16, 0);
      KeLeaveCriticalRegionThread(KeGetCurrentThread());
      LOBYTE(AccessMode) = PreviousMode;
      v19 = ObOpenObjectByPointer(
              v18,
              Attributes & (PreviousMode != 0 ? 7666 : 73714),
              0i64,
              DesiredAccess,
              DmaAdapter,
              AccessMode,
              &Handle);
      LODWORD(P) = v19;
      HalPutDmaAdapter(v18);
      *NamespaceHandle = Handle;
      return v19;
    }
    else
    {
      ExReleasePushLockEx(v16, 0);
      KeLeaveCriticalRegionThread(KeGetCurrentThread());
      return -1073741766;
    }
  }
  return result;
}

Referenced by:

No references.