PnprSwap

__int64 PnprSwap(){
  __int64 v0; 
  int v1; 
  __int64 v2; 
  int v3; 
  int v4; 
  __int64 v5; 
  __int64(__fastcall *v6)(_QWORD); 
  int v7; 
  int v8; 
  __int64 v9; 
  int v10; 
  __int64 i; 
  __int64 v12; 
  INT64 v13; 
  __int64 v14; 
  INT64 v15; 
  __int64 result; 

  v0 = PnprContext;
  if( *(_DWORD *)(*(_QWORD *)(PnprContext + 24) + 4i64) && (*(_DWORD *)(PnprContext + 64) & 8) == 0 )
  {
    if( *(int *)(PnprContext + 200) < 2 )
      *(_DWORD *)(PnprContext + 200) = 2;
    v1 = PnprMirrorMarkedPages();
    if( v1 < 0 )
    {
      v2 = PnprContext;
      v3 = *(_DWORD *)(PnprContext + 20984);
      if( !v3 )
        v3 = 2818;
      *(_DWORD *)(PnprContext + 20984) = v3;
      v4 = *(_DWORD *)(v2 + 20988);
      if( !v4 )
        v4 = 1;
      *(_DWORD *)(v2 + 20988) = v4;
      goto LABEL_34;
    }
    v5 = PnprContext;
    *(_DWORD *)(PnprContext + 204) = 1;
    *(_DWORD *)(v5 + 200) = 3;
    v0 = PnprContext;
    if( *(_DWORD *)(v5 + 204) < *(_DWORD *)(PnprContext + 176) )
    {
      do
      {
        _mm_pause();
        v0 = PnprContext;
      }
      while( *(_DWORD *)(PnprContext + 204) < *(_DWORD *)(PnprContext + 176) );
    }
  }
  v6 = *(__int64(__fastcall **)(_QWORD))(v0 + 20960);
  if( v6 && (v1 = v6(*(_QWORD *)(v0 + 20880)), v1 < 0) )
  {
    v2 = PnprContext;
    v7 = *(_DWORD *)(PnprContext + 20984);
    if( !v7 )
      v7 = 2838;
    *(_DWORD *)(PnprContext + 20984) = v7;
    v8 = *(_DWORD *)(v2 + 20988);
    if( !v8 )
      v8 = 8;
    *(_DWORD *)(v2 + 20988) = v8;
  }
  else
  {
    v9 = PnprContext;
    *(_DWORD *)(PnprContext + 204) = 1;
    *(_DWORD *)(v9 + 200) = 4;
    while( *(_DWORD *)(v9 + 204) < *(_DWORD *)(PnprContext + 176) )
    {
      _mm_pause();
      v9 = PnprContext;
    }
    v10 = PnprSwapFinalize();
    v2 = PnprContext;
    v1 = v10;
    if( *(_DWORD *)(*(_QWORD *)(PnprContext + 24) + 4i64) )
    {
      for( i = 0i64; (unsigned int)i < *(_DWORD *)(PnprContext + 176); i = (unsigned int)(i + 1) )
      {
        v12 = *(_QWORD *)(v2 + 136) + 24 * i;
        if( v12 )
        {
          v13 = *(_QWORD *)v12;
          if( *(_QWORD *)v12 )
          {
            if( (*(_BYTE *)(v13 + 10) & 1) != 0 )
              MmUnmapReservedMapping(*(_QWORD *)(v12 + 8), 0x51706E50ui64, v13);
          }
        }
        v14 = *(_QWORD *)(PnprContext + 144) + 24 * i;
        if( v14 )
        {
          v15 = *(_QWORD *)v14;
          if( *(_QWORD *)v14 )
          {
            if( (*(_BYTE *)(v15 + 10) & 1) != 0 )
              MmUnmapReservedMapping(*(_QWORD *)(v14 + 8), 0x51706E50ui64, v15);
          }
        }
        v2 = PnprContext;
      }
    }
  }
LABEL_34:
  result = (unsigned int)v1;
  *(_DWORD *)(v2 + 200) = 5;
  return result;
}

Referenced by:

PnprEndMirroring
PnprInitiateReplaceOperation