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