MiMapViewOfPhysicalSection
VOID __fastcall MiMapViewOfPhysicalSection(INT64 a1, INT64 a2, INT64 a3){
unsigned int v3;
unsigned int v4;
ULONG_PTR v7;
unsigned int v8;
_ETHREAD *CurrentThread;
__int64 v10;
__int64 v11;
unsigned int v12;
unsigned __int64 v13;
__int64 v14;
UINT64 v15;
unsigned __int64 v16;
unsigned __int64 v17;
unsigned __int64 v18;
unsigned int v19;
UINT64 v20;
INT64 v21;
UINT64 v22;
int IsPfn;
INT64 v24;
INT64 v25;
unsigned __int64 v26;
int v27;
__int64 v28;
__int64 v29;
int v30;
__int64 v31;
UINT64 *HINTHonored;
PVOID *v33;
INT64 a2a;
__int64 v35;
UINT64 v36;
UINT64 v37;
unsigned __int64 v38;
int v39;
UINT8 *v42;
v4 = v3;
if( (*(_DWORD *)(a1 + 60) & 2) != 0 )
return;
if( *(_QWORD *)(a1 + 80) )
return;
v7 = *(_QWORD *)(a1 + 88);
v8 = v3 >> 3;
if( v3 >> 3 == 2 )
return;
if( (v3 & 5) == 5 )
return;
if( v3 == 24 )
return;
CurrentThread = (_ETHREAD *)KeGetCurrentThread();
v35 = (__int64)CurrentThread;
LODWORD(v10) = MiAllocatePool((struct _SLIST_ENTRY *)0x40);
v11 = v10;
if( !v10 )
return;
*(_QWORD *)(v10 + 16) = -2i64;
v12 = *(_DWORD *)(v10 + 48) & 0xFFFFF01F;
*(_QWORD *)(v11 + 40) = 0i64;
*(_DWORD *)(v11 + 48) = v12 | ((v4 & 0x1F) << 7) | 0x100010;
v38 = -1i64;
v13 = MiSanitizePage(*(_QWORD *)a3 >> 12);
LOCK_ADDRESS_SPACE((__int64)CurrentThread, v7);
if( (*(_DWORD *)(v7 + 1124) & 0x20) == 0 )
{
v14 = (unsigned __int16)*(_DWORD *)a3;
if( (*(_DWORD *)(a1 + 72) & 1) != 0 )
{
v16 = v14 + *(_QWORD *)a2;
MiIsVaRangeAvailable((_EPROCESS *)v7, (VOID *)v16, *(_QWORD *)(a1 + 24), *(VOID **)a1);
if( v27 )
{
LABEL_11:
v18 = v17 >> 12;
v19 = 1;
v20 = v15 >> 12;
*(_BYTE *)(v11 + 33) = BYTE4(v20);
*(_BYTE *)(v11 + 32) = BYTE4(v18);
*(_DWORD *)(v11 + 24) = v18;
*(_DWORD *)(v11 + 28) = v20;
v37 = v13
+ ((unsigned int)v20 | ((unsigned __int64)BYTE4(v20) << 32))
- ((unsigned int)v18 | ((unsigned __int64)BYTE4(v18) << 32));
v39 = 1;
if( v8 == 3 )
{
if( (v4 & 7) == 0 )
{
LABEL_15:
a2a = -1i64;
v21 = 0i64;
v22 = v13;
if( v13 <= v13
+ ((unsigned int)v20 | ((unsigned __int64)BYTE4(v20) << 32))
- ((unsigned int)v18 | ((unsigned __int64)BYTE4(v18) << 32)) )
{
do
{
IsPfn = MiIsPfn(v22);
if( IsPfn )
{
v25 = a2a;
}
else
{
v24 = v22;
if( v21 )
v24 = a2a;
++v21;
v25 = v24;
a2a = v24;
}
if( (v22 == v37 || IsPfn == 1) && v21 )
{
if( (int)MiReferenceIoPages(1ui64, v25, v21, v19, 0i64, 0i64) < 0 )
goto LABEL_38;
v26 = v21 + a2a - 1;
v21 = 0i64;
a2a = -1i64;
v38 = v26;
}
v19 = v39;
++v22;
}
while( v22 <= v37 );
}
if( (int)MiInsertVadCharges(v11, v7) >= 0 )
{
MiInsertViewOfPhysicalSection((_EPROCESS *)v7, (_MMVAD *)v11);
if( (v4 & 2) != 0 && MiIsProcessCfgEnabled() )
{
MiLockVad(v35, v11);
UNLOCK_ADDRESS_SPACE_UNORDERED(v35, v7);
if( (int)MiCommitVadCfgBits(v11, 0i64, v42) < 0 )
{
MiReferenceVad(v11);
MiDeleteVad((_MMVAD *)v11, 0i64);
return;
}
MiUnlockVad(v35, v11);
}
else
{
UNLOCK_ADDRESS_SPACE(v35, v7);
}
*(_QWORD *)a2 = v16;
return;
}
goto LABEL_38;
}
v19 = 2;
}
else if( v8 == 1 )
{
v19 = 0;
}
v39 = v19;
goto LABEL_15;
}
}
else
{
LODWORD(v33) = 0;
LODWORD(HINTHonored) = v4;
v36 = *(_QWORD *)(a1 + 24) + v14;
if( MiSelectUserAddress(
*(unsigned int *)(a1 + 40),
*(_QWORD *)a1,
*(_QWORD *)(a1 + 8),
v36,
*(_QWORD *)(a1 + 16),
0i64,
HINTHonored,
v33) >= 0 )
{
v15 = v36 - 1;
v16 = (unsigned __int16)*(_DWORD *)a3;
v17 = v16;
goto LABEL_11;
}
}
}
LABEL_38:
UNLOCK_ADDRESS_SPACE(v35, v7);
if( v38 != -1i64 )
{
v28 = -1i64;
v29 = 0i64;
while( v13 <= v38 )
{
v30 = MiIsPfn(v13);
if( !v30 )
{
v31 = v13;
if( v29 )
v31 = v28;
++v29;
v28 = v31;
}
if( v30 == 1 || v13 == v38 )
{
if( v29 )
{
MiDereferenceIoPages(1i64, v28, v29);
v28 = -1i64;
v29 = 0i64;
}
}
++v13;
}
}
ExFreePoolWithTag((PVOID)v11, 0);
}Referenced by:
MiMapViewOfSection