MiViewMayContainPage
void *__fastcall MiViewMayContainPage(__int64 a1, char a2, __int64 a3, unsigned __int64 a4, unsigned __int64 a5){
UINT64 v5;
unsigned int v6;
void *v7;
__int64 v9;
unsigned __int64 v11;
unsigned __int64 v12;
unsigned int v13;
unsigned __int64 v14;
unsigned __int64 v15;
int v17;
unsigned __int8 v18;
unsigned __int64 v19;
UINT64 v20;
__int64 v21;
void *v22;
unsigned __int64 v23;
__int64 v24;
__int64 v25;
unsigned __int64 v26;
unsigned __int64 v27;
v5 = *(_QWORD *)(a3 + 16);
v6 = -1;
v7 = 0i64;
v9 = a3;
if( (v5 & 3) != 0 )
{
switch( v5 & 3 )
{
case 1ui64:
v7 = (void *)(v5 & 0xFFFFFFFFFFFFFFFEui64);
v17 = a2 & 0x20;
if( (*(_DWORD *)(a1 + 56) & 0x20) == 0 )
{
if( v17 && (*(_DWORD *)(a3 - 48) & 0x280) != 512 )
return 0i64;
v12 = MiStartingOffset(*(_QWORD *)(a3 - 24), *(_QWORD *)(a3 - 16), 0xFFFFFFFF);
v18 = *(_BYTE *)(v9 - 64);
a3 = *(unsigned int *)(v9 - 72);
v15 = v12
+ (((*(unsigned int *)(v9 - 68) | ((unsigned __int64)*(unsigned __int8 *)(v9 - 63) << 32))
- (a3 | ((unsigned __int64)v18 << 32))
+ 1) << 12);
goto LABEL_16;
}
if( !v17 )
{
v18 = *(_BYTE *)(a3 - 64);
v12 = 0i64;
LODWORD(a3) = *(_DWORD *)(a3 - 72);
v15 = 0i64;
LABEL_16:
v5 = ((unsigned int)a3 | ((unsigned __int64)v18 << 32)) << 12;
goto LABEL_7;
}
break;
case 2ui64:
v5 &= ~2ui64;
if( *(_DWORD *)(a3 + 24) != -1 )
v6 = *(_DWORD *)(a3 + 24);
v12 = *(_QWORD *)(a3 - 48) << 12;
v15 = v12 + *(_QWORD *)(a3 - 40);
goto LABEL_7;
case 3ui64:
v5 &= 0xFFFFFFFFFFFFFFFCui64;
v6 = *(_DWORD *)(a3 + 32);
v15 = *(_QWORD *)(a3 + 24) - v5 + 1;
if( (*(_DWORD *)(a1 + 56) & 0x20) != 0 )
{
v24 = a1 + 128;
if( (unsigned int)MiGetSystemRegionType(v5) != 1 )
v6 = -2;
while( v24 )
{
v27 = MiStartingOffset(v24, *(_QWORD *)(v24 + 8), v6);
if( a4 < MiEndingOffsetWithLock(v24) && a4 >= v27 )
{
v25 = *(_QWORD *)(v24 + 8);
v26 = v25 + 8 * ((a4 - v27) >> 12);
if( v26 < v25 + 8 * (unsigned __int64)*(unsigned int *)(v24 + 44)
&& ((*(_BYTE *)(v24 + 34) & 2) == 0 || (*(_DWORD *)(a1 + 56) & 0x4000000) == 0) )
{
v5 += (__int64)(v26 - *(_QWORD *)(a1 + 136)) >> 3 << 12;
goto LABEL_47;
}
return 0i64;
}
v24 = *(_QWORD *)(v24 + 16);
}
return 0i64;
}
LABEL_47:
v12 = 0i64;
goto LABEL_7;
}
return 0i64;
}
v11 = *(_QWORD *)(a3 + 32);
v12 = v11;
if( (v5 & 3) == 0 )
v12 = 4 * (v11 & 0xFFFFFFFFFFFF0000ui64);
v13 = v11 & 0x3F;
if( v13 )
v14 = (unsigned __int64)v13 << 12;
else
v14 = 0x40000i64;
v15 = v12 + v14;
if( !v5 )
return 0i64;
LABEL_7:
if( (*(_DWORD *)(a1 + 56) & 0x20) != 0 )
{
v19 = 0i64;
v20 = v5 + 4096;
}
else
{
if( a4 >= v15 || a5 <= v12 )
return 0i64;
v19 = v12;
if( a4 >= v12 )
{
v19 = a4;
v5 += a4 - v12;
}
v23 = a5 - v19;
if( a5 > v15 )
v23 = v15 - v19;
v20 = v5 + v23;
}
LODWORD(v21) = MiAllocatePool((struct _SLIST_ENTRY *)0x40);
v22 = (void *)v21;
if( v21 )
{
*(_QWORD *)(v21 + 16) = v5;
*(_QWORD *)(v21 + 24) = v20;
*(_QWORD *)(v21 + 8) = v7;
*(_QWORD *)(v21 + 32) = v19;
*(_DWORD *)(v21 + 40) = v6;
*(_DWORD *)(v21 + 44) = *(_DWORD *)(v9 + 16) & 3;
if( v7 )
{
if( !ObReferenceObjectSafeWithTag(v7, 0x746C6644ui64) )
{
ExFreePoolWithTag(v22, 0);
return 0i64;
}
}
}
return v22;
}Referenced by:
MiTrimSection