CmpKeyEnumStackCreateResumeContext
INT64 __fastcall CmpKeyEnumStackCreateResumeContext(INT64 a1, INT64 a2, INT64 a3, CHAR a4, INT64 a5){
int v5;
unsigned int v7;
int v9;
UINT64 v10;
INT64 v11;
INT64 v12;
INT16 v13;
INT64 v14;
_QWORD *v15;
INT64 EntryAtLayerHeight;
INT16 v17;
INT64 KcbAtLayerHeight;
_DWORD *v19;
__int64 v20;
INT64 v21;
v5 = *(__int16 *)(a1 + 2);
v7 = 0;
v9 = a3;
v10 = 24i64 * (v5 + 1) + 8;
if( a4 )
CmpAllocateTransientPoolWithTag((_HHIVE *)1, v10, 0x36374D43ui64, (_CHILD_LIST *)a4);
else
CmpAllocateTransientPoolWithTag((_HHIVE *)1, v10, 0x37374D43ui64, (_CHILD_LIST *)a4);
v12 = v11;
if( v11 )
{
memset(v11, 0i64);
*(_BYTE *)(v12 + 2) = a4;
v13 = 0;
*(_DWORD *)(v12 + 4) = v9;
*(_WORD *)v12 = v5;
if( (v5 & 0x8000u) == 0 )
{
v14 = a2;
v15 = (_QWORD *)(v12 + 8);
do
{
EntryAtLayerHeight = CmpKeyEnumStackGetEntryAtLayerHeight(v14, v13);
KcbAtLayerHeight = CmpGetKcbAtLayerHeight(a1, v17);
CmpReferenceKeyControlBlockUnsafe((volatile INT64 *)KcbAtLayerHeight);
v19 = v15 + 2;
v20 = 2i64;
v15[1] = KcbAtLayerHeight;
v21 = EntryAtLayerHeight - (_QWORD)v15;
*v15 = *(_QWORD *)(KcbAtLayerHeight + 304);
do
{
*v19 = *(_DWORD *)((char *)v19 + v21 + 8);
++v19;
--v20;
}
while( v20 );
++v13;
v15 += 3;
v14 = a2;
}
while( v13 <= (__int16)v5 );
v7 = 0;
}
*(_QWORD *)a5 = v12;
}
else
{
return(unsigned int)-1073741670;
}
return v7;
}Referenced by:
CmpEnumerateLayeredKey