PnprCopyReservedMapping

__int64 PnprCopyReservedMapping(){
  __int64 v0; 
  __int64 v1; 
  __int64 v2; 
  __int64 v3; 
  unsigned int v4; 
  unsigned __int64 v5; 
  unsigned __int64 v6; 
  unsigned __int64 v7; 
  unsigned __int64 v8; 
  __int64 v9; 
  unsigned __int64 v10; 
  __int64 v11; 
  unsigned __int64 v12; 
  _MMPTE *PteBase; 
  __int64 v14; 
  __int64 v15; 
  __int64 v16; 
  unsigned __int64 v17; 
  unsigned __int64 v18; 
  __int64 v19; 
  unsigned __int64 v20; 
  unsigned __int64 v21; 
  unsigned __int64 v22; 
  __int64 v23; 
  unsigned __int64 v24; 
  __int64 v25; 
  unsigned __int64 v26; 
  __int64 v27; 
  __int64 v28; 
  __int64 v29; 
  char *v30; 
  char *v31; 
  __int64 v32; 
  int v33; 
  int v34; 
  __int64 v36[2]; 
  __int64 Src[16]; 
  __int64 v38[16]; 

  v36[0] = 0i64;
  v0 = *(unsigned int *)(PnprContext + 180);
  v1 = *(_QWORD *)(PnprContext + 144);
  v2 = 3 * v0;
  v3 = *(_QWORD *)(v1 + 24 * v0);
  if( (*(_BYTE *)(v3 + 10) & 1) != 0 )
  {
    MmUnmapReservedMapping(*(_QWORD *)(v1 + 24 * v0 + 8), 0x51706E50ui64, *(_QWORD *)(v1 + 24 * v0));
    v3 = *(_QWORD *)(v1 + 8 * v2);
  }
  memset(Src, 0i64, sizeof(Src));
  memset(v38, 0i64, sizeof(v38));
  v4 = 0;
  LODWORD(v5) = MmGetPhysicalAddress(v3 & 0xFFFFFFFFFFFFF000ui64);
  v6 = v5;
  if( (int)PnprGetPageDestination(v5, (__int64)v36) >= 0 && v36[0] != 0x7FFFFFFFFFFFFFFFi64 )
  {
    v4 = 1;
    v38[0] = (unsigned __int64)v36[0] >> 12;
    Src[0] = v6 >> 12;
  }
  v7 = *(_QWORD *)(v1 + 8 * v2 + 8);
  v8 = v7 + 0x10000;
  while( 1 )
  {
    PteBase = MmGetPteBase();
    if( v7 >= v8 )
      break;
    LODWORD(v9) = MiGetContainingPageTable((UINT64)PteBase + ((v7 >> 9) & 0x7FFFFFFFF8i64));
    if( !v4 || v9 != Src[v4 - 1] )
    {
      v10 = v9 << 12;
      if( (int)PnprGetPageDestination(v9 << 12, (__int64)v36) >= 0 && v36[0] != 0x7FFFFFFFFFFFFFFFi64 )
      {
        if( v4 >= 0x10 )
          return 3221225485i64;
        v11 = v4;
        v12 = (unsigned __int64)v36[0] >> 12;
        ++v4;
        Src[v11] = v10 >> 12;
        v38[v11] = v12;
      }
    }
    v7 += 4096i64;
  }
  v14 = *(unsigned int *)(PnprContext + 180);
  v15 = *(_QWORD *)(PnprContext + 136);
  v16 = 3 * v14;
  LODWORD(v17) = MmGetPhysicalAddress(*(_QWORD *)(v15 + 24 * v14) & 0xFFFFFFFFFFFFF000ui64);
  v18 = v17;
  if( (int)PnprGetPageDestination(v17, (__int64)v36) >= 0 && v36[0] != 0x7FFFFFFFFFFFFFFFi64 )
  {
    if( v4 >= 0x10 )
      return 3221225485i64;
    v19 = v4;
    v20 = (unsigned __int64)v36[0] >> 12;
    ++v4;
    Src[v19] = v18 >> 12;
    v38[v19] = v20;
  }
  v21 = *(_QWORD *)(v15 + 8 * v16 + 8);
  v22 = v21 + 0x10000;
  while( v21 < v22 )
  {
    LODWORD(v23) = MiGetContainingPageTable((UINT64)MmGetPteBase() + ((v21 >> 9) & 0x7FFFFFFFF8i64));
    if( v4 > 0x10 )
      return 3221225485i64;
    if( !v4 || v23 != Src[v4 - 1] )
    {
      v24 = v23 << 12;
      if( (int)PnprGetPageDestination(v23 << 12, (__int64)v36) >= 0 && v36[0] != 0x7FFFFFFFFFFFFFFFi64 )
      {
        if( v4 >= 0x10 )
          return 3221225485i64;
        v25 = v4;
        v26 = (unsigned __int64)v36[0] >> 12;
        ++v4;
        Src[v25] = v24 >> 12;
        v38[v25] = v26;
      }
    }
    v21 += 4096i64;
  }
  if( !v4 )
    return 0i64;
  v27 = *(_QWORD *)(v1 + 8 * v2);
  v28 = v4;
  *(_DWORD *)(v27 + 40) = v4 << 13;
  v29 = v4;
  *(_QWORD *)v27 = 0i64;
  *(_WORD *)(v27 + 10) = 0;
  *(_QWORD *)(v27 + 32) = 0i64;
  *(_DWORD *)(v27 + 44) = 0;
  *(_WORD *)(v27 + 8) = 8 * (2 * v4 + 6);
  v30 = (char *)(*(_QWORD *)(v1 + 8 * v2) + 48i64);
  v29 *= 8i64;
  memmove(v30, Src, v29);
  memmove(&v30[v29], v38, v29);
  *(_WORD *)(*(_QWORD *)(v1 + 8 * v2) + 10i64) |= *(_WORD *)(v1 + 8 * v2 + 16);
  v31 = (char *)MmMapLockedPagesWithReservedMapping(
                  *(VOID **)(v1 + 8 * v2 + 8),
                  0x51706E50ui64,
                  *(_MDL **)(v1 + 8 * v2),
                  MmCached);
  if( v31 )
  {
    memmove(&v31[4096 * v28], v31, (_DWORD)v28 << 12);
    return 0i64;
  }
  v32 = PnprContext;
  v33 = *(_DWORD *)(PnprContext + 20984);
  if( !v33 )
    v33 = 5974;
  *(_DWORD *)(PnprContext + 20984) = v33;
  v34 = *(_DWORD *)(v32 + 20988);
  if( !v34 )
    v34 = 10;
  *(_DWORD *)(v32 + 20988) = v34;
  return 3221225626i64;
}

Referenced by:

PnprRecopyMirrorPages