ObpDeleteNameCheck
VOID __stdcall ObpDeleteNameCheck(_OBJECT_HEADER *ObjectHeader){
unsigned __int8 InfoMask;
_OBJECT_HEADER *v3;
char *v4;
_ETHREAD *CurrentThread;
_OBJECT_DIRECTORY *v6;
char v7;
_ETHREAD *v8;
_OBJECT_DIRECTORY *v9;
CHAR *v11;
_OBJECT_TYPE *v12;
CHAR *v13;
_OBP_LOOKUP_CONTEXT LookupContext;
InfoMask = ObjectHeader->InfoMask;
LookupContext.EntryLink = 0i64;
LookupContext.HashValue = 0;
LookupContext.HashIndex = 0;
*(&LookupContext.LockStateSignature + 1) = 0;
if( (InfoMask & 2) != 0 )
{
v3 = (_OBJECT_HEADER *)*((unsigned __int8 *)&dword_140C25D60 + (InfoMask & 3));
v4 = (char *)((char *)ObjectHeader - (char *)v3);
if( ObjectHeader != v3 )
{
while( 1 )
{
CurrentThread = (_ETHREAD *)KeGetCurrentThread();
--CurrentThread->Tcb.KernelApcDisable;
ExAcquirePushLockExclusiveEx(&ObjectHeader->Lock, 0i64);
v6 = *(_OBJECT_DIRECTORY **)v4;
if( !*(_QWORD *)v4
|| ((ObjectHeader->Flags & 0x10) != 0 || ObjectHeader->HandleCount ? (v7 = 0) : (v7 = 1), !v7) )
{
ExReleasePushLockEx((_DWORD)ObjectHeader + 16, 0);
KeLeaveCriticalRegion();
return;
}
ObfReferenceObject(*(PVOID *)v4);
ExReleasePushLockEx((_DWORD)ObjectHeader + 16, 0);
KeLeaveCriticalRegion();
*(_WORD *)&LookupContext.DirectoryLocked = 0;
LookupContext.LockStateSignature = -60876;
*(_OWORD *)&LookupContext.Directory = 0i64;
ObpLockDirectoryExclusive(&LookupContext, v6);
v8 = (_ETHREAD *)KeGetCurrentThread();
--v8->Tcb.KernelApcDisable;
ExAcquirePushLockExclusiveEx(&ObjectHeader->Lock, 0i64);
v9 = *(_OBJECT_DIRECTORY **)v4;
if( *(_OBJECT_DIRECTORY **)v4 == v6 && (ObjectHeader->Flags & 0x10) == 0 && !ObjectHeader->HandleCount )
break;
ObpReleaseLookupContext(&LookupContext);
ExReleasePushLockEx((_DWORD)ObjectHeader + 16, 0);
KeLeaveCriticalRegion();
HalPutDmaAdapter((PADAPTER_OBJECT)v6);
}
v11 = 0i64;
if( !*((_DWORD *)v4 + 6) )
{
v12 = (_OBJECT_TYPE *)ObTypeIndexTable[(unsigned __int8)ObHeaderCookie ^ ObjectHeader->TypeIndex ^ (unsigned __int64)BYTE1(ObjectHeader)];
if( v12 == ObjectType )
{
ObpDeleteSymbolicLinkName((_OBJECT_SYMBOLIC_LINK *)&ObjectHeader->Body);
v9 = *(_OBJECT_DIRECTORY **)v4;
}
v13 = (CHAR *)ObpLookupDirectoryEntryEx(v9, (_UNICODE_STRING *)(v4 + 8), 0i64, 0, 0, &LookupContext);
v11 = v13;
if( v12 == DmaAdapter )
ObfReferenceObject(v13);
else
v11 = 0i64;
ObpDeleteDirectoryEntry(&LookupContext);
}
ObpReleaseLookupContext(&LookupContext);
ExReleasePushLockEx((_DWORD)ObjectHeader + 16, 0);
KeLeaveCriticalRegion();
HalPutDmaAdapter((PADAPTER_OBJECT)v6);
if( v11 )
{
ObpMarkDirectoryTreeTemporary(v11);
HalPutDmaAdapter((PADAPTER_OBJECT)v11);
}
}
}
}Referenced by:
ObMakeTemporaryObject
ObOpenObjectByNameEx
ObpDecrementHandleCount
ObpDereferenceNamedObject
ObpIncrementHandleCountEx