MiInitializeImageProtos
VOID __stdcall MiInitializeImageProtos(_CONTROL_AREA *ControlArea, _MDL *Mdl, _MMPFN *HeaderPfn){
_CONTROL_AREA *v3;
unsigned int EffectivePagePriorityThread;
char v5;
_CONTROL_AREA *v6;
_MMPFN *v7;
_CONTROL_AREA *v8;
unsigned __int64 v9;
__int64 v10;
__int64 v11;
unsigned __int64 v12;
unsigned __int64 v13;
__int16 v14;
UINT64 v15;
UINT64 v16;
char *v17;
_MMPFN *v18;
UINT64 v19;
UINT64 Priority;
unsigned __int64 ByteCount;
_MI_PARTITION *Partition;
unsigned __int64 v23;
unsigned __int64 v24;
_CONTROL_AREA *v25;
UINT8 PageIrql;
UINT64 SpinCount;
v3 = ControlArea;
Partition = *(_MI_PARTITION **)(*(&stru_140C4DB30 + 267) + 8i64 * (ControlArea->u1.Flags._bf_0 & 0x3FF));
ByteCount = Mdl->ByteCount;
EffectivePagePriorityThread = MiGetEffectivePagePriorityThread((_ETHREAD *)KeGetCurrentThread());
v5 = EffectivePagePriorityThread;
if( EffectivePagePriorityThread > 5 )
{
v5 = 5;
}
else if( EffectivePagePriorityThread )
{
v5 = EffectivePagePriorityThread - 1;
}
v6 = v3 + 1;
PageIrql = 17;
v7 = 0i64;
if( v3 != (_CONTROL_AREA *)-128i64 )
{
do
{
v8 = *(_CONTROL_AREA **)&v6->gap8[8];
v9 = *(_QWORD *)v6->gap8;
v25 = v8;
if( (v6->NumberOfPfnReferences & 0x20000) == 0 )
{
LODWORD(v10) = MiStartingOffset((_SUBSECTION *)v6, (_MMPTE *)v9, 0xFFFFFFFFui64);
v11 = v10;
MiEndingOffset((_SUBSECTION *)v6);
v23 = v12;
v13 = v9 + 8i64 * HIDWORD(v6->NumberOfMappedViews);
v24 = v13;
if( v9 < v13 )
{
while( 1 )
{
if( (v9 & 0xFFF) != 0 && v7 )
goto LABEL_9;
if( v7 )
MiUnlockProtoPoolPage((ULONG_PTR)v7, PageIrql);
v7 = MiLockProtoPoolPage((_MMPTE *)v9, &PageIrql);
if( v7 )
{
LABEL_9:
if( v11 + 4096 > ByteCount )
{
v8 = 0i64;
break;
}
v14 = MI_READ_PTE_LOCK_FREE(v9);
if( (v14 & 1) == 0 && (v14 & 0xC00) != 2048i64 && (v14 & 0x400) != 0 )
{
MiGetPageForHeader(Partition, (v3->u.LongFlags >> 20) & 0x3F);
v16 = v15;
if( v15 != -1i64 )
{
if( (Mdl->MdlFlags & 5) == 0 )
{
LODWORD(Priority) = -1073741792;
LODWORD(v19) = 0;
MmMapLockedPagesSpecifyCache(Mdl, 0, MmCached, 0i64, v19, Priority);
}
v17 = (char *)MiMapPageInHyperSpaceWorker(v16, 0i64, 0x80000000ui64);
KeCopyPage(v17);
if( v11 + 4096 > v23 )
memset(&v17[-(unsigned int)(v11 - v23 + 4096) + 4096], 0i64, v11 - v23 + 4096);
MiUnmapPageInHyperSpaceWorker(v17, 0x11u, 0x80000000ui64);
v18 = &MmGetPfnDb()[v16];
MiReferenceControlAreaPfn(ControlArea, 0i64, 1ui64);
LODWORD(SpinCount) = 0;
while( _interlockedbittestandset64((volatile signed __int32 *)&v18->u2, 0x3Fui64) )
{
do
KeYieldProcessorEx(&SpinCount);
while( v18->u2._bf_0 < 0 );
}
MiInitializeTransitionPfn(v16, (_MMPTE *)v9);
*((_BYTE *)&v18->u3 + 3) ^= (*((_BYTE *)&v18->u3 + 3) ^ v5) & 7;
MiRemoveLockedPageChargeAndDecRef(v18);
_InterlockedAnd64(&v18->u2.Lock, 0x7FFFFFFFFFFFFFFFui64);
v13 = v24;
}
v3 = ControlArea;
}
v9 += 8i64;
v11 += 4096i64;
}
else
{
MmAccessFault(2ui64, (PVOID)v9, 0, 0i64);
}
if( v9 >= v13 )
{
v8 = v25;
break;
}
}
}
if( v7 )
{
MiUnlockProtoPoolPage((ULONG_PTR)v7, PageIrql);
v7 = 0i64;
}
}
v6 = v8;
}
while( v8 );
}
}Referenced by:
MiCreateImageFileMap