KiQueryProcessorNode
NTSTATUS __stdcall KiQueryProcessorNode(UINT64 ProcIndex, UINT64 *Identifier, UINT16 *Node){
unsigned int v3;
__int64 v6;
NTSTATUS ProcessorNode;
NTSTATUS FirstAvailableNode;
int v9;
WCHAR *LpcbByLpIndex;
int v12;
WCHAR *LpcbByApicId;
v3 = ProcIndex;
if( (unsigned int)ProcIndex >= (unsigned int)KeNumberProcessors_0 )
{
v6 = *Node;
if( KiNumaQueryProcessorNode )
{
ProcessorNode = KiNumaQueryProcessorNode((unsigned int)ProcIndex);
FirstAvailableNode = ProcessorNode;
if( !ProcessorNode )
{
if( *Node != 0xFFFF )
{
LABEL_7:
v9 = *(_DWORD *)Identifier;
if( (*(_BYTE *)(*((_QWORD *)&KeNodeBlock + *Node) + 181i64) & 2) == 0 )
FirstAvailableNode = -1073741275;
if( v9 == -1 )
{
*(_DWORD *)Identifier = -1;
v9 = -1;
if( (HvlpFlags & 2) != 0 )
{
LpcbByLpIndex = HvlpGetLpcbByLpIndex(v3);
v9 = v12;
if( LpcbByLpIndex )
{
v9 = *((_DWORD *)LpcbByLpIndex + 2);
*(_DWORD *)Identifier = v9;
}
}
}
if( (HvlpFlags & 2) == 0 )
return FirstAvailableNode;
LpcbByApicId = HvlpGetLpcbByApicId(v9);
if( LpcbByApicId )
{
if( *((_DWORD *)LpcbByApicId + 12) )
return FirstAvailableNode;
}
return -1073741275;
}
FirstAvailableNode = KiFindFirstAvailableNode(Node);
LABEL_6:
if( FirstAvailableNode )
return FirstAvailableNode;
goto LABEL_7;
}
if( ProcessorNode != -1073741275 )
goto LABEL_6;
if( (_WORD)v6 == 0xFFFF || KiIsNodeFull(*((_QWORD *)&KeNodeBlock + v6)) )
return FirstAvailableNode;
*Node = v6;
}
else
{
if( (unsigned int)ProcIndex >= KiMaximumGroupSize )
return -1073741275;
*Node = 0;
}
FirstAvailableNode = 0;
goto LABEL_6;
}
_mm_lfence();
*Node = *(_WORD *)(*((_QWORD *)*(&KiProcessorBlock + (unsigned int)ProcIndex) + 24) + 146i64);
return 0;
}Referenced by:
KeStartAllProcessors
KiStartDynamicProcessor