MiViewMayContainPage
_MI_VIEW_INFO *__stdcall MiViewMayContainPage(
_CONTROL_AREA *ControlArea,
_LIST_ENTRY *NextEntry,
UINT64 StartingOffset,
UINT64 EndingOffset){
UINT64 v4;
unsigned int v5;
unsigned __int64 v6;
UINT64 v8;
unsigned __int64 v10;
unsigned __int64 v11;
unsigned int v12;
unsigned __int64 v13;
UINT64 v14;
int v16;
unsigned __int64 v17;
unsigned __int8 v18;
UINT64 v19;
UINT64 v20;
VOID *Pool;
void *v22;
UINT64 v23;
_CONTROL_AREA *v24;
unsigned __int64 v25;
UINT64 v26;
__int64 v27;
unsigned __int64 v28;
unsigned __int64 v29;
unsigned __int64 v30;
v4 = *(_QWORD *)(StartingOffset + 16);
v5 = -1;
v6 = 0i64;
v8 = StartingOffset;
if( (v4 & 3) != 0 )
{
switch( v4 & 3 )
{
case 1ui64:
v6 = v4 & 0xFFFFFFFFFFFFFFFEui64;
v16 = (unsigned __int8)NextEntry & 0x20;
if( (ControlArea->u.LongFlags & 0x20) == 0 )
{
if( v16 && (*(_DWORD *)(StartingOffset - 48) & 0x280) != 512 )
return 0i64;
LODWORD(v17) = MiStartingOffset(
*(_SUBSECTION **)(StartingOffset - 24),
*(_MMPTE **)(StartingOffset - 16),
0xFFFFFFFFui64);
v11 = v17;
v18 = *(_BYTE *)(v8 - 64);
StartingOffset = *(unsigned int *)(v8 - 72);
v14 = v11
+ (((*(unsigned int *)(v8 - 68) | ((unsigned __int64)*(unsigned __int8 *)(v8 - 63) << 32))
- (StartingOffset | ((unsigned __int64)v18 << 32))
+ 1) << 12);
goto LABEL_16;
}
if( !v16 )
{
v18 = *(_BYTE *)(StartingOffset - 64);
v11 = 0i64;
LODWORD(StartingOffset) = *(_DWORD *)(StartingOffset - 72);
v14 = 0i64;
LABEL_16:
v4 = ((unsigned int)StartingOffset | ((unsigned __int64)v18 << 32)) << 12;
goto LABEL_7;
}
break;
case 2ui64:
v4 &= ~2ui64;
if( *(_DWORD *)(StartingOffset + 24) != -1 )
v5 = *(_DWORD *)(StartingOffset + 24);
v11 = *(_QWORD *)(StartingOffset - 48) << 12;
v14 = v11 + *(_QWORD *)(StartingOffset - 40);
goto LABEL_7;
case 3ui64:
v4 &= 0xFFFFFFFFFFFFFFFCui64;
v5 = *(_DWORD *)(StartingOffset + 32);
v14 = *(_QWORD *)(StartingOffset + 24) - v4 + 1;
if( (ControlArea->u.LongFlags & 0x20) != 0 )
{
v24 = ControlArea + 1;
if( MiGetSystemRegionType(v4) != 1 )
v5 = -2;
while( v24 )
{
LODWORD(v25) = MiStartingOffset((_SUBSECTION *)v24, *(_MMPTE **)v24->gap8, v5);
v29 = v25;
LODWORD(v26) = MiEndingOffsetWithLock((_SUBSECTION *)v24);
if( EndingOffset < v26 && EndingOffset >= v29 )
{
v27 = *(_QWORD *)v24->gap8;
v28 = v27 + 8 * ((EndingOffset - v29) >> 12);
if( v28 < v27 + 8 * (unsigned __int64)HIDWORD(v24->NumberOfMappedViews)
&& ((v24->NumberOfPfnReferences & 0x20000) == 0 || (ControlArea->u.LongFlags & 0x4000000) == 0) )
{
v4 += (__int64)(v28 - *(_QWORD *)ControlArea[1].gap8) >> 3 << 12;
goto LABEL_47;
}
return 0i64;
}
v24 = *(_CONTROL_AREA **)&v24->gap8[8];
}
return 0i64;
}
LABEL_47:
v11 = 0i64;
goto LABEL_7;
}
return 0i64;
}
v10 = *(_QWORD *)(StartingOffset + 32);
v11 = v10;
if( (v4 & 3) == 0 )
v11 = 4 * (v10 & 0xFFFFFFFFFFFF0000ui64);
v12 = v10 & 0x3F;
if( v12 )
v13 = (unsigned __int64)v12 << 12;
else
v13 = 0x40000i64;
v14 = v11 + v13;
if( !v4 )
return 0i64;
LABEL_7:
if( (ControlArea->u.LongFlags & 0x20) != 0 )
{
v19 = 0i64;
v20 = v4 + 4096;
}
else
{
if( EndingOffset >= v14 || v30 <= v11 )
return 0i64;
v19 = v11;
if( EndingOffset >= v11 )
{
v19 = EndingOffset;
v4 += EndingOffset - v11;
}
v23 = v30 - v19;
if( v30 > v14 )
v23 = v14 - v19;
v20 = v4 + v23;
}
Pool = MiAllocatePool(64i64, 0x30ui64, 0x6156694Dui64);
v22 = Pool;
if( Pool )
{
*((_QWORD *)Pool + 2) = v4;
*((_QWORD *)Pool + 3) = v20;
*((_QWORD *)Pool + 1) = v6;
*((_QWORD *)Pool + 4) = v19;
*((_DWORD *)Pool + 10) = v5;
*((_DWORD *)Pool + 11) = *(_DWORD *)(v8 + 16) & 3;
if( v6 )
{
if( !ObReferenceObjectSafeWithTag(v6, 1953261124i64) )
{
ExFreePoolWithTag(v22, 0);
return 0i64;
}
}
}
return(_MI_VIEW_INFO *)v22;
}Referenced by:
MiTrimSection