CmpQueryKeyDataFromKeyNodeStack
__int64 __fastcall CmpQueryKeyDataFromKeyNodeStack(__int16 *a1, int a2, __int64 a3, unsigned int a4, unsigned int *a5){
__int64 v5;
__int16 *v6;
size_t 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;
char v31;
unsigned int v32;
unsigned int v33;
const VOID *v34;
unsigned int v35;
unsigned int v36;
INT64 v37;
_HV_GET_CELL_CONTEXT v38;
__int128 v39;
__int128 v40;
__int128 v41;
__int64 v42;
v38 = 0i64;
v37 = 0i64;
v39 = 0i64;
v40 = 0i64;
v41 = 0i64;
v31 = 0;
v5 = 0i64;
v33 = -1;
HvpGetCellContextInitialize(&v38);
v7 = 0;
v8 = 0i64;
v9 = 0i64;
v42 = 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];
v42 = v9;
}
LABEL_6:
v12 = *(_QWORD *)(v9 + 4);
v13 = (unsigned __int16)*(_DWORD *)(v9 + 52);
v32 = *(_DWORD *)(v9 + 56);
v35 = *(_DWORD *)(v9 + 60);
v36 = *(_DWORD *)(v9 + 64);
if( *(char *)(v9 + 13) >= 0 )
{
v31 = 1;
v5 = v8;
v33 = *(_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( !v31 && *(char *)(v21 + 13) >= 0 )
{
v31 = 1;
v5 = v22;
v33 = *(_DWORD *)(v21 + 48);
v7 = *(unsigned __int16 *)(v21 + 74);
}
if( (unsigned int)CmpGetEffectiveKeyNodeSemantics(v22, v21) )
break;
}
v14 = v17 - 1;
}
while( v14 >= 0 );
v32 = v15;
v36 = v19;
v35 = v18;
v9 = v42;
}
if( v31 && v7 )
{
v34 = (const VOID *)(*(__int64(__fastcall **)(__int64, _QWORD, _HV_GET_CELL_CONTEXT *))(v5 + 8))(v5, v33, &v38);
v6 = a1;
}
else
{
v34 = 0i64;
v7 = 0;
}
if( a2 )
{
if( a2 == 1 )
{
*(_QWORD *)&v39 = v12;
SubKeyCountForKeyNodeStack = CmpPopulateKeyNodeInformation((__int64)&v39, v9, v34, v7, a3, a4, a5);
}
else
{
SubKeyCountForKeyNodeStack = CmpGetSubKeyCountForKeyNodeStack((INT64)v6, &v37);
if( SubKeyCountForKeyNodeStack >= 0 )
{
SubKeyCountForKeyNodeStack = CmpGetValueCountForKeyNodeStack(a1, (_DWORD *)&v37 + 1);
if( SubKeyCountForKeyNodeStack >= 0 )
{
if( (_DWORD)v37 )
{
v26 = v32;
}
else
{
v13 = 0;
v26 = 0;
}
if( HIDWORD(v37) )
{
v27 = v35;
v28 = v36;
}
else
{
v27 = 0;
v28 = 0;
}
if( a2 == 4 )
{
*(_QWORD *)&v39 = v12;
HIDWORD(v39) = v37;
*(_QWORD *)&v40 = __PAIR64__(HIDWORD(v37), v13);
*((_QWORD *)&v40 + 1) = __PAIR64__(v28, v27);
v29 = 2 * *(_WORD *)(v9 + 72);
if( (*(_BYTE *)(v9 + 2) & 0x20) == 0 )
v29 = *(_WORD *)(v9 + 72);
LODWORD(v41) = v29;
SubKeyCountForKeyNodeStack = CmpPopulateKeyCachedInformation((__int64)&v39, a3, a4, a5);
}
else if( a2 == 2 )
{
*(_QWORD *)&v39 = v12;
*(_QWORD *)((char *)&v40 + 4) = __PAIR64__(v13, v37);
HIDWORD(v40) = v26;
*(_QWORD *)&v41 = __PAIR64__(v27, HIDWORD(v37));
DWORD2(v41) = v28;
SubKeyCountForKeyNodeStack = CmpPopulateKeyFullInformation((__int64)&v39, v34, v7, a3, a4, a5);
}
else
{
SubKeyCountForKeyNodeStack = -1073741811;
}
}
}
}
}
else
{
*(_QWORD *)&v39 = v12;
SubKeyCountForKeyNodeStack = CmpPopulateKeyBasicInformation((__int64)&v39, v9, a3, a4, a5);
}
if( v34 )
(*(void(__fastcall **)(__int64, _HV_GET_CELL_CONTEXT *))(v5 + 16))(v5, &v38);
return(unsigned int)SubKeyCountForKeyNodeStack;
}Referenced by:
CmQueryLayeredKey
CmpEnumerateLayeredKey