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