MiMapContiguousMemory
INT8 *__fastcall MiMapContiguousMemory(unsigned __int64 a1, _EPROCESS *a2, unsigned int a3, INT64 a4){
char v4;
unsigned int v5;
char *v7;
unsigned __int64 v8;
unsigned __int64 v9;
unsigned int v10;
int v11;
_MMPTE *v12;
int v13;
_KTBFLUSH_TYPE v14;
INT8 *v15;
unsigned int v16;
UINT64 v18;
_MI_PFN_CACHE_ATTRIBUTE v19;
void *v20;
unsigned int v21;
INT64 a5;
int a6;
int v24;
INT64 a3a;
unsigned __int64 v26;
_EPROCESS *v27;
_MDL MemoryDescriptorList;
unsigned __int64 v29;
v27 = a2;
v4 = a4;
v5 = a3;
if( a3 == -1 )
return 0i64;
if( a3 == 24 )
return 0i64;
if( (a3 & 5) == 5 )
return 0i64;
if( (a3 & 0xFFFFFFF8) == 16 )
return 0i64;
v7 = &a2->Pcb.gap0[a1];
if( (unsigned __int64)v7 <= a1 )
{
if( v7 )
return 0i64;
}
v26 = a1 & 0xFFF;
v8 = ((unsigned __int64)&a2[1].SecurityPort + v26 + 7) >> 12;
v9 = (a1 >> 12) & 0xFFFFFFFFFi64;
if( a1 >> 12 < 0x1000000000i64 )
v9 = a1 >> 12;
a3a = v9;
if( (a3 & 2) != 0 && (MiFlags & 0x10000) != 0 )
v5 = a3 & 0xFFFFFFFD;
a6 = 0;
if( (a1 & 0x1FFFFF) != 0
|| (unsigned __int64)a2 < 0x200000
|| (v11 = a4 & 1, (a4 & 1) != 0)
|| (v15 = MiMapContiguousMemoryLarge(
v9,
((unsigned __int64)&a2[1].SecurityPort + (a1 & 0xFFF) + 7) >> 12,
v5,
a4,
(INT64)&a6)) == 0i64 )
{
v24 = 0;
v10 = v8;
v11 = v4 & 1;
if( (v4 & 1) != 0 )
{
v10 = v8 + 1;
if( (_DWORD)v8 == -1 )
return 0i64;
v24 = 1;
}
v12 = MiReservePtes((_MI_SYSTEM_PTE_TYPE *)((char *)&stru_140C4DB30 + 4432), v10);
if( v12 )
{
v13 = v24 | 2;
if( (v4 & 2) == 0 )
v13 = v24;
LODWORD(a5) = v13;
if( MiFillSystemPtes((UINT64)v12, v8, a3a, v5, a5, (INT64)&a6) >= 0 )
{
v15 = (INT8 *)(v26 + ((__int64)(((_QWORD)v12 << 25) - ((_QWORD)MmGetPteBase() << 25)) >> 16));
goto LABEL_16;
}
MiReleasePtes((_MI_SYSTEM_PTE_TYPE *)((char *)&stru_140C4DB30 + 4432), v12, v10, v14);
}
return 0i64;
}
LABEL_16:
v16 = a6 & 1;
if( (a6 & 1) != 0 )
MiMappingHasIoReferences(v15);
if( (dword_140CFA17C & 1) != 0 )
{
MemoryDescriptorList.Next = 0i64;
*(_QWORD *)&MemoryDescriptorList.Size = 0i64;
MemoryDescriptorList.ByteCount = 0;
v18 = v16 | 2;
v29 = a1 >> 12;
v19 = MiCached;
MemoryDescriptorList.MappedSystemVa = v15;
v20 = (void *)(a1 & 0xFFFFFFFFFFFFF000ui64);
v21 = a1 & 0xFFF;
MemoryDescriptorList.StartVa = v20;
MemoryDescriptorList.Process = v27;
if( !v11 )
v18 = v16;
MemoryDescriptorList.ByteOffset = v21;
if( v5 >> 3 == 1 )
{
v19 = MiNonCached;
}
else if( v5 >> 3 == 3 && (v5 & 7) != 0 )
{
v19 = MiWriteCombined;
}
MiInsertPteTracker(&MemoryDescriptorList, MiPteTrackerContiguous, v18, v19);
}
return v15;
}Referenced by:
MiAllocateContiguousMemory
MmMapIoSpaceEx