ObpMarkDirectoryObjectsTemporary

NTSTATUS __stdcall ObpMarkDirectoryObjectsTemporary(PADAPTER_OBJECT DmaAdapter){
  __int64 v2; 
  PADAPTER_OBJECT v3; 
  PADAPTER_OBJECT v4; 
  _QWORD *v5; 
  _QWORD *p_Version; 
  NTSTATUS result; 
  struct _DMA_ADAPTER *v8; 
  char v9; 
  struct _DMA_ADAPTER *v10; 
  char *v11; 
  _ETHREAD *CurrentThread; 
  _OBJECT_TYPE *v13; 
  _QWORD *v14; 
  _ETHREAD *v15; 
  __int64 v16; 
  ULONG_PTR BugCheckParameter2; 
  _QWORD *v18; 
  _OBP_LOOKUP_CONTEXT v19[2]; 
  struct _DMA_ADAPTER *DmaAdaptera; 
  PADAPTER_OBJECT v21; 
  PADAPTER_OBJECT v22; 
  v19[0].LockStateSignature = -60876;
  *(&v19[0].LockStateSignature + 1) = 0;
  memset(v19, 0, 32);
  ObpLockDirectoryExclusive(v19, (_OBJECT_DIRECTORY *)DmaAdapter);
  v2 = 37i64;
  v22 = DmaAdapter;
  v16 = 37i64;
  v3 = DmaAdapter;
  v4 = DmaAdapter;
  v21 = DmaAdapter;
  do
  {
    v5 = *(_QWORD **)&v3->Version;
    p_Version = &v4->Version;
    if( *(_QWORD *)&v3->Version )
    {
      do
      {
        v8 = (struct _DMA_ADAPTER *)v5[1];
        v9 = 0;
        v18 = p_Version;
        DmaAdaptera = v8;
        v10 = v8 - 3;
        if( (BYTE2(v8[-2].DmaOperations) & 2) != 0 )
          v11 = (char *)v10 - *((unsigned __int8 *)ObpInfoMaskToOffset + (BYTE2(v8[-2].DmaOperations) & 3));
        else
          v11 = 0i64;
        ObfReferenceObject(v8);
        CurrentThread = (_ETHREAD *)KeGetCurrentThread();
        --*((_WORD *)CurrentThread + 242);
        BugCheckParameter2 = (ULONG_PTR)&v10[1];
        ExAcquirePushLockExclusiveEx((UINT64)&v10[1], 0i64);
        BYTE3(v10[1].DmaOperations) &= ~0x10u;
        if( !v10->DmaOperations && !*((_DWORD *)v11 + 6) )
        {
          v13 = (_OBJECT_TYPE *)ObTypeIndexTable[(unsigned __int8)ObHeaderCookie ^ LOBYTE(v10[1].DmaOperations) ^ (unsigned __int64)BYTE1(v10)];
          if( v13 == ObpSymbolicLinkObjectType )
            ObpDeleteSymbolicLinkName((__int64)&v10[3]);
          v14 = v5;
          *p_Version = *v5;
          v5 = (_QWORD *)*v5;
          if( v13 == ObpDirectoryObjectType )
          {
            v15 = (_ETHREAD *)KeGetCurrentThread();
            --*((_WORD *)v15 + 242);
            ExAcquirePushLockExclusiveEx((UINT64)&ObpPendingObjectDirectoryListLock, 0i64);
            *v14 = ObpPendingObjectDirectoryList;
            ObpPendingObjectDirectoryList = v14;
            ExReleasePushLockEx((UINT64)&ObpPendingObjectDirectoryListLock, 0i64);
            KeLeaveCriticalRegion();
          }
          else
          {
            HalPutDmaAdapter(DmaAdaptera);
            ExFreePoolWithTag(v14, 0);
          }
          *(_QWORD *)v11 = 0i64;
          HalPutDmaAdapter(DmaAdapter);
          v9 = 1;
        }
        p_Version = v5;
        ExReleasePushLockEx(BugCheckParameter2, 0i64);
        KeLeaveCriticalRegion();
        HalPutDmaAdapter(DmaAdaptera);
        if( !v9 )
          v5 = (_QWORD *)*v5;
        if( v9 )
          p_Version = v18;
      }
      while( v5 );
      v3 = v22;
      v4 = v21;
      v2 = v16;
    }
    v4 = (PADAPTER_OBJECT)((char *)v4 + 8);
    v3 = (PADAPTER_OBJECT)((char *)v3 + 8);
    --v2;
    v21 = v4;
    v16 = v2;
    v22 = v3;
  }
  while( v2 );
  ObpUnlockDirectory((INT64)DmaAdapter, (INT64)v19);
  return result;
}

Referenced by:

ObpMarkDirectoryTreeTemporary