HalpInterruptGetNextProcessorLocalId

NTSTATUS __stdcall HalpInterruptGetNextProcessorLocalId(INT64 Flags, UINT64 *LocalId){
  char v3; 
  __int64 v4; 
  ULONG_PTR v5; 
  unsigned int MaximumRegisteredProcessorCount; 
  unsigned int v7; 
  __int64 v8; 
  unsigned int v9; 
  NTSTATUS v10; 
  unsigned int v12; 
  __int64 v13; 
  unsigned int v14; 
  _BYTE *v15; 
  int v16; 
  int v17; 
  __int64 i; 
  __int128 v19; 
  v3 = Flags;
  v4 = 0i64;
  v5 = 0i64;
  MaximumRegisteredProcessorCount = HalpQueryMaximumRegisteredProcessorCount(Flags);
  v7 = MaximumRegisteredProcessorCount;
  if( (v3 & 1) != 0 )
  {
    v12 = 0;
    if( MaximumRegisteredProcessorCount )
    {
      v13 = HalpInterruptDynamicProcessorState;
      do
      {
        v5 = v13;
        if( !*(_BYTE *)(v13 + 12) )
          break;
        if( *(_DWORD *)v13 == *(_DWORD *)LocalId )
          v4 = v13;
        ++v12;
        v13 += 64i64;
      }
      while( v12 < MaximumRegisteredProcessorCount );
    }
  }
  if( *(_DWORD *)LocalId == -1 )
  {
    if( (v3 & 1) != 0 )
    {
      return -1073741811;
    }
    else
    {
      v14 = 0;
      if( (_DWORD)HalpInterruptProcessorCount )
      {
        v15 = (_BYTE *)(HalpInterruptProcessorState + 56);
        do
        {
          v5 = (ULONG_PTR)(v15 - 56);
          if( !*(v15 - 44) && !*v15 )
            break;
          ++v14;
          v15 += 64;
        }
        while( v14 < (unsigned int)HalpInterruptProcessorCount );
      }
      if( v14 != (_DWORD)HalpInterruptProcessorCount )
      {
        v16 = *(_DWORD *)v5;
        v10 = 0;
        *(_BYTE *)(v5 + 12) = 1;
        *(_DWORD *)LocalId = v16;
        return v10;
      }
      return -1073741275;
    }
  }
  else
  {
    v8 = (unsigned int)HalpInterruptProcessorCount;
    v9 = 0;
    v10 = -1073741275;
    if( (_DWORD)HalpInterruptProcessorCount )
    {
      while( 1 )
      {
        v5 = HalpInterruptProcessorState + ((unsigned __int64)v9 << 6);
        if( *(_DWORD *)v5 == *(_DWORD *)LocalId )
          break;
        if( ++v9 >= (unsigned int)HalpInterruptProcessorCount )
          goto LABEL_9;
      }
      if( *(_BYTE *)(v5 + 12) )
        return -1073740024;
      *(_BYTE *)(v5 + 12) = 1;
      v10 = 0;
    }
LABEL_9:
    if( (v3 & 2) == 0 )
    {
      if( v10 != -1073741275 )
        goto LABEL_11;
      if( (v3 & 1) != 0 )
      {
        v5 = HalpInterruptProcessorState + (v8 << 6);
        *(_BYTE *)(v5 + 12) = 1;
        *(_DWORD *)v5 = *(_DWORD *)LocalId;
        *(_DWORD *)(v5 + 8) = *(_DWORD *)LocalId;
        if( v4 )
          *(_DWORD *)(v5 + 8) = *(_DWORD *)(v4 + 8);
        LODWORD(HalpInterruptProcessorCount) = v8 + 1;
        v10 = 0;
LABEL_11:
        if( (v3 & 1) != 0 && !v4 )
        {
          v17 = 0;
          if( v7 )
          {
            for( i = HalpInterruptDynamicProcessorState; *(_BYTE *)(i + 12); i += 64i64 )
            {
              if( ++v17 >= v7 )
                return v10;
            }
            v19 = *(_OWORD *)v5;
            ++HalpInterruptDynamicProcessorCount;
            *(_OWORD *)i = v19;
            *(_OWORD *)(i + 16) = *(_OWORD *)(v5 + 16);
            *(_OWORD *)(i + 32) = *(_OWORD *)(v5 + 32);
            *(_OWORD *)(i + 48) = *(_OWORD *)(v5 + 48);
          }
        }
      }
      return v10;
    }
    return 0;
  }
}

Referenced by:

HalpInterruptStartProcessor