CmpPerformSingleKcbCacheLookup

INT64 __fastcall CmpPerformSingleKcbCacheLookup(
        volatile INT64 *BugCheckParameter2,
        PVOID P,
        UINT64 a3,
        UINT64 a4,
        INT64 a5,
        INT64 a6,
        INT64 a7,
        INT64 a8){
  unsigned int v8; 
  volatile INT64 *v10; 
  __int16 v11; 
  char v12; 
  signed __int64 v13; 
  unsigned int v14; 
  _UNICODE_STRING *v15; 
  int v16; 
  __int64 v17; 
  unsigned int v18; 
  signed __int32 v19; 
  signed __int32 v20; 
  __int64 v21; 
  __int64 v22; 
  __int64 v23; 
  UINT64 v24; 
  INT64 result; 
  __int64 v26; 
  __int64 v27; 
  unsigned __int8 *v28; 
  unsigned __int16 v29; 
  UINT16 *Buffer; 
  unsigned __int16 v31; 
  UINT16 v32; 
  int v33; 
  int v34; 
  signed __int64 v35; 
  signed __int64 v36; 
  unsigned int v37; 
  UINT64 v38; 
  _BYTE *v39; 
  _BYTE *v40; 
  unsigned __int8 CurrentIrql; 
  char v42; 
  __int64 v43; 
  _BYTE *v44; 
  _QWORD *v45; 
  unsigned __int64 OldIrql_low; 
  unsigned __int32 v47; 
  bool v48; 
  int v49[8]; 
  char v50; 
  __int16 v51; 
  unsigned int v52; 
  unsigned int v53; 
  _UNICODE_STRING DestName; 
  volatile signed __int64 *v55; 
  unsigned int v56; 
  v56 = a4;
  v55 = BugCheckParameter2;
  v8 = a3;
  v10 = BugCheckParameter2;
  v11 = 0;
  v12 = 0;
  v51 = 0;
  v50 = 0;
  v13 = _InterlockedIncrement64(v10);
  if( !v13 )
    KeBugCheckEx(0x51u, 0x24ui64, (ULONG_PTR)v10, 0i64, 0i64);
  if( v13 == 1 )
    KeBugCheckEx(0x51u, 0x15ui64, 0i64, 0i64, 0i64);
  v14 = *((_DWORD *)v10 + 4);
  if( (unsigned int)a3 < (unsigned int)a4 )
  {
LABEL_4:
    if( v8 >= 8 )
      v15 = (_UNICODE_STRING *)(*(_QWORD *)(a5 + 160) + 16 * (v8 - 8 + 6i64));
    else
      v15 = (_UNICODE_STRING *)(a5 + 16 * (v8 + 2i64));
    if( v8 >= 8 )
      v16 = *(_DWORD *)(*(_QWORD *)(a5 + 160) + 4i64 * (v8 - 8));
    else
      v16 = *(_DWORD *)(a5 + 4i64 * v8);
    v14 = v16 + 37 * v14;
    v53 = v14 ^ (v14 >> 9);
    v17 = *((_QWORD *)P + 205);
    v52 = 101027 * v53;
    v18 = v52 ^ (v52 >> 9);
    ExAcquirePushLockSharedEx(v17 + 24i64 * (v18 & (*((_DWORD *)P + 412) - 1)), 0i64);
    _m_prefetchw((char *)P + 4272);
    v19 = *((_DWORD *)P + 1068);
    if( !v19 )
LABEL_83:
      KeBugCheckEx(0x51u, 0x17ui64, (ULONG_PTR)P, 9ui64, v14);
    while( 1 )
    {
      v20 = v19;
      v19 = _InterlockedCompareExchange((volatile signed __int32 *)P + 1068, v19 + 1, v19);
      if( v20 == v19 )
        break;
      if( !v19 )
        goto LABEL_83;
    }
    v21 = *((_QWORD *)P + 205);
    v22 = v18 & (*((_DWORD *)P + 412) - 1);
    DestName = 0i64;
    v23 = *(_QWORD *)(v21 + 24 * v22 + 16);
    if( !v23 )
    {
LABEL_13:
      v24 = *((_QWORD *)P + 205)
          + 24 * ((unsigned int)(*((_DWORD *)P + 412) - 1) & ((101027 * v53) ^ ((unsigned __int64)(101027 * v53) >> 9)));
      *(_QWORD *)(v24 + 8) = 0i64;
      ExReleasePushLockEx(v24, 0i64);
      if( _InterlockedExchangeAdd((volatile signed __int32 *)P + 1068, 0xFFFFFFFF) == 1 )
        CmpDeleteHive(P);
      v10 = v55;
      goto LABEL_16;
    }
    while( 1 )
    {
      if( *(_DWORD *)v23 == v14 )
      {
        v26 = v23 - 16;
        if( *(volatile INT64 **)(v23 + 56) == v10 )
        {
          v27 = *(_QWORD *)(v26 + 80);
          v28 = (unsigned __int8 *)(v27 + 26);
          if( (*(_DWORD *)v27 & 1) != 0 )
          {
            v29 = v15->Length >> 1;
            Buffer = v15->Buffer;
            v31 = *(_WORD *)(v27 + 24);
            if( v29 )
            {
              while( v31 )
              {
                v32 = *Buffer++;
                v33 = *v28++;
                if( v32 != (_WORD)v33 )
                {
                  if( v32 >= 0x61u )
                  {
                    if( v32 > 0x7Au )
                      v32 = NLS_UPCASE(v32);
                    else
                      v32 -= 32;
                  }
                  v34 = v32 - v33;
                  if( v32 != v33 )
                    goto LABEL_29;
                }
                --v31;
                if( !--v29 )
                  break;
              }
            }
            v34 = v29 - v31;
LABEL_29:
            if( !v34 )
            {
LABEL_30:
              if( v23 == 16 )
                goto LABEL_13;
              v35 = *(_QWORD *)v26;
              if( *(_QWORD *)v26 )
              {
                while( v35 != -1 )
                {
                  v36 = v35;
                  v35 = _InterlockedCompareExchange64((volatile signed __int64 *)v26, v35 + 1, v35);
                  if( v36 == v35 )
                    goto LABEL_34;
                  if( !v35 )
                    goto LABEL_43;
                }
LABEL_81:
                KeBugCheckEx(0x51u, 0x24ui64, v23 - 16, 0i64, 0i64);
              }
LABEL_43:
              ExAcquirePushLockSharedEx(v26 + 48, 0i64);
              _InterlockedIncrement((volatile signed __int32 *)(v26 + 56));
              if( (*(_DWORD *)(v26 + 8) & 0x80000) != 0 )
                KeBugCheckEx(0x51u, 0x20ui64, v23 - 16, 0i64, 0i64);
              if( !_InterlockedIncrement64((volatile signed __int64 *)v26) )
                goto LABEL_81;
              if( (*(_BYTE *)(v26 + 64) & 2) != 0 )
              {
                LODWORD(v39) = KeAbPreAcquire(&CmpDelayedCloseTableLock, 0i64, 0i64);
                v40 = v39;
                CurrentIrql = KeGetCurrentIrql();
                __writecr8(1ui64);
                if( !_interlockedbittestandreset((volatile signed __int32 *)&CmpDelayedCloseTableLock, 0) )
                  ExpAcquireFastMutexContended(&CmpDelayedCloseTableLock, v39);
                if( v40 )
                  v40[26] |= 1u;
                CmpDelayedCloseTableLock.Owner = KeGetCurrentThread();
                CmpDelayedCloseTableLock.OldIrql = CurrentIrql;
                v42 = *(_BYTE *)(v26 + 64);
                if( (v42 & 2) != 0 )
                {
                  v43 = v26 + 224;
                  if( (v42 & 4) != 0 )
                  {
                    **(_BYTE **)v43 = 1;
                    *(_BYTE *)(v26 + 64) &= ~4u;
                  }
                  else
                  {
                    v44 = *(_BYTE **)v43;
                    v45 = *(_QWORD **)(v26 + 232);
                    if( *(_QWORD *)(*(_QWORD *)v43 + 8i64) != v43 || *v45 != v43 )
                      __fastfail(3u);
                    --CmpDelayedCloseElements;
                    *v45 = v44;
                    *((_QWORD *)v44 + 1) = v45;
                    --qword_140D2DF88;
                  }
                  *(_QWORD *)(v26 + 232) = v26 + 224;
                  *(_QWORD *)v43 = v43;
                  _InterlockedOr(v49, 0);
                  *(_BYTE *)(v26 + 64) &= ~2u;
                }
                OldIrql_low = LOBYTE(CmpDelayedCloseTableLock.OldIrql);
                CmpDelayedCloseTableLock.Owner = 0i64;
                v47 = _InterlockedCompareExchange((volatile signed __int32 *)&CmpDelayedCloseTableLock, 1, 0);
                if( v47 )
                  ExpReleaseFastMutexContended(&CmpDelayedCloseTableLock, v47);
                __writecr8(OldIrql_low);
                KeAbPostRelease(&CmpDelayedCloseTableLock);
              }
              v48 = (*(_DWORD *)(v26 + 8) & 0x80000) != 0;
              if( *(struct _KTHREAD **)(v26 + 56) == KeGetCurrentThread() )
                *(_QWORD *)(v26 + 56) = 0i64;
              else
                _InterlockedDecrement((volatile signed __int32 *)(v26 + 56));
              ExReleasePushLockEx(v26 + 48, 0i64);
              if( v48 && (*(_DWORD *)(v26 + 8) & 0x80000) != 0 )
                CmpFreeKeyControlBlock((_CM_KEY_CONTROL_BLOCK *)(v23 - 16));
LABEL_34:
              v37 = v56;
              if( v8 == v56 - 1 )
              {
                v50 = 1;
              }
              else
              {
                v38 = *((_QWORD *)P + 205)
                    + 24 * ((unsigned int)(*((_DWORD *)P + 412) - 1) & (v52 ^ ((unsigned __int64)v52 >> 9)));
                *(_QWORD *)(v38 + 8) = 0i64;
                ExReleasePushLockEx(v38, 0i64);
                if( _InterlockedExchangeAdd((volatile signed __int32 *)P + 1068, 0xFFFFFFFF) == 1 )
                  CmpDeleteHive(P);
                v37 = v56;
              }
              if( _InterlockedExchangeAdd64(v55, 0xFFFFFFFFFFFFFFFFui64) == 1 )
                KeBugCheckEx(0x51u, 0x1Fui64, 0i64, 0i64, 0i64);
              ++v51;
              v10 = (volatile INT64 *)(v23 - 16);
              v55 = (volatile signed __int64 *)(v23 - 16);
              if( (*(_DWORD *)(v26 + 184) & 0x100000) != 0 || (++v8, v8 >= v37) )
              {
LABEL_16:
                v12 = v50;
                v11 = v51;
                break;
              }
              goto LABEL_4;
            }
          }
          else
          {
            DestName.Length = *(_WORD *)(v27 + 24);
            DestName.MaximumLength = DestName.Length;
            DestName.Buffer = (wchar_t *)(v27 + 26);
            if( !CmpCompareUnicodeString(v15, &DestName, 2ui64) )
              goto LABEL_30;
          }
          v10 = v55;
        }
      }
      v23 = *(_QWORD *)(v23 + 8);
      if( !v23 )
        goto LABEL_13;
    }
  }
  *(_QWORD *)a6 = v10;
  *(_BYTE *)a7 = v12;
  result = a8;
  *(_WORD *)a8 = v11;
  return result;
}

Referenced by:

CmpPerformCompleteKcbCacheLookup