PnprMapPhysicalPages
__int64 __fastcall PnprMapPhysicalPages(__int64 a1, unsigned __int64 a2, unsigned __int64 *a3, _QWORD *a4){
__int64 v6;
int v9;
int v10;
__int64 result;
unsigned __int64 v12;
_MDL *v13;
_MDL *v14;
unsigned __int64 v15;
unsigned __int64 v16;
_QWORD *v17;
VOID *v18;
__int64 v19;
int v20;
int v21;
int v22;
int v23;
v6 = PnprContext;
if( (*(_DWORD *)(PnprContext + 64) & 4) != 0 )
{
if( (a2 & 0xFFF) != 0 || (v12 = *a3) == 0 || (v12 & 0xFFF) != 0 )
{
v22 = *(_DWORD *)(PnprContext + 20984);
if( !v22 )
v22 = 4079;
*(_DWORD *)(PnprContext + 20984) = v22;
v23 = *(_DWORD *)(v6 + 20988);
if( !v23 )
v23 = 8;
*(_DWORD *)(v6 + 20988) = v23;
return 3221225485i64;
}
else
{
v13 = *(_MDL **)a1;
if( v12 > 0x10000 )
v12 = 0x10000i64;
if( (v13->MdlFlags & 1) != 0 )
{
MmUnmapReservedMapping(*(_QWORD *)(a1 + 8), 0x51706E50ui64, (INT64)v13);
v13 = *(_MDL **)a1;
}
v13->Next = 0i64;
v13->MdlFlags = 0;
v13->Size = 8 * (((v12 + 4095) >> 12) + 6);
v13->StartVa = 0i64;
v13->ByteOffset = 0;
v13->ByteCount = v12;
v14 = *(_MDL **)a1;
v15 = a2 >> 12;
v16 = v12 >> 12;
v17 = (_QWORD *)(*(_QWORD *)a1 + 48i64);
if( v12 >> 12 )
{
do
{
*v17++ = v15++;
--v16;
}
while( v16 );
v14 = *(_MDL **)a1;
}
v14->MdlFlags |= *(_WORD *)(a1 + 16);
v18 = MmMapLockedPagesWithReservedMapping(*(VOID **)(a1 + 8), 0x51706E50ui64, *(_MDL **)a1, MmCached);
if( v18 )
{
*a4 = v18;
result = 0i64;
*a3 = v12;
}
else
{
v19 = PnprContext;
v20 = *(_DWORD *)(PnprContext + 20984);
if( !v20 )
v20 = 4134;
*(_DWORD *)(PnprContext + 20984) = v20;
v21 = *(_DWORD *)(v19 + 20988);
if( !v21 )
v21 = 10;
*(_DWORD *)(v19 + 20988) = v21;
return 3221225626i64;
}
}
}
else
{
v9 = *(_DWORD *)(PnprContext + 20984);
if( !v9 )
v9 = 4071;
*(_DWORD *)(PnprContext + 20984) = v9;
v10 = *(_DWORD *)(v6 + 20988);
if( !v10 )
v10 = 8;
*(_DWORD *)(v6 + 20988) = v10;
return 3221225498i64;
}
return result;
}Referenced by:
PnprMapTargetSparePhysicalPages