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