CmpGetCorrectKcbLockOrder

UINT64 __fastcall CmpGetCorrectKcbLockOrder(UINT64 a1, UINT64 a2, UINT64 *a3, UINT64 *a4){
  unsigned int v5; 
  unsigned int v6; 
  UINT64 result; 
  __int16 v8; 
  __int16 v9; 
  v5 = (*(_DWORD *)(a1 + 8) >> 21) & 0x3FF;
  v6 = (*(_DWORD *)(a2 + 8) >> 21) & 0x3FF;
  if( v5 <= v6
    && (v5 < v6
     || ((v8 = *(_WORD *)(a1 + 186), (v8 & 4) == 0) || (*(_DWORD *)(a2 + 184) & 0x20000) == 0)
     && ((v8 & 2) != 0 && (*(_DWORD *)(a2 + 184) & 0x40000) != 0
      || (v9 = *(_WORD *)(a1 + 66), v9 <= *(__int16 *)(a2 + 66)) && (v9 < *(__int16 *)(a2 + 66) || a1 <= a2))) )
  {
    result = a2;
    a2 = a1;
  }
  else
  {
    result = a1;
  }
  *a3 = a2;
  *a4 = result;
  return result;
}

Referenced by:

CmpIsKcbLockAllowed
CmpLockTwoKcbsShared
CmpUnlockTwoKcbs