ObpDeleteNameCheck
VOID __fastcall ObpDeleteNameCheck(INT64 a1){
char v1;
__int64 v3;
INT64 v4;
_ETHREAD *CurrentThread;
_OBJECT_DIRECTORY *v6;
char v7;
_ETHREAD *v8;
CHAR *v9;
CHAR *v11;
_OBJECT_TYPE *v12;
CHAR *v13;
_OBP_LOOKUP_CONTEXT v14;
v1 = *(_BYTE *)(a1 + 26);
v14.EntryLink = 0i64;
v14.HashValue = 0;
v14.HashIndex = 0;
*(&v14.LockStateSignature + 1) = 0;
if( (v1 & 2) != 0 )
{
v3 = *((unsigned __int8 *)ObpInfoMaskToOffset + (v1 & 3));
v4 = a1 - v3;
if( a1 != v3 )
{
while( 1 )
{
CurrentThread = (_ETHREAD *)KeGetCurrentThread();
--*((_WORD *)CurrentThread + 242);
ExAcquirePushLockExclusiveEx(a1 + 16, 0i64);
v6 = *(_OBJECT_DIRECTORY **)v4;
if( !*(_QWORD *)v4 || ((*(_BYTE *)(a1 + 27) & 0x10) != 0 || *(_QWORD *)(a1 + 8) ? (v7 = 0) : (v7 = 1), !v7) )
{
ExReleasePushLockEx(a1 + 16, 0i64);
KeLeaveCriticalRegion();
return;
}
ObfReferenceObject(*(PVOID *)v4);
ExReleasePushLockEx(a1 + 16, 0i64);
KeLeaveCriticalRegion();
*(_WORD *)&v14.DirectoryLocked = 0;
v14.LockStateSignature = -60876;
*(_OWORD *)&v14.Directory = 0i64;
ObpLockDirectoryExclusive(&v14, v6);
v8 = (_ETHREAD *)KeGetCurrentThread();
--*((_WORD *)v8 + 242);
ExAcquirePushLockExclusiveEx(a1 + 16, 0i64);
v9 = *(CHAR **)v4;
if( *(_OBJECT_DIRECTORY **)v4 == v6 && (*(_BYTE *)(a1 + 27) & 0x10) == 0 && !*(_QWORD *)(a1 + 8) )
break;
ObpReleaseLookupContext((INT64)&v14);
ExReleasePushLockEx(a1 + 16, 0i64);
KeLeaveCriticalRegion();
HalPutDmaAdapter((PADAPTER_OBJECT)v6);
}
v11 = 0i64;
if( !*(_DWORD *)(v4 + 24) )
{
v12 = (_OBJECT_TYPE *)ObTypeIndexTable[(unsigned __int8)ObHeaderCookie ^ *(unsigned __int8 *)(a1 + 24) ^ (unsigned __int64)BYTE1(a1)];
if( v12 == ObpSymbolicLinkObjectType )
{
ObpDeleteSymbolicLinkName(a1 + 48);
v9 = *(CHAR **)v4;
}
v13 = (CHAR *)ObpLookupDirectoryEntryEx(v9, (const UNICODE_STRING *)(v4 + 8), 0, 0, 0, (INT64)&v14);
v11 = v13;
if( v12 == ObpDirectoryObjectType )
ObfReferenceObject(v13);
else
v11 = 0i64;
ObpDeleteDirectoryEntry((INT64)&v14);
}
ObpReleaseLookupContext((INT64)&v14);
ExReleasePushLockEx(a1 + 16, 0i64);
KeLeaveCriticalRegion();
HalPutDmaAdapter((PADAPTER_OBJECT)v6);
if( v11 )
{
ObpMarkDirectoryTreeTemporary(v11);
HalPutDmaAdapter((PADAPTER_OBJECT)v11);
}
}
}
}Referenced by:
ObMakeTemporaryObject
ObOpenObjectByNameEx
ObpDecrementHandleCount
ObpDereferenceNamedObject
ObpIncrementHandleCountEx