CmpSelectLeaf
__int64 __fastcall CmpSelectLeaf(
__int64 Hive,
unsigned int *a2,
const _UNICODE_STRING *a3,
_HSTORAGE_TYPE a4,
__int64 a5){
void *v7;
_CM_KEY_INDEX *v9;
signed int i;
__int64 v11;
unsigned int v13;
int v14[2];
int v15[4];
v15[0] = -1;
v14[0] = -1;
v7 = (void *)*a2;
v15[1] = 0;
v14[1] = 0;
if( HvMarkCellDirty((PVOID)Hive, v7, 0) )
{
v9 = (_CM_KEY_INDEX *)(*(__int64(__fastcall **)(__int64, _QWORD, int *))(Hive + 8))(Hive, *a2, v15);
if( v9 )
{
for( i = CmpFindSubKeyInRoot((_HHIVE *)Hive, v9, a3, 0i64);
i >= 0;
i = CmpFindSubKeyInRoot((_HHIVE *)Hive, v9, a3, 0i64) )
{
v11 = (*(__int64(__fastcall **)(__int64, _QWORD, int *))(Hive + 8))(Hive, 0i64, v14);
if( !v11 )
break;
if( *(_WORD *)(v11 + 2) < 0x3F5u )
{
*(_QWORD *)a5 = &v9->List[i];
(*(void(__fastcall **)(__int64, int *))(Hive + 16))(Hive, v14);
(*(void(__fastcall **)(__int64, int *))(Hive + 16))(Hive, v15);
return 0i64;
}
v13 = CmpSplitLeaf(Hive, *a2, i, a4);
if( v13 == -1
|| ((*(void(__fastcall **)(__int64, int *))(Hive + 16))(Hive, v15),
*a2 = v13,
(v9 = (_CM_KEY_INDEX *)(*(__int64(__fastcall **)(__int64, _QWORD, int *))(Hive + 8))(Hive, v13, v15)) == 0i64) )
{
(*(void(__fastcall **)(__int64, int *))(Hive + 16))(Hive, v14);
break;
}
(*(void(__fastcall **)(__int64, int *))(Hive + 16))(Hive, v14);
}
if( v9 )
(*(void(__fastcall **)(__int64, int *))(Hive + 16))(Hive, v15);
}
}
return 0xFFFFFFFFi64;
}Referenced by:
CmpAddSubKeyToList