MiPreserveBootDecisions
INT64 __fastcall MiPreserveBootDecisions(INT64 a1, UINT16 a2){
__int64 v2;
INT64 result;
INT64 v5;
__int64 v6;
_OWORD *v7;
_OWORD *v8;
__int128 v9;
UINT64 v10;
INT64 v11;
UINT8 *v12;
UINT64 v13;
INT64 v14;
v2 = a2;
LODWORD(result) = MiAllocatePool((struct _SLIST_ENTRY *)0x40);
v5 = result;
if( result )
{
v6 = 2i64;
v7 = (_OWORD *)result;
v8 = (_OWORD *)v2;
do
{
*v7 = *v8;
v7[1] = v8[1];
v7[2] = v8[2];
v7[3] = v8[3];
v7[4] = v8[4];
v7[5] = v8[5];
v7[6] = v8[6];
v7 += 8;
v9 = v8[7];
v8 += 8;
*(v7 - 1) = v9;
--v6;
}
while( v6 );
*v7 = *v8;
v7[1] = v8[1];
v7[2] = v8[2];
*((_QWORD *)v7 + 6) = *((_QWORD *)v8 + 6);
v10 = 40i64 * *(unsigned int *)(v2 + 156);
LODWORD(result) = MiAllocatePool((struct _SLIST_ENTRY *)0x40);
v11 = result;
if( result )
memmove((UINT8 *)result, *(UINT8 **)(v2 + 144), v10);
*(_QWORD *)(v5 + 144) = v11;
v12 = *(UINT8 **)(v2 + 304);
if( v12 )
{
v13 = 16i64 * *(unsigned int *)v12;
LODWORD(result) = MiAllocatePool((struct _SLIST_ENTRY *)0x40);
v14 = result;
if( result )
memmove((UINT8 *)result, v12, v13);
}
else
{
v14 = 0i64;
}
*(_QWORD *)(v5 + 304) = v14;
*(_QWORD *)(a1 + 4392) = v5;
}
return result;
}Referenced by:
MiZeroNodePages