PnprSwap
INT64 __fastcall PnprSwap(INT64 a1, INT64 a2, UINT8 *a3){
INT64 v3;
int v4;
UINT64 v5;
int v6;
int v7;
UINT64 v8;
__int64(__fastcall *v9)(_QWORD, INT64, UINT8 *);
int v10;
int v11;
UINT64 v12;
int v13;
__int64 i;
__int64 v15;
__int64 v16;
__int64 v17;
__int64 v18;
INT64 result;
v3 = PnprContext;
if( *(_DWORD *)(*(_QWORD *)(PnprContext + 24) + 4i64) && (*(_DWORD *)(PnprContext + 64) & 8) == 0 )
{
if( *(int *)(PnprContext + 200) < 2 )
*(_DWORD *)(PnprContext + 200) = 2;
v4 = PnprMirrorMarkedPages(v3, a2, a3);
if( v4 < 0 )
{
v5 = PnprContext;
v6 = *(_DWORD *)(PnprContext + 20984);
if( !v6 )
v6 = 2818;
*(_DWORD *)(PnprContext + 20984) = v6;
v7 = *(_DWORD *)(v5 + 20988);
if( !v7 )
v7 = 1;
*(_DWORD *)(v5 + 20988) = v7;
goto LABEL_34;
}
v8 = PnprContext;
*(_DWORD *)(PnprContext + 204) = 1;
*(_DWORD *)(v8 + 200) = 3;
v3 = PnprContext;
if( *(_DWORD *)(v8 + 204) < *(_DWORD *)(PnprContext + 176) )
{
do
{
_mm_pause();
a2 = *(unsigned int *)(PnprContext + 204);
v3 = PnprContext;
}
while( (int)a2 < *(_DWORD *)(PnprContext + 176) );
}
}
v9 = *(__int64(__fastcall **)(_QWORD, INT64, UINT8 *))(v3 + 20960);
if( v9 && (v4 = v9(*(_QWORD *)(v3 + 20880), a2, a3), v4 < 0) )
{
v5 = PnprContext;
v10 = *(_DWORD *)(PnprContext + 20984);
if( !v10 )
v10 = 2838;
*(_DWORD *)(PnprContext + 20984) = v10;
v11 = *(_DWORD *)(v5 + 20988);
if( !v11 )
v11 = 8;
*(_DWORD *)(v5 + 20988) = v11;
}
else
{
v12 = PnprContext;
*(_DWORD *)(PnprContext + 204) = 1;
*(_DWORD *)(v12 + 200) = 4;
while( *(_DWORD *)(v12 + 204) < *(_DWORD *)(PnprContext + 176) )
{
_mm_pause();
v12 = PnprContext;
}
PnprSwapFinalize();
v5 = PnprContext;
v4 = v13;
if( *(_DWORD *)(*(_QWORD *)(PnprContext + 24) + 4i64) )
{
for( i = 0i64; (unsigned int)i < *(_DWORD *)(PnprContext + 176); i = (unsigned int)(i + 1) )
{
v15 = *(_QWORD *)(v5 + 136) + 24 * i;
if( v15 )
{
v16 = *(_QWORD *)v15;
if( *(_QWORD *)v15 )
{
if( (*(_BYTE *)(v16 + 10) & 1) != 0 )
MmUnmapReservedMapping(*(PVOID *)(v15 + 8), 0x51706E50u, (PMDL)v16);
}
}
v17 = *(_QWORD *)(PnprContext + 144) + 24 * i;
if( v17 )
{
v18 = *(_QWORD *)v17;
if( *(_QWORD *)v17 )
{
if( (*(_BYTE *)(v18 + 10) & 1) != 0 )
MmUnmapReservedMapping(*(PVOID *)(v17 + 8), 0x51706E50u, (PMDL)v18);
}
}
v5 = PnprContext;
}
}
}
LABEL_34:
result = (unsigned int)v4;
*(_DWORD *)(v5 + 200) = 5;
return result;
}Referenced by:
PnprEndMirroring