ObpRemoveNamespaceFromTable

NTSTATUS __stdcall ObpRemoveNamespaceFromTable(_OBJECT_DIRECTORY *Directory){
  NTSTATUS v2; 
  __int64 *CurrentServerSiloGlobals; 
  _ETHREAD *CurrentThread; 
  _QWORD *NamespaceEntry; 
  __int64 v6; 
  _QWORD *v7; 
  v2 = -1072103391;
  CurrentServerSiloGlobals = PsGetCurrentServerSiloGlobals();
  CurrentThread = (_ETHREAD *)KeGetCurrentThread();
  --*((_WORD *)CurrentThread + 242);
  ExAcquirePushLockExclusiveEx((UINT64)(CurrentServerSiloGlobals + 90), 0i64);
  _InterlockedOr((volatile signed __int32 *)&Directory->Flags, 2u);
  NamespaceEntry = Directory->NamespaceEntry;
  if( NamespaceEntry )
  {
    Directory->NamespaceEntry = 0i64;
    NamespaceEntry[2] = 0i64;
    v6 = *NamespaceEntry;
    if( *(_QWORD **)(*NamespaceEntry + 8i64) != NamespaceEntry
      || (v7 = (_QWORD *)NamespaceEntry[1], (_QWORD *)*v7 != NamespaceEntry) )
    {
      __fastfail(3u);
    }
    *v7 = v6;
    *(_QWORD *)(v6 + 8) = v7;
    --*((_DWORD *)CurrentServerSiloGlobals + 182);
    HalPutDmaAdapter((PADAPTER_OBJECT)Directory);
    v2 = 0;
  }
  ExReleasePushLockEx((UINT64)(CurrentServerSiloGlobals + 90), 0i64);
  KeLeaveCriticalRegionThread((__int64)KeGetCurrentThread());
  return v2;
}

Referenced by:

NtDeletePrivateNamespace
ObpCloseDirectoryObject