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