CmpLockIXLockIntent

_BOOL __fastcall CmpLockIXLockIntent(UINT64 *a1, INT64 a2){
  int v2; 
  UINT64 v6; 
  VOID **v7; 
  __int64 v8; 
  VOID **PoolWithTag; 
  UINT64 v10; 
  __int64 v11; 

  v2 = *(_DWORD *)a1;
  if( !*(_DWORD *)a1 )
  {
    *(_DWORD *)a1 = 1;
    a1[1] = a2;
LABEL_9:
    *(_QWORD *)(a2 + 16) = a1;
    return 1;
  }
  if( v2 < 0 )
    return CmEqualTrans(*(_QWORD *)(a1[1] + 56), *(_QWORD *)(a2 + 56)) != 0;
  if( v2 != 1 )
  {
    v8 = 0i64;
    if( v2 )
    {
      while( !CmEqualTrans(*(_QWORD *)(*(_QWORD *)(a1[1] + 8 * v8) + 56i64), *(_QWORD *)(a2 + 56)) )
      {
        v2 = *(_DWORD *)a1;
        v8 = (unsigned int)(v8 + 1);
        if( (unsigned int)v8 >= *(_DWORD *)a1 )
          goto LABEL_16;
      }
      return 1;
    }
LABEL_16:
    PoolWithTag = ExAllocatePoolWithTag(1ui64, 8i64 * (unsigned int)(v2 + 1), 2018069827i64);
    v10 = (UINT64)PoolWithTag;
    if( !PoolWithTag )
      return 0;
    memmove(PoolWithTag, (const VOID *)a1[1], 8 * *(_DWORD *)a1);
    ExFreePoolWithTag((PVOID)a1[1], 0x78494D43u);
    v11 = *(unsigned int *)a1;
    a1[1] = v10;
    *(_QWORD *)(v10 + 8 * v11) = a2;
    goto LABEL_18;
  }
  v6 = a1[1];
  if( CmEqualTrans(*(_QWORD *)(v6 + 56), *(_QWORD *)(a2 + 56)) )
    return 1;
  v7 = ExAllocatePoolWithTag(1ui64, 0x10ui64, 2018069827i64);
  if( v7 )
  {
    a1[1] = (UINT64)v7;
    *v7 = (VOID *)v6;
    *(_QWORD *)(a1[1] + 8) = a2;
LABEL_18:
    ++*(_DWORD *)a1;
    goto LABEL_9;
  }
  return 0;
}

Referenced by:

CmDeleteValueKey
CmSetKeyFlags
CmSetLastWriteTimeKey
CmSetValueKey
CmpCreateChild
CmpUndoDeleteKeyForTrans