HalpDpReplaceControl

INT64 __fastcall HalpDpReplaceControl(INT64 a1, INT64 a2, INT64 a3){
  int v3; 
  unsigned int v4; 
  int v6; 
  int v7; 
  unsigned int v8; 
  int v9; 
  int v10; 
  unsigned int v11; 
  __int64 v12; 
  __int64 v13; 
  unsigned int v14; 
  int v15; 
  __int64 v16; 
  __int64 v17; 
  __int64 v18; 
  unsigned int v19; 
  v3 = *(_DWORD *)a2;
  v4 = 0;
  if( (_DWORD)a1 )
  {
    v6 = a1 - 1;
    if( v6 )
    {
      v7 = v6 - 1;
      if( v7 )
      {
        if( v7 == 1 )
        {
          *(_BYTE *)(a2 + 68) = 1;
          if( v3 )
          {
            v8 = 0;
            _InterlockedIncrement((volatile signed __int32 *)(a2 + 48));
            v9 = *(_DWORD *)(a2 + 48);
            v10 = v3 + 1;
            while( v9 < v10 )
            {
              if( (++v8 & dword_140C4A13C) != 0 || !qword_140C4A140 )
                _mm_pause();
              else
                qword_140C4A140(v8, a2, a3);
              v9 = *(_DWORD *)(a2 + 48);
            }
            v11 = 0;
            _InterlockedIncrement((volatile signed __int32 *)(a2 + 52));
            while( *(_DWORD *)(a2 + 52) < v10 )
            {
              if( (++v11 & dword_140C4A13C) != 0 || !qword_140C4A140 )
                _mm_pause();
              else
                qword_140C4A140(v11, a2, a3);
            }
          }
        }
      }
      else
      {
        HalpDpPostReplace(a2, a2, a3);
      }
    }
    else if( v3 )
    {
      *(LARGE_INTEGER *)(a2 + 80) = KeQueryPerformanceCounter((PLARGE_INTEGER)(a2 + 72));
      v14 = 0;
      _InterlockedIncrement((volatile signed __int32 *)(a2 + 48));
      v15 = v3 + 1;
      while( *(_DWORD *)(a2 + 48) < v15 )
      {
        if( (++v14 & dword_140C4A13C) != 0 || !qword_140C4A140 )
          _mm_pause();
        else
          qword_140C4A140(v14, v12, v13);
      }
      while( *(_DWORD *)(a2 + 56) < v3 )
        _mm_pause();
      v16 = 0i64;
      for( *(LARGE_INTEGER *)(a2 + 96) = KeQueryPerformanceCounter(0i64);
            (unsigned int)v16 < *(_DWORD *)a2;
            v16 = (unsigned int)(v16 + 1) )
      {
        HalpDpStartProcessor((PVOID)*(unsigned int *)(*(_QWORD *)(a2 + 24) + 4 * v16));
      }
      *(LARGE_INTEGER *)(a2 + 112) = KeQueryPerformanceCounter(0i64);
      if( !*(_BYTE *)(a2 + 44) )
        v4 = HalpInterruptSwapProcessorIdentifiers(*(PVOID *)(a2 + 8));
      v19 = 0;
      _InterlockedIncrement((volatile signed __int32 *)(a2 + 52));
      while( *(_DWORD *)(a2 + 52) < v15 )
      {
        if( (++v19 & dword_140C4A13C) != 0 || !qword_140C4A140 )
          _mm_pause();
        else
          qword_140C4A140(v19, v17, v18);
      }
    }
  }
  else
  {
    HalpDpPreReplace(a2);
  }
  return v4;
}

Referenced by:

No references.