MiValidateImagePfn
INT64 __fastcall MiValidateImagePfn(
ULONG_PTR a1,
__int64 a2,
__int64 a3,
unsigned int a4,
char a5,
int a6,
__int64 a7,
int a8){
_QWORD *v11;
_MMPFN *v12;
VOID *v13;
INT64 v14;
int ProtectionPfnCompatible;
UINT64 v16;
void *v17;
int v18;
int v19;
UINT64 v20;
VOID *v21;
void *v22;
int v23;
CHAR v24;
INT64 result;
UINT64 ValidateFlags;
char v29;
__int64 MappingVa;
v11 = *(_QWORD **)(a1 + 96);
v12 = (_MMPFN *)((char *)MmGetPfnDb() + 48 * a7);
v13 = (VOID *)(v11[5] & 0xFFFFFFFFFFFFFFF8ui64);
if( (*(_DWORD *)(a1 + 92) & 0xC0000) != 0 && !v11[7] )
{
result = MiGetSectionStrongImageReference(*(_QWORD *)(a1 + 96));
if( (int)result < 0 )
return result;
}
v14 = MiReservePtes((INT64)&qword_140C4EC80, 1ui64);
if( v14 )
{
v29 = 0;
}
else
{
if( ((MiFlags & 0x4000) == 0 || (*(_DWORD *)(a1 + 92) & 0xC0000) == 0) && a4 != -1 )
return 3221225626i64;
v14 = MiReserveFaultPte();
if( !v14 )
return 3221225626i64;
v29 = 1;
}
MappingVa = ((v14 << 25) - ((_QWORD)MmGetPteBase() << 25)) >> 16;
ProtectionPfnCompatible = MiMakeProtectionPfnCompatible(1ui64, v12);
*(_QWORD *)v14 = MiMakeValidPte(v14, a7, ProtectionPfnCompatible | 0x20000000u);
v17 = 0i64;
v18 = a8 | 2;
if( (a6 & 2) == 0 )
v18 = a8;
if( (MiFlags & 0x4000) != 0 && (*(_DWORD *)(a1 + 92) & 0xC0000) != 0 )
{
v19 = v18;
if( a4 != -1 )
{
v21 = (VOID *)MappingVa;
if( v11[4] )
v19 = v18 | 1;
goto LABEL_11;
}
goto LABEL_22;
}
v19 = v18;
if( a4 == -1 )
{
LABEL_22:
v21 = (VOID *)MappingVa;
LABEL_11:
LODWORD(ValidateFlags) = v19;
v23 = SeValidateImageData(v13, v21, 0x1000ui64, a2, ValidateFlags, (_EPROCESS *)a3);
if( v23 < 0 )
{
_InterlockedIncrement(&dword_140C4C9DC);
}
else
{
v24 = 0;
if( (MiFlags & 0x40000) != 0 && (*(_DWORD *)(a1 + 92) & 0xC0000) == 0 && ((*((_BYTE *)v12 + 16) >> 5) & 2) != 0 )
v24 = 3;
if( (*((_DWORD *)v12 + 4) & 0x400i64) != 0 )
MiMarkPfnVerified((UINT64)v12, v24);
}
goto LABEL_15;
}
v20 = a4;
v21 = (VOID *)MappingVa;
LODWORD(v22) = MiRevertRelocatedImagePfn((PVOID)MappingVa, (_CONTROL_AREA *)a1, v20, v16);
v17 = v22;
if( v22 == (void *)-1i64 )
{
v17 = 0i64;
LABEL_10:
v19 = v18;
goto LABEL_11;
}
if( v22 )
{
v21 = v22;
goto LABEL_10;
}
v23 = -1073741670;
LABEL_15:
if( v29 )
MiReleaseFaultPte(v14);
else
MiReleasePtes((INT64)&qword_140C4EC80, v14, 1ui64);
if( v17 )
ExFreePoolWithTag(v17, 0);
return(unsigned int)v23;
}Referenced by:
MiValidateInPage
MiWalkEntireImage