MiOffsetToProtos
_SUBSECTION *__stdcall MiOffsetToProtos(_CONTROL_AREA *ControlArea, UINT64 SectionByteOffset, UINT64 *PteOffset){
_SUBSECTION *v4;
UINT64 v6;
union {unsigned int LongFlags;_MMSECTION_FLAGS Flags;} v8;
unsigned __int8 v9;
__int64 v10;
__int64 i;
unsigned __int64 v12;
UINT8 CurrentIrql;
int v14;
unsigned __int64 NumberOfPfnReferences;
UINT64 v16;
unsigned __int64 v17;
UINT64 v18;
UINT64 v19;
_QWORD *v21;
unsigned __int16 v22;
UINT64 j;
unsigned __int64 v24;
unsigned __int64 v25;
unsigned __int64 v26;
int v27[36];
v4 = 0i64;
v6 = SectionByteOffset >> 12;
*PteOffset = SectionByteOffset >> 12;
v8.LongFlags = (unsigned int)ControlArea->u;
if( (v8.LongFlags & 0x20) != 0 || !ControlArea->FilePointer.Value || (v8.LongFlags & 0x400) != 0 )
{
v12 = ControlArea->Segment->TotalNumberOfPtes | ((unsigned __int64)(ControlArea->Segment->SegmentFlags.Short0 & 0x3FF) << 32);
}
else
{
v9 = ExAcquireSpinLockShared((INT64 *)&ControlArea->ControlAreaLock);
v10 = *(_QWORD *)&ControlArea[2].gap8[8];
for( i = 0i64; v10; v10 = *(_QWORD *)(v10 + 8) )
i = v10;
v12 = (*(unsigned int *)(i - 20) | ((unsigned __int64)(*(_WORD *)(i - 24) & 0xFFC0) << 26))
+ *(unsigned int *)(i - 12)
- (unsigned __int64)(*(_DWORD *)(i - 4) & 0x3FFFFFFF);
_InterlockedAnd(&ControlArea->ControlAreaLock, 0xBFFFFFFF);
_InterlockedDecrement(&ControlArea->ControlAreaLock);
__writecr8(v9);
v6 = *PteOffset;
}
if( v6 >= v12 )
return 0i64;
if( !ControlArea->FilePointer.Value )
return MiLocatePagefileSubsection((_SUBSECTION *)&ControlArea[1], PteOffset);
if( (ControlArea->u.LongFlags & 0x20) != 0 )
{
v4 = (_SUBSECTION *)&ControlArea[1];
for( j = HIDWORD(ControlArea[1].NumberOfMappedViews); v6 >= j; j = v4->PtesInSubsection )
{
v6 -= j;
*PteOffset = v6;
v4 = v4->NextSubsection;
}
}
else
{
memset(v27, 0i64, sizeof(v27));
if( SectionByteOffset >= 0x3FFFFFFFFFF000i64 )
goto LABEL_20;
CurrentIrql = KeGetCurrentIrql();
__writecr8(2ui64);
_m_prefetchw((const void *)&ControlArea->ControlAreaLock);
v14 = ControlArea->ControlAreaLock & 0x7FFFFFFF;
if( v14 != _InterlockedCompareExchange(&ControlArea->ControlAreaLock, v14 + 1, v14) )
ExpWaitForSpinLockSharedAndAcquire((INT64 *)&ControlArea->ControlAreaLock, CurrentIrql);
NumberOfPfnReferences = ControlArea[2].NumberOfPfnReferences;
v16 = SectionByteOffset >> 12;
v17 = *(unsigned int *)(NumberOfPfnReferences + 36) | ((unsigned __int64)(*(_WORD *)(NumberOfPfnReferences + 32) & 0xFFC0) << 26);
v18 = v17 + *(unsigned int *)(NumberOfPfnReferences + 40);
if( *(_WORD *)(NumberOfPfnReferences + 34) < 0x10u )
--v18;
v19 = HIDWORD(v16);
if( v16 >= v17 )
{
v19 = HIDWORD(v16);
if( v16 <= v18 )
{
if( CurrentIrql != 17 )
{
_InterlockedAnd(&ControlArea->ControlAreaLock, 0xBFFFFFFF);
_InterlockedDecrement(&ControlArea->ControlAreaLock);
__writecr8(CurrentIrql);
}
v4 = (_SUBSECTION *)NumberOfPfnReferences;
goto LABEL_20;
}
}
v21 = *(_QWORD **)&ControlArea[2].gap8[8];
v22 = v27[8] & 0x3F | ((_WORD)v19 << 6);
v27[9] = v16;
LOWORD(v27[8]) = v22;
if( v21 )
{
v26 = ((unsigned __int64)v22 << 26) ^ (unsigned int)v16 ^ (v22 << 26);
do
{
v24 = *((unsigned int *)v21 - 5) | ((unsigned __int64)(*(_WORD *)(v21 - 3) & 0xFFC0) << 26);
v25 = v24 + *((unsigned int *)v21 - 4);
if( *((_WORD *)v21 - 11) < 0x10u )
--v25;
if( v26 > v25 )
{
v21 = (_QWORD *)v21[1];
}
else
{
if( v26 >= v24 )
{
v4 = (_SUBSECTION *)(v21 - 7);
ControlArea[2].NumberOfPfnReferences = (unsigned __int64)(v21 - 7);
if( CurrentIrql != 17 )
goto LABEL_39;
goto LABEL_20;
}
v21 = (_QWORD *)*v21;
}
}
while( v21 );
}
if( CurrentIrql != 17 )
{
LABEL_39:
ExReleaseSpinLockSharedFromDpcLevel(&ControlArea->ControlAreaLock);
__writecr8(CurrentIrql);
}
LABEL_20:
*PteOffset -= v4->StartingSector | ((unsigned __int64)(v4->u.SubsectionFlags._bf_0 & 0xFFC0) << 26);
}
return v4;
}Referenced by:
MiAddMappedPtes
MiDereferenceDataSubsections
MiInsertInSystemSpace
MiLogRelocationRva
MiPfPrepareReadList
MiPfPrepareSequentialReadList
MiReferenceDataSubsections
MiRelocateImage
MiRemoveMappedPtes
MiScanRelocationPage
MiSetSystemCodeProtection
MmHardFaultBytesRequired
MmMapViewInSystemCache