MiZeroCfgSystemWideBitmapWorker
void __fastcall MiZeroCfgSystemWideBitmapWorker(unsigned int *a1, unsigned __int64 a2, unsigned __int64 a3){
unsigned __int64 v3;
__int64 v4;
unsigned __int64 v5;
unsigned __int64 v7;
__int64 v8;
unsigned int *v9;
__int64 v10;
UINT64 v11;
unsigned int *PagefileSubsection;
INT64 v13;
__int64 v14;
unsigned __int64 v15;
UINT64 v16;
int v17;
__int64 v18;
_MMPFN *v19;
INT64 v20;
__int64 v21;
_MMPFN *v22;
INT64 v23;
WORK_QUEUE_TYPE v24;
unsigned __int64 v25;
UINT64 v26;
unsigned __int64 v27;
UINT64 v28;
UINT64 *v29;
UINT64 v30;
__int64 v31;
UINT64 v32;
__int16 v33;
volatile signed __int64 *v34;
UINT64 v35;
INT64 v36;
UINT64 v37;
VOID *v38;
void *v39;
INT64 v40;
UINT64 v41;
INT64 v42;
bool v43;
_LIST_ENTRY *v44;
void *v45;
void *v46;
INT64 v47;
INT64 v48;
UINT64 v49;
INT64 v50;
unsigned __int64 v51;
volatile signed __int32 *v52;
unsigned int v53;
int v54;
unsigned __int64 v55;
INT64 v56;
INT64 v57;
_MI_PARTITION *Partition;
_MMPFN *v59;
INT64 v60;
UINT64 v61;
INT64 v62;
INT64 v63;
unsigned int *v64;
unsigned __int64 v65;
UINT64 v66;
unsigned __int64 v67;
struct _IO_WORKITEM LockHandle;
UINT64 PageIrql;
int v70;
int v71;
unsigned int v72;
v3 = a3 >> 3;
v4 = *(_QWORD *)a1;
v5 = a2 >> 3;
memset(&LockHandle, 0, 24);
v7 = (a2 >> 3) & 0xFFF;
v8 = *(_WORD *)(v4 + 60) & 0x3FF;
v72 = (a2 >> 3) & 0xFFF;
Partition = *(_MI_PARTITION **)(qword_140C4E388 + 8 * v8);
v70 = ((a2 >> 3) + v3) & 0xFFF;
v65 = ((a2 >> 3) + v3 - 1) >> 12;
v9 = MiLocatePagefileSubsection(a1, &v65);
v64 = v9;
v67 = v65;
v10 = *((_QWORD *)v9 + 1);
v63 = v5 >> 12;
v11 = v10 + 8 * v65;
PagefileSubsection = MiLocatePagefileSubsection(a1, (unsigned __int64 *)&v63);
if( *((_QWORD *)PagefileSubsection + 1) )
{
v13 = v63;
}
else
{
do
{
if( PagefileSubsection == v9 )
return;
PagefileSubsection = (unsigned int *)*((_QWORD *)PagefileSubsection + 2);
v13 = 0i64;
v63 = 0i64;
}
while( !*((_QWORD *)PagefileSubsection + 1) );
}
v14 = *((_QWORD *)PagefileSubsection + 1);
v15 = v14 + 8 * v13;
if( PagefileSubsection == v9 )
v16 = v11;
else
v16 = v14 + 8i64 * PagefileSubsection[11];
v17 = v70;
v56 = v16;
LOBYTE(PageIrql) = 17;
v57 = 0i64;
v18 = v15 & -(__int64)((_DWORD)v7 != 0);
v19 = 0i64;
v59 = 0i64;
v20 = 0i64;
v60 = v18;
v21 = v11 & -(__int64)(v70 != 0);
v62 = v21;
while( v15 < v16 )
{
LABEL_7:
if( (v20 & 0xFFFFFFFFFFFFF000ui64) != (v15 & 0xFFFFFFFFFFFFF000ui64) && v20 )
{
LOBYTE(v16) = PageIrql;
MiUnlockProtoPoolPage(v19, v16);
v19 = 0i64;
v57 = 0i64;
v59 = 0i64;
}
if( v19 )
{
LABEL_9:
v22 = MiLockLeafPage((_MMPTE *)v15, 0i64);
v23 = MI_READ_PTE_LOCK_FREE(v15);
v66 = v23;
v26 = v23;
if( (v23 & 1) != 0 )
{
MiPteInShadowRange((UINT64)&v66);
LODWORD(v38) = MiMapPageInHyperSpaceWorker((v26 >> 12) & 0xFFFFFFFFFi64, 0i64, 0x80000000ui64);
v39 = v38;
if( v15 == v18 )
{
v40 = (INT64)v38 + v72;
}
else
{
v40 = (INT64)v38;
if( v15 != v21 )
{
KeZeroSinglePage(v38);
LABEL_44:
MiUnmapPageInHyperSpaceWorker(v39, 0x11u, 0x80000000ui64);
v41 = MiCaptureDirtyBitToPfn((INT64)v22);
_InterlockedAnd64((volatile signed __int64 *)v22 + 3, 0x7FFFFFFFFFFFFFFFui64);
if( !v41 )
goto LABEL_25;
v49 = v41;
v25 = (*((_QWORD *)v22 + 5) >> 39) & 0x3FFi64;
v50 = *(_QWORD *)(qword_140C4E388 + 8 * v25);
goto LABEL_84;
}
}
memset(v40, 0i64);
goto LABEL_44;
}
if( (v23 & 0x400) != 0 )
goto LABEL_25;
if( (v23 & 0x800) == 0 )
{
if( v23 && v15 != v18 && v15 != v21 )
{
if( (v23 & 2) != 0 )
{
v36 = *((_QWORD *)Partition + ((unsigned __int16)v23 >> 12) + 868);
if( qword_140C4DC80 && (v23 & 0x10) == 0 )
v23 &= ~qword_140C4DC80;
v35 = HIDWORD(v23);
}
else
{
v35 = 0i64;
v36 = 0i64;
}
v37 = MiTransferSoftwarePte(v26, v36, v35);
MiReleasePageFileSpace(Partition, v26, 0i64);
*(_QWORD *)v15 = v37;
}
goto LABEL_25;
}
if( qword_140C4DC80 )
{
if( (v23 & 0x10) != 0 )
v26 = v23 & 0xFFFFFFFFFFFFFFEFui64;
else
v26 = ~qword_140C4DC80 & v23;
}
v27 = (v26 >> 12) & 0xFFFFFFFFFi64;
v28 = 0i64;
if( *((_WORD *)v22 + 16) )
goto LABEL_24;
if( v15 == v60 || v15 == v21 )
{
v43 = (*((_BYTE *)v22 + 34) & 0x10) == 0;
v71 = 0;
if( !v43 )
{
v44 = (_LIST_ENTRY *)*((_QWORD *)Partition + 530);
LockHandle.WorkItem.List.Flink = 0i64;
LockHandle.WorkItem.List.Blink = v44 + 2;
KxAcquireQueuedSpinLock(&LockHandle, (PIO_WORKITEM_ROUTINE)&v44[2], v24, (PVOID)v25);
goto LABEL_52;
}
v71 = 1;
if( (unsigned int)MiUnlinkPageFromList(v22, 0i64) )
{
v28 = MiCaptureDirtyBitToPfn((INT64)v22);
v44 = 0i64;
LABEL_52:
LODWORD(v45) = MiMapPageInHyperSpaceWorker(v27, 0i64, 0x80000000ui64);
v46 = v45;
if( v15 == v60 )
v47 = (INT64)v45 + v72;
else
v47 = (INT64)v45;
memset(v47, 0i64);
MiUnmapPageInHyperSpaceWorker(v46, 0x11u, 0x80000000ui64);
if( dword_140C4E40C == 1 )
{
v51 = v27 & 0x1F;
v25 = 1i64;
v52 = (volatile signed __int32 *)(qword_140C4E468 + 4 * (v27 >> 5));
if( v51 + 1 > 0x20 )
{
if( (v27 & 0x1F) != 0 )
{
v54 = v27 & 0x1F;
_InterlockedOr(v52++, ((1 << (32 - v54)) - 1) << v51);
v25 = 1i64 - (unsigned int)(32 - v54);
if( v25 >= 0x20 )
{
v55 = v25 >> 5;
v25 += -32i64 * (v25 >> 5);
do
{
*v52++ = -1;
--v55;
}
while( v55 );
}
if( !v25 )
goto LABEL_55;
}
v53 = (1 << v25) - 1;
}
else
{
v53 = 1 << v51;
}
_InterlockedOr(v52, v53);
}
LABEL_55:
if( v44 )
KeReleaseInStackQueuedSpinLockFromDpcLevel((_KLOCK_QUEUE_HANDLE *)&LockHandle);
if( v71 == 1 )
MiInsertPageInList(v22, 8ui64);
LABEL_23:
v21 = v62;
LABEL_24:
_InterlockedAnd64((volatile signed __int64 *)v22 + 3, 0x7FFFFFFFFFFFFFFFui64);
if( !v28 )
{
LABEL_25:
v19 = v59;
v15 += 8i64;
v9 = v64;
v18 = v60;
goto LABEL_26;
}
v50 = (INT64)Partition;
v49 = v28;
LABEL_84:
MiReleasePageFileInfo(v50, v49, 1, v25, v56, v57, (INT64)Partition, (INT64)v59, v60, v61, v62, v63);
goto LABEL_25;
}
}
else if( (unsigned int)MiUnlinkPageFromList(v22, 0i64) )
{
v29 = (UINT64 *)((char *)v22 + 16);
v30 = MiCapturePageFileInfoInline((UINT64 *)v22 + 2, 0i64, 0i64);
v31 = *((_QWORD *)v22 + 2);
v28 = v30;
if( (v31 & 2) != 0 )
{
v42 = *((_QWORD *)Partition + ((unsigned __int16)v31 >> 12) + 868);
if( qword_140C4DC80 && (v31 & 0x10) == 0 )
v31 &= ~qword_140C4DC80;
v32 = MiTransferSoftwarePte(*v29, v42, HIDWORD(v31));
}
else
{
v61 = *v29;
MiSetNonResidentPteHeat(&v61, 0i64);
v32 = v61;
if( (v33 & 0x400) == 0 )
{
v32 = v61 & 0xFFFFFFFFFFFFFFF9ui64;
v61 &= 0xFFFFFFFFFFFFFFF9ui64;
}
}
v34 = (volatile signed __int64 *)((char *)MmGetPfnDb() + 48 * (*((_QWORD *)v22 + 5) & 0xFFFFFFFFFi64));
v71 = 0;
*(_QWORD *)v15 = v32;
MiLockNestedPageAtDpcInline((INT64)v34);
MiDecrementShareCount((UINT64)v34);
_InterlockedAnd64(v34 + 3, 0x7FFFFFFFFFFFFFFFui64);
MiInsertPageInFreeOrZeroedList(v27, 2ui64);
goto LABEL_23;
}
MiDiscardTransitionPteEx((UINT64)v22, 0i64);
_InterlockedAnd64((volatile signed __int64 *)v22 + 3, 0x7FFFFFFFFFFFFFFFui64);
v19 = v59;
v15 += 8i64;
v9 = v64;
v16 = v56;
v18 = v60;
v20 = v57;
v17 = v70;
}
else
{
v59 = MiLockProtoPoolPage((_MMPTE *)v15, (UINT8 *)&PageIrql);
v19 = v59;
if( v59 )
{
v57 = v15;
goto LABEL_9;
}
v15 = (v15 & 0xFFFFFFFFFFFFF000ui64) + 4096;
LABEL_26:
v16 = v56;
v20 = v57;
v17 = v70;
}
}
while( PagefileSubsection != v9 )
{
PagefileSubsection = (unsigned int *)*((_QWORD *)PagefileSubsection + 2);
if( *((_QWORD *)PagefileSubsection + 1) )
{
v15 = *((_QWORD *)PagefileSubsection + 1);
if( PagefileSubsection == v9 )
{
v16 = *((_QWORD *)v9 + 1) + 8 * v67;
v48 = v16;
if( !v17 )
v48 = v21;
v21 = v48;
v62 = v48;
}
else
{
v16 = v15 + 8i64 * PagefileSubsection[11];
}
v56 = v16;
goto LABEL_7;
}
}
if( v19 )
{
LOBYTE(v16) = PageIrql;
MiUnlockProtoPoolPage(v19, v16);
}
}Referenced by:
MiZeroCfgSystemWideBitmap