PnprMirrorMarkedPages
INT64 __fastcall PnprMirrorMarkedPages(INT64 a1, INT64 a2, UINT8 *a3){
__int64 v3;
unsigned int v4;
bool v5;
UINT64 v6;
UINT64 v7;
RTL_BITMAP *v8;
unsigned int i;
int v10;
UINT8 v11;
UINT64 v12;
unsigned int v13;
unsigned int v14;
unsigned int v15;
int v16;
int v17;
struct _KLOCK_QUEUE_HANDLE LockHandle;
UINT64 StartingIndex;
__int64(__fastcall *v21)(_QWORD, _QWORD, unsigned __int64);
LODWORD(StartingIndex) = 0;
v4 = 0;
memset(&LockHandle, 0, sizeof(LockHandle));
LODWORD(v3) = *((_DWORD *)KeGetPcr() + 105);
if( *(_QWORD *)(*(_QWORD *)(PnprContext + 136) + 24 * v3) )
{
v5 = (_DWORD)v3 == *(_DWORD *)(PnprContext + 180);
v21 = *(__int64(__fastcall **)(_QWORD, _QWORD, unsigned __int64))(PnprContext + 20928);
do
{
v6 = PnprContext;
v7 = PnprContext + 152;
v8 = *(RTL_BITMAP **)(PnprContext + 152);
while( 2 )
{
if( v8 != (RTL_BITMAP *)v7 )
{
KeAcquireInStackQueuedSpinLockAtDpcLevel((UINT64 *)(v6 + 168), &LockHandle, (UINT8)a3);
for( i = RtlFindFirstRunClear(v8 + 2, &StartingIndex);
;
i = RtlFindNextForwardRunClear(v8 + 2, v13, &StartingIndex) )
{
v14 = StartingIndex;
v15 = i;
if( i )
{
if( i >= 0x140 )
v15 = 320;
RtlSetBits(v8 + 2, (unsigned int)StartingIndex, v15);
}
KeReleaseInStackQueuedSpinLockFromDpcLevel(&LockHandle);
if( !v15 )
break;
v10 = v21(
*(_QWORD *)(PnprContext + 20880),
(*(_QWORD *)&v8[1].SizeOfBitMap + v14) << 12,
(unsigned __int64)v15 << 12);
v12 = PnprContext;
v4 = v10;
if( v10 < 0 )
{
v16 = *(_DWORD *)(PnprContext + 20984);
if( !v16 )
v16 = 3568;
*(_DWORD *)(PnprContext + 20984) = v16;
v17 = *(_DWORD *)(v12 + 20988);
if( !v17 )
v17 = 8;
*(_DWORD *)(v12 + 20988) = v17;
goto LABEL_24;
}
v13 = v15 + v14;
LODWORD(StartingIndex) = v13;
KeAcquireInStackQueuedSpinLockAtDpcLevel((UINT64 *)(PnprContext + 168), &LockHandle, v11);
}
if( *(_DWORD *)(PnprContext + 200) != 3 )
{
v6 = PnprContext;
v8 = *(RTL_BITMAP **)&v8->SizeOfBitMap;
v7 = PnprContext + 152;
continue;
}
v5 = 1;
}
break;
}
}
while( !v5 );
}
LABEL_24:
if( (_DWORD)v3 != *(_DWORD *)(PnprContext + 180) && *(int *)(PnprContext + 200) < 3 )
{
do
_mm_pause();
while( *(int *)(PnprContext + 200) < 3 );
}
return v4;
}Referenced by:
PnprQuiesceProcessorDpc
PnprSwap