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