KiQueryProcessorNode
VOID __fastcall KiQueryProcessorNode(UINT64 ProcIndex, UINT64 *Identifier, UINT16 *Node){
unsigned int v3;
__int64 v6;
NTSTATUS ProcessorNode;
NTSTATUS FirstAvailableNode;
UINT64 v9;
_HVLP_LPCB *LpcbByLpIndex;
unsigned int v11;
v3 = ProcIndex;
if( (unsigned int)ProcIndex < (unsigned int)KeNumberProcessors_0 )
{
_mm_lfence();
*Node = (*(&KiProcessorBlock + (unsigned int)ProcIndex))->ParentNode->Affinity.Reserved[0];
return;
}
v6 = *Node;
if( !KiNumaQueryProcessorNode )
{
if( (unsigned int)ProcIndex >= KiMaximumGroupSize )
return;
*Node = 0;
goto LABEL_17;
}
ProcessorNode = KiNumaQueryProcessorNode((unsigned int)ProcIndex);
FirstAvailableNode = ProcessorNode;
if( ProcessorNode )
{
if( ProcessorNode != -1073741275 )
goto LABEL_6;
if( (_WORD)v6 == 0xFFFF || KiIsNodeFull((_KNODE *)KeNodeBlock[v6]) )
return;
*Node = v6;
LABEL_17:
FirstAvailableNode = 0;
LABEL_6:
if( FirstAvailableNode )
return;
goto LABEL_7;
}
if( *Node == 0xFFFF )
{
FirstAvailableNode = KiFindFirstAvailableNode(Node);
goto LABEL_6;
}
LABEL_7:
v9 = *(unsigned int *)Identifier;
if( (_DWORD)v9 == -1 )
{
*(_DWORD *)Identifier = -1;
v9 = 0xFFFFFFFFi64;
if( (HvlpFlags & 2) != 0 )
{
LpcbByLpIndex = HvlpGetLpcbByLpIndex(v3);
v9 = v11;
if( LpcbByLpIndex )
{
v9 = (unsigned int)LpcbByLpIndex[2];
*(_DWORD *)Identifier = v9;
}
}
}
if( (HvlpFlags & 2) != 0 )
HvlpGetLpcbByApicId(v9);
}Referenced by:
KeStartAllProcessors
KiStartDynamicProcessor