MiZeroCfgSystemWideBitmapWorker
VOID __stdcall MiZeroCfgSystemWideBitmapWorker(_SUBSECTION *Subsection, UINT64 StartBit, UINT64 NumberOfBits){
UINT64 v3;
_CONTROL_AREA *ControlArea;
UINT64 v5;
UINT64 v7;
__int64 v8;
_SUBSECTION *v9;
_MMPTE *SubsectionBase;
unsigned __int64 v11;
_SUBSECTION *v12;
UINT64 v13;
_MMPTE *v14;
unsigned __int64 v15;
unsigned __int64 v16;
int v17;
__int64 v18;
_MMPFN *v19;
UINT64 v20;
__int64 v21;
_MMPFN *v22;
UINT64 v23;
unsigned __int64 v24;
unsigned __int64 v25;
union {unsigned __int64 Long;volatile unsigned __int64 VolatileLong;_MMPTE_HARDWARE Hard;_MMPTE_PROTOTYPE Proto;_MMPTE_SOFTWARE Soft;_MMPTE_TIMESTAMP TimeStamp;_MMPTE_TRANSITION Trans;_MMPTE_SUBSECTION Subsect;_MMPTE_LIST List;} v26;
int v27;
UINT64 *p_Long;
_MMPTE v29;
union {unsigned __int64 Long;volatile unsigned __int64 VolatileLong;_MMPTE_HARDWARE Hard;_MMPTE_PROTOTYPE Proto;_MMPTE_SOFTWARE Soft;_MMPTE_TIMESTAMP TimeStamp;_MMPTE_TRANSITION Trans;_MMPTE_SUBSECTION Subsect;_MMPTE_LIST List;} v30;
UINT64 v31;
__int16 v32;
_MMPFN *v33;
int v34;
INT64 v35;
UINT64 v36;
UINT64 v37;
INT64 v38;
__int64 v39;
__int64 v40;
int v41;
char *v42;
VOID *v43;
char *v44;
union {unsigned __int64 Long;volatile unsigned __int64 VolatileLong;_MMPTE_HARDWARE Hard;_MMPTE_PROTOTYPE Proto;_MMPTE_SOFTWARE Soft;_MMPTE_TIMESTAMP TimeStamp;_MMPTE_TRANSITION Trans;_MMPTE_SUBSECTION Subsect;_MMPTE_LIST List;} v45;
INT64 v46;
UINT64 v47;
bool v48;
_MMPFNLIST *v49;
char *v50;
VOID *v51;
size_t v52;
char *v53;
volatile signed __int32 *v54;
size_t v55;
int v56;
union {unsigned __int64 Long;volatile unsigned __int64 VolatileLong;_MMPTE_HARDWARE Hard;_MMPTE_PROTOTYPE Proto;_MMPTE_SOFTWARE Soft;_MMPTE_TIMESTAMP TimeStamp;_MMPTE_TRANSITION Trans;_MMPTE_SUBSECTION Subsect;_MMPTE_LIST List;} v57;
__int64 v58;
__int64 v59;
_MMPTE v60;
_MI_PARTITION *v61;
unsigned __int64 v62;
unsigned __int64 v63;
unsigned int v64;
int v65;
unsigned __int64 v66;
UINT64 v67;
UINT64 v68;
_MI_PARTITION *Partition;
_MMPFN *v70;
__int64 v71;
UINT64 v72;
__int64 v73;
UINT64 v74;
_SUBSECTION *v75;
UINT64 OutPteOffset;
UINT64 v77;
UINT64 v78;
_KLOCK_QUEUE_HANDLE LockQueue[4];
UINT8 PageIrql;
size_t v81;
int v82;
unsigned int v83;
v3 = NumberOfBits >> 3;
ControlArea = Subsection->ControlArea;
v5 = StartBit >> 3;
memset(LockQueue, 0, 24);
v7 = (StartBit >> 3) & 0xFFF;
v8 = ControlArea->u1.Flags._bf_0 & 0x3FF;
v83 = (StartBit >> 3) & 0xFFF;
Partition = *(_MI_PARTITION **)(*(&stru_140C4DB30 + 267) + 8 * v8);
v81 = ((StartBit >> 3) + v3) & 0xFFF;
OutPteOffset = ((StartBit >> 3) + v3 - 1) >> 12;
v9 = MiLocatePagefileSubsection(Subsection, &OutPteOffset);
v75 = v9;
v78 = OutPteOffset;
SubsectionBase = v9->SubsectionBase;
v74 = v5 >> 12;
v11 = (unsigned __int64)&SubsectionBase[OutPteOffset];
v12 = MiLocatePagefileSubsection(Subsection, &v74);
if( v12->SubsectionBase )
{
v13 = v74;
}
else
{
do
{
if( v12 == v9 )
return;
v12 = v12->NextSubsection;
v13 = 0i64;
v74 = 0i64;
}
while( !v12->SubsectionBase );
}
v14 = v12->SubsectionBase;
v15 = (unsigned __int64)&v14[v13];
if( v12 == v9 )
v16 = v11;
else
v16 = (unsigned __int64)&v14[v12->PtesInSubsection];
v17 = v81;
v67 = v16;
PageIrql = 17;
v68 = 0i64;
v18 = v15 & -(__int64)((_DWORD)v7 != 0);
v19 = 0i64;
v70 = 0i64;
v20 = 0i64;
v71 = v18;
v21 = v11 & -(__int64)(v81 != 0);
v73 = v21;
while( v15 < v16 )
{
LABEL_7:
if( (v20 & 0xFFFFFFFFFFFFF000ui64) != (v15 & 0xFFFFFFFFFFFFF000ui64) && v20 )
{
MiUnlockProtoPoolPage((ULONG_PTR)v19, PageIrql);
v19 = 0i64;
v68 = 0i64;
v70 = 0i64;
}
if( v19 )
{
LABEL_9:
v22 = MiLockLeafPage((_MMPTE *)v15, 0i64);
LODWORD(v23) = MI_READ_PTE_LOCK_FREE(v15);
v77 = v23;
v24 = v23;
if( (v23 & 1) != 0 )
{
MiPteInShadowRange((UINT64)&v77);
v42 = (char *)MiMapPageInHyperSpaceWorker((v24 >> 12) & 0xFFFFFFFFFi64, 0i64, 0x80000000ui64);
v43 = v42;
if( v15 == v18 )
{
v55 = 4096 - v83;
v44 = &v42[v83];
}
else
{
v44 = v42;
if( v15 != v21 )
{
KeZeroSinglePage(v42);
LABEL_46:
MiUnmapPageInHyperSpaceWorker(v43, 0x11u, 0x80000000ui64);
MiCaptureDirtyBitToPfn();
_InterlockedAnd64(&v22->u2.Lock, 0x7FFFFFFFFFFFFFFFui64);
if( !v45.Long )
goto LABEL_26;
v60.u.Long = v45.Long;
v61 = *(_MI_PARTITION **)(*(&stru_140C4DB30 + 267) + 8 * (((unsigned __int64)v22->u4._bf_0 >> 39) & 0x3FF));
goto LABEL_86;
}
v55 = v81;
}
memset(v44, 0i64, v55);
goto LABEL_46;
}
if( (v23 & 0x400) != 0 )
goto LABEL_26;
if( (v23 & 0x800) == 0 )
{
if( v23 && v15 != v18 && v15 != v21 )
{
if( (v23 & 2) != 0 )
{
v38 = (INT64)Partition->Vp.PagingFile[(unsigned __int16)v23 >> 12];
if( *(&stru_140C4DB30 + 42) && (v23 & 0x10) == 0 )
v23 &= ~*(&stru_140C4DB30 + 42);
v37 = HIDWORD(v23);
}
else
{
v37 = 0i64;
v38 = 0i64;
}
LODWORD(v39) = MiTransferSoftwarePte(v24, v38, v37);
v40 = v39;
MiReleasePageFileSpace(Partition, (_MMPTE)v24, 0i64);
LOBYTE(v41) = MiPteInShadowRange(v15);
if( v41 && (KeGetCurrentThread()->ApcState.Process->Flags3 & 0x1000) != 0 && (v40 & 1) != 0 )
v40 |= 0x8000000000000000ui64;
*(_QWORD *)v15 = v40;
}
goto LABEL_26;
}
if( *(&stru_140C4DB30 + 42) )
{
if( (v23 & 0x10) != 0 )
v24 = v23 & 0xFFFFFFFFFFFFFFEFui64;
else
v24 = ~*(&stru_140C4DB30 + 42) & v23;
}
v25 = (v24 >> 12) & 0xFFFFFFFFFi64;
v26.Long = 0i64;
if( v22->u3.ReferenceCount )
goto LABEL_25;
if( v15 == v71 || v15 == v21 )
{
v48 = (*(_BYTE *)(&v22->u3 + 1) & 0x10) == 0;
v82 = 0;
if( !v48 )
{
v49 = Partition->PageLists.PageLocationList[3];
LockQueue[0].LockQueue.Next = 0i64;
LockQueue[0].LockQueue.Lock = &v49->Lock;
KxAcquireQueuedSpinLock(&LockQueue[0].LockQueue, &v49->Lock);
goto LABEL_54;
}
v82 = 1;
MiUnlinkPageFromList(v22, 0i64);
if( v56 )
{
MiCaptureDirtyBitToPfn();
v26.Long = v57.Long;
v49 = 0i64;
LABEL_54:
v50 = (char *)MiMapPageInHyperSpaceWorker(v25, 0i64, 0x80000000ui64);
v51 = v50;
if( v15 == v71 )
{
v52 = 4096 - v83;
v53 = &v50[v83];
}
else
{
v52 = v81;
v53 = v50;
}
memset(v53, 0i64, v52);
MiUnmapPageInHyperSpaceWorker(v51, 0x11u, 0x80000000ui64);
if( *(&stru_140C4DB30 + 567) == 1 )
{
v62 = v25 & 0x1F;
LOBYTE(v63) = 1;
v54 = (volatile signed __int32 *)(*(&stru_140C4DB30 + 295) + 4 * (v25 >> 5));
if( v62 + 1 > 0x20 )
{
if( (v25 & 0x1F) != 0 )
{
v65 = v25 & 0x1F;
_InterlockedOr(v54++, ((1 << (32 - v65)) - 1) << v62);
v63 = 1i64 - (unsigned int)(32 - v65);
if( v63 >= 0x20 )
{
v66 = v63 >> 5;
v63 += -32i64 * (v63 >> 5);
do
{
*v54++ = -1;
--v66;
}
while( v66 );
}
if( !v63 )
goto LABEL_57;
}
v64 = (1 << v63) - 1;
}
else
{
v64 = 1 << v62;
}
_InterlockedOr(v54, v64);
}
LABEL_57:
if( v49 )
KeReleaseInStackQueuedSpinLockFromDpcLevel(LockQueue);
if( v82 == 1 )
MiInsertPageInList(v22, 8ui64, (UINT8)v54);
LABEL_24:
v21 = v73;
LABEL_25:
_InterlockedAnd64(&v22->u2.Lock, 0x7FFFFFFFFFFFFFFFui64);
if( !v26.Long )
{
LABEL_26:
v19 = v70;
v15 += 8i64;
v9 = v75;
v18 = v71;
goto LABEL_27;
}
v61 = Partition;
v60.u.Long = v26.Long;
LABEL_86:
MiReleasePageFileInfo(v61, v60, 1ui64);
goto LABEL_26;
}
}
else
{
MiUnlinkPageFromList(v22, 0i64);
if( v27 )
{
p_Long = &v22->OriginalPte.u.Long;
v29.u.Long = MiCapturePageFileInfoInline(&v22->OriginalPte, 0i64, 0i64).u.Long;
v30.Long = (unsigned __int64)v22->OriginalPte.u;
v26.Long = v29.u.Long;
if( (v30.Long & 2) != 0 )
{
v46 = (INT64)Partition->Vp.PagingFile[LOWORD(v30.Long) >> 12];
if( *(&stru_140C4DB30 + 42) && (v30.Long & 0x10) == 0 )
v30.Long &= ~*(&stru_140C4DB30 + 42);
LODWORD(v47) = MiTransferSoftwarePte(*p_Long, v46, HIDWORD(v30.Proto._bf_0));
v31 = v47;
}
else
{
v72 = *p_Long;
MiSetNonResidentPteHeat(&v72, 0i64);
v31 = v72;
if( (v32 & 0x400) == 0 )
{
v31 = v72 & 0xFFFFFFFFFFFFFFF9ui64;
v72 &= 0xFFFFFFFFFFFFFFF9ui64;
}
}
v33 = &MmGetPfnDb()[v22->u4._bf_0 & 0xFFFFFFFFFi64];
v82 = 0;
LOBYTE(v34) = MiPteInShadowRange(v15);
if( v34 && (KeGetCurrentThread()->ApcState.Process->Flags3 & 0x1000) != 0 && (v31 & 1) != 0 )
v31 |= 0x8000000000000000ui64;
*(_QWORD *)v15 = v31;
MiLockNestedPageAtDpcInline(v33);
MiDecrementShareCount(v33);
_InterlockedAnd64(&v33->u2.Lock, 0x7FFFFFFFFFFFFFFFui64);
MiInsertPageInFreeOrZeroedList(v25, 2ui64, v35, v36, v67, v68);
goto LABEL_24;
}
}
MiDiscardTransitionPteEx(v22, 0i64);
_InterlockedAnd64(&v22->u2.Lock, 0x7FFFFFFFFFFFFFFFui64);
v19 = v70;
v15 += 8i64;
v9 = v75;
v16 = v67;
v18 = v71;
v20 = v68;
v17 = v81;
}
else
{
v70 = MiLockProtoPoolPage((_MMPTE *)v15, &PageIrql);
v19 = v70;
if( v70 )
{
v68 = v15;
goto LABEL_9;
}
v15 = (v15 & 0xFFFFFFFFFFFFF000ui64) + 4096;
LABEL_27:
v16 = v67;
v20 = v68;
v17 = v81;
}
}
while( v12 != v9 )
{
v12 = v12->NextSubsection;
if( v12->SubsectionBase )
{
v15 = (unsigned __int64)v12->SubsectionBase;
if( v12 == v9 )
{
v58 = (__int64)&v9->SubsectionBase[v78];
v59 = v58;
if( !v17 )
v59 = v21;
v21 = v59;
v73 = v59;
}
else
{
v58 = v15 + 8i64 * v12->PtesInSubsection;
}
v67 = v58;
goto LABEL_7;
}
}
if( v19 )
MiUnlockProtoPoolPage((ULONG_PTR)v19, PageIrql);
}Referenced by:
MiZeroCfgSystemWideBitmap