CmpFindSubkeyInHashByChildCell

__int64 __fastcall CmpFindSubkeyInHashByChildCell(
        unsigned __int64 a1,
        unsigned __int64 a2,
        __int64 a3,
        unsigned int a4,
        unsigned __int64 *a5){
  int v5; 
  unsigned __int64 *v7; 
  unsigned __int64 v9; 
  __int64 v10; 
  __int64 v12; 
  INT64 v13; 
  int v14; 
  int v15; 
  unsigned int v16; 
  __int64 v17; 
  _CM_KEY_CONTROL_BLOCK *v18; 
  _CM_KEY_CONTROL_BLOCK *v19; 
  _CM_KEY_CONTROL_BLOCK *v21; 
  INT64 *v22; 
  _UNICODE_STRING Component; 
  int v24; 
  int v25; 
  __int64 v26; 

  v5 = *(_DWORD *)(a1 + 16);
  *(_DWORD *)(&Component.MaximumLength + 1) = 0;
  v7 = a5;
  v24 = -1;
  v9 = a1;
  v25 = 0;
  v10 = *(_QWORD *)(a3 + 1640);
  *a5 = 0i64;
  v26 = v10;
  v12 = (*(__int64(__fastcall **)(__int64, _QWORD, int *))(a3 + 8))(a3, a4, &v24);
  if( !v12 )
    return 3221225626i64;
  v13 = *(unsigned __int16 *)(v12 + 72);
  v14 = 37 * v5;
  if( (*(_BYTE *)(v12 + 2) & 0x20) != 0 )
  {
    v15 = CmpHashCompressedComponent((UINT8 *)(v12 + 76), v13);
  }
  else
  {
    Component.Buffer = (wchar_t *)(v12 + 76);
    Component.Length = v13;
    Component.MaximumLength = v13;
    v15 = CmpHashUnicodeComponent(&Component);
  }
  v16 = v14 + v15;
  (*(void(__fastcall **)(__int64, int *))(a3 + 16))(a3, &v24);
  CmpUnlockTwoKcbs((_CM_KEY_CONTROL_BLOCK *)v9, (_CM_KEY_CONTROL_BLOCK *)a2);
  v22 = (INT64 *)(v9 + 32);
  CmpLockHashEntryShared(*(_QWORD *)(v9 + 32), v16);
  CmpLockTwoKcbsShared((_CM_KEY_CONTROL_BLOCK *)v9, (_CM_KEY_CONTROL_BLOCK *)a2);
  v17 = *(_QWORD *)(v26
                  + 24
                  * ((unsigned int)(*(_DWORD *)(a3 + 1648) - 1) & ((101027 * (v16 ^ (v16 >> 9))) ^ ((unsigned __int64)(101027 * (v16 ^ (v16 >> 9))) >> 9)))
                  + 16);
  if( v17 )
  {
    LOBYTE(a5) = 0;
    while( v16 != *(_DWORD *)v17 || a4 != *(_DWORD *)(v17 + 24) || a3 != *(_QWORD *)(v17 + 16) )
    {
      v17 = *(_QWORD *)(v17 + 8);
      if( !v17 )
        goto LABEL_13;
    }
    v18 = (_CM_KEY_CONTROL_BLOCK *)(v17 - 16);
    if( CmpIsKcbLockAllowed(v9, (UINT64)v18, &a5) )
    {
      if( !a2 || CmpIsKcbLockAllowed(a2, (UINT64)v18, &a5) )
      {
        v9 = (unsigned __int64)v18;
      }
      else
      {
        CmpUnlockKcb(v21);
        ExAcquirePushLockSharedEx(&v18->KcbPushlock, 0i64);
        _InterlockedIncrement((volatile signed __int32 *)&v18->56);
        v9 = a2;
      }
    }
    else
    {
      CmpUnlockKcb(v19);
      ExAcquirePushLockSharedEx(&v18->KcbPushlock, 0i64);
      _InterlockedIncrement((volatile signed __int32 *)&v18->56);
    }
    ExAcquirePushLockSharedEx((_EX_PUSH_LOCK *)(v9 + 48), 0i64);
    _InterlockedIncrement((volatile signed __int32 *)(v9 + 56));
    CmpReferenceKeyControlBlock(v18);
    *v7 = (unsigned __int64)v18;
    CmpUnlockKcb(v18);
  }
LABEL_13:
  CmpUnlockHashEntry(*v22, v16);
  return 0i64;
}

Referenced by:

CmpFindSubKeyByNumberEx