MiMapViewOfPhysicalSection
NTSTATUS __stdcall MiMapViewOfPhysicalSection(
_EPROCESS *Process,
VOID **CapturedBase,
_LARGE_INTEGER *SectionOffset,
UINT64 *CapturedViewSize,
UINT8 *ProtectionMask,
UINT64 AllocationType,
UINT8 *CfgTargetsValid,
UINT8 *a8){
int v8;
_EPROCESS *v11;
unsigned int v12;
_ETHREAD *CurrentThread;
_MMVAD *Pool;
_MMVAD *v15;
unsigned int v16;
UINT64 v17;
UINT64 v18;
__int64 LowPart;
NTSTATUS inserted;
char *v21;
unsigned __int64 v22;
unsigned __int64 v23;
unsigned __int64 v24;
int v25;
unsigned __int64 v26;
INT64 v27;
UINT64 v28;
int v29;
int v30;
__int64 v31;
__int64 v32;
unsigned __int64 v34;
int v35;
__int64 v36;
__int64 v37;
int v38;
__int64 v39;
int v40;
UINT64 *HINTHonored;
PVOID *v42;
__int64 v43;
_ETHREAD *Thread;
char *v45;
UINT64 v46;
unsigned __int64 v47;
int v48;
v8 = (int)CapturedViewSize;
if( (HIDWORD(Process->Pcb.ThreadListHead.Blink) & 2) != 0 || *(_QWORD *)&Process->Pcb.Affinity.Count )
return -1073741811;
v11 = (_EPROCESS *)Process->Pcb.Affinity.Bitmap[0];
v12 = (unsigned int)CapturedViewSize >> 3;
if( (unsigned int)CapturedViewSize >> 3 == 2
|| ((unsigned __int8)CapturedViewSize & 5) == 5
|| (_DWORD)CapturedViewSize == 24 )
{
return -1073741755;
}
CurrentThread = (_ETHREAD *)KeGetCurrentThread();
Thread = CurrentThread;
Pool = (_MMVAD *)MiAllocatePool(64i64, 0x40ui64, 0x6C646156ui64);
v15 = Pool;
if( !Pool )
return -1073741670;
Pool->Core.VadNode.ParentValue = -2i64;
v16 = Pool->Core.u.LongFlags & 0xFFFFF01F;
v15->Core.PushLock._bf_0 = 0i64;
v15->Core.u.LongFlags = v16 | ((v8 & 0x1F) << 7) | 0x100010;
LODWORD(v17) = MiSanitizePage((unsigned __int64)SectionOffset->QuadPart >> 12);
v47 = -1i64;
v18 = v17;
LOCK_ADDRESS_SPACE(CurrentThread, v11);
if( (v11->Flags & 0x20) != 0 )
{
inserted = -1073741558;
}
else
{
LowPart = (unsigned __int16)SectionOffset->anonymous_0.LowPart;
if( (Process->Pcb.DeepFreezeStartTime & 1) != 0 )
{
v22 = (unsigned __int64)*CapturedBase + LowPart;
MiIsVaRangeAvailable(v11, (VOID *)v22, (UINT64)Process->Pcb.ProfileListHead.Flink, *(VOID **)Process->Pcb.gap0);
if( v35 )
{
LABEL_11:
v24 = v23 >> 12;
v25 = 1;
v26 = (unsigned __int64)v21 >> 12;
v15->Core.EndingVpnHigh = BYTE4(v26);
v15->Core.StartingVpnHigh = BYTE4(v24);
v15->Core.StartingVpn = v24;
v15->Core.EndingVpn = v26;
v46 = v18
+ ((unsigned int)v26 | ((unsigned __int64)BYTE4(v26) << 32))
- ((unsigned int)v24 | ((unsigned __int64)BYTE4(v24) << 32));
v48 = 1;
if( v12 == 3 )
{
if( (v8 & 7) == 0 )
{
LABEL_15:
v43 = -1i64;
v27 = 0i64;
v28 = v18;
if( v18 <= v18
+ ((unsigned int)v26 | ((unsigned __int64)BYTE4(v26) << 32))
- ((unsigned int)v24 | ((unsigned __int64)BYTE4(v24) << 32)) )
{
do
{
MiIsPfn(v28);
v30 = v29;
if( v29 )
{
v32 = v43;
}
else
{
v31 = v28;
if( v27 )
v31 = v43;
++v27;
v32 = v31;
v43 = v31;
}
if( (v28 == v46 || v30 == 1) && v27 )
{
inserted = MiReferenceIoPages(1u, v32, v27, v25, 0i64, 0i64);
if( inserted < 0 )
goto LABEL_38;
v34 = v27 + v43 - 1;
v27 = 0i64;
v43 = -1i64;
v47 = v34;
}
v25 = v48;
++v28;
}
while( v28 <= v46 );
}
inserted = MiInsertVadCharges(&v15->Core, (ULONG_PTR)v11);
if( inserted >= 0 )
{
MiInsertViewOfPhysicalSection(v11, v15);
if( (v8 & 2) != 0 && MiIsProcessCfgEnabled() )
{
MiLockVad(Thread, &v15->Core);
UNLOCK_ADDRESS_SPACE_UNORDERED(Thread, v11);
v40 = MiCommitVadCfgBits(v15, 0i64, ProtectionMask);
if( v40 < 0 )
{
MiReferenceVad(&v15->Core);
MiDeleteVad(v15, 0i64);
return v40;
}
MiUnlockVad(Thread, &v15->Core);
}
else
{
UNLOCK_ADDRESS_SPACE(Thread, v11);
}
*CapturedBase = (VOID *)v22;
return 0;
}
goto LABEL_38;
}
v25 = 2;
}
else if( v12 == 1 )
{
v25 = 0;
}
v48 = v25;
goto LABEL_15;
}
inserted = -1073741800;
}
else
{
LODWORD(v42) = 0;
LODWORD(HINTHonored) = v8;
v45 = (char *)Process->Pcb.ProfileListHead.Flink + LowPart;
inserted = MiSelectUserAddress(
LODWORD(Process->Pcb.DirectoryTableBase),
*(_QWORD *)Process->Pcb.gap0,
*(_QWORD *)&Process->Pcb.gap0[8],
(UINT64)v45,
*(_QWORD *)&Process->Pcb.gap0[16],
0i64,
HINTHonored,
v42);
if( inserted >= 0 )
{
v21 = v45 - 1;
v22 = (unsigned __int16)SectionOffset->anonymous_0.LowPart;
v23 = v22;
goto LABEL_11;
}
}
}
LABEL_38:
UNLOCK_ADDRESS_SPACE(Thread, v11);
if( v47 != -1i64 )
{
v36 = -1i64;
v37 = 0i64;
while( v18 <= v47 )
{
MiIsPfn(v18);
if( !v38 )
{
v39 = v18;
if( v37 )
v39 = v36;
++v37;
v36 = v39;
}
if( v38 == 1 || v18 == v47 )
{
if( v37 )
{
MiDereferenceIoPages(1i64, v36, v37);
v36 = -1i64;
v37 = 0i64;
}
}
++v18;
}
}
ExFreePoolWithTag(v15, 0);
return inserted;
}Referenced by:
MiMapViewOfSection