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