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