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