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