CmpQueryKeyDataFromKeyNodeStack
__int64 __fastcall CmpQueryKeyDataFromKeyNodeStack(__int16 *a1, int a2, __int64 a3, unsigned int a4, unsigned int *a5){
INT64 v5;
__int16 *v6;
unsigned int v7;
INT64 v8;
INT64 v9;
INT16 v10;
INT64 *EntryAtLayerHeight;
__int64 v12;
unsigned int v13;
INT16 v14;
unsigned int v15;
INT64 *v16;
__int16 v17;
unsigned int v18;
unsigned int v19;
INT64 v20;
INT64 v21;
INT64 v22;
unsigned int v23;
unsigned int v24;
int SubKeyCountForKeyNodeStack;
unsigned int v26;
unsigned int v27;
unsigned int v28;
unsigned __int16 v29;
INT64 v31;
UINT64 v32;
char v33;
unsigned int v34;
unsigned int v35;
UINT8 *v36;
unsigned int v37;
unsigned int v38;
INT64 v39;
__int64 v40;
__int128 a1a;
__int128 v42;
__int128 v43;
INT64 v44;
v40 = 0i64;
v39 = 0i64;
a1a = 0i64;
v42 = 0i64;
v43 = 0i64;
v33 = 0;
v5 = 0i64;
v35 = -1;
HvpGetCellContextInitialize(&v40);
v7 = 0;
v8 = 0i64;
v9 = 0i64;
v44 = 0i64;
v10 = *v6;
if( *v6 >= 0 )
{
while( 1 )
{
EntryAtLayerHeight = (INT64 *)CmpKeyNodeStackGetEntryAtLayerHeight((INT64)v6, v10);
if( EntryAtLayerHeight[2] )
break;
if( --v10 < 0 )
{
v8 = 0i64;
goto LABEL_6;
}
}
v8 = *EntryAtLayerHeight;
v9 = EntryAtLayerHeight[2];
v44 = v9;
}
LABEL_6:
v12 = *(_QWORD *)(v9 + 4);
v13 = (unsigned __int16)*(_DWORD *)(v9 + 52);
v34 = *(_DWORD *)(v9 + 56);
v37 = *(_DWORD *)(v9 + 60);
v38 = *(_DWORD *)(v9 + 64);
if( *(char *)(v9 + 13) >= 0 )
{
v33 = 1;
v5 = v8;
v35 = *(_DWORD *)(v9 + 48);
v7 = *(unsigned __int16 *)(v9 + 74);
}
v14 = v10 - 1;
if( v14 >= 0 )
{
v15 = *(_DWORD *)(v9 + 56);
do
{
v16 = (INT64 *)CmpKeyNodeStackGetEntryAtLayerHeight((INT64)v6, v14);
v20 = v16[2];
if( v20 )
{
if( (unsigned int)CmpGetEffectiveKeyNodeSemantics(*v16, v20) == 1 )
break;
if( v12 < *(_QWORD *)(v21 + 4) )
v12 = *(_QWORD *)(v21 + 4);
v23 = (unsigned __int16)*(_DWORD *)(v21 + 52);
if( v13 >= v23 )
v23 = v13;
v13 = v23;
v24 = *(_DWORD *)(v21 + 56);
if( v15 >= v24 )
v24 = v15;
v15 = v24;
if( !v33 && *(char *)(v21 + 13) >= 0 )
{
v33 = 1;
v5 = v22;
v35 = *(_DWORD *)(v21 + 48);
v7 = *(unsigned __int16 *)(v21 + 74);
}
if( (unsigned int)CmpGetEffectiveKeyNodeSemantics(v22, v21) )
break;
}
v14 = v17 - 1;
}
while( v14 >= 0 );
v34 = v15;
v38 = v19;
v37 = v18;
v9 = v44;
}
if( v33 && v7 )
{
v36 = (UINT8 *)(*(__int64(__fastcall **)(INT64, _QWORD, __int64 *))(v5 + 8))(v5, v35, &v40);
v6 = a1;
}
else
{
v36 = 0i64;
v7 = 0;
}
if( a2 )
{
if( a2 == 1 )
{
*(_QWORD *)&a1a = v12;
LODWORD(v32) = a4;
SubKeyCountForKeyNodeStack = CmpPopulateKeyNodeInformation((INT64)&a1a, v9, v36, v7, a3, v32, (UINT64 *)a5);
}
else
{
SubKeyCountForKeyNodeStack = CmpGetSubKeyCountForKeyNodeStack((INT64)v6, &v39);
if( SubKeyCountForKeyNodeStack >= 0 )
{
SubKeyCountForKeyNodeStack = CmpGetValueCountForKeyNodeStack(a1, (_DWORD *)&v39 + 1);
if( SubKeyCountForKeyNodeStack >= 0 )
{
if( (_DWORD)v39 )
{
v26 = v34;
}
else
{
v13 = 0;
v26 = 0;
}
if( HIDWORD(v39) )
{
v27 = v37;
v28 = v38;
}
else
{
v27 = 0;
v28 = 0;
}
if( a2 == 4 )
{
*(_QWORD *)&a1a = v12;
HIDWORD(a1a) = v39;
*(_QWORD *)&v42 = __PAIR64__(HIDWORD(v39), v13);
*((_QWORD *)&v42 + 1) = __PAIR64__(v28, v27);
v29 = 2 * *(_WORD *)(v9 + 72);
if( (*(_BYTE *)(v9 + 2) & 0x20) == 0 )
v29 = *(_WORD *)(v9 + 72);
LODWORD(v43) = v29;
SubKeyCountForKeyNodeStack = CmpPopulateKeyCachedInformation((INT64)&a1a, a3, a4, a5);
}
else if( a2 == 2 )
{
*(_QWORD *)&a1a = v12;
*(_QWORD *)((char *)&v42 + 4) = __PAIR64__(v13, v39);
HIDWORD(v42) = v26;
*(_QWORD *)&v43 = __PAIR64__(v27, HIDWORD(v39));
DWORD2(v43) = v28;
LODWORD(v31) = a4;
SubKeyCountForKeyNodeStack = CmpPopulateKeyFullInformation((INT64)&a1a, v36, v7, a3, v31, a5);
}
else
{
SubKeyCountForKeyNodeStack = -1073741811;
}
}
}
}
}
else
{
*(_QWORD *)&a1a = v12;
SubKeyCountForKeyNodeStack = CmpPopulateKeyBasicInformation((INT64)&a1a, v9, a3, a4, (UINT64 *)a5);
}
if( v36 )
(*(void(__fastcall **)(INT64, __int64 *))(v5 + 16))(v5, &v40);
return(unsigned int)SubKeyCountForKeyNodeStack;
}Referenced by:
CmQueryLayeredKey
CmpEnumerateLayeredKey