KiSynchNumaCounterSetCallback
NTSTATUS __stdcall KiSynchNumaCounterSetCallback(PCW_CALLBACK_TYPE Type, PCW_CALLBACK_INFORMATION *Info, VOID *Context){
__int32 v5;
__int32 v6;
struct _PCW_BUFFER *Buffer;
unsigned int v8;
bool i;
__int64 v10;
unsigned __int64 v11;
unsigned __int16 v12;
int v13;
int v14;
_SYNCH_COUNTERS *p_SynchCounters;
_SYNCH_COUNTERS *v16;
NTSTATUS result;
UINT64 ProcIndex;
_UNICODE_STRING DestinationString;
_PCW_DATA v20;
_KAFFINITY_ENUMERATION_CONTEXT Contexta;
_PCW_DATA Data;
_SYNCH_COUNTERS SumProcInfo;
_SYNCH_COUNTERS v24;
WCHAR pszDest[12];
memset(&Contexta, 0, sizeof(Contexta));
memset(&SumProcInfo, 0i64, sizeof(SumProcInfo));
memset(&v24, 0i64, sizeof(v24));
LODWORD(ProcIndex) = 0;
DestinationString = 0i64;
if( Type == PcwCallbackAddCounter )
{
EtwReferenceSpinLockCounters();
return 0;
}
v5 = Type - 1;
if( !v5 )
{
EtwDereferenceSpinLockCounters();
return 0;
}
v6 = v5 - 1;
if( v6 && v6 != 1 )
return 0;
Buffer = Info->EnumerateInstances.Buffer;
v8 = 0;
for( i = KeNumberNodes != 0; i; i = v8 < (unsigned __int16)KeNumberNodes )
{
v10 = KeNodeBlock[v8];
v11 = *(_QWORD *)(v10 + 136);
if( v11 )
{
v12 = *(_WORD *)(v10 + 144);
memset(&SumProcInfo, 0i64, sizeof(SumProcInfo));
Contexta.CurrentMask = v11;
v13 = 0;
Contexta.CurrentIndex = v12;
Contexta.Affinity = 0i64;
while( 1 )
{
KeEnumerateNextProcessor(&ProcIndex, &Contexta);
if( v14 )
break;
p_SynchCounters = &(*(&KiProcessorBlock + (unsigned int)ProcIndex))->SynchCounters;
KiAddSynchCounters(&SumProcInfo, p_SynchCounters);
KiAddSynchCounters(&v24, v16);
RtlStringCbPrintfW(pszDest, 0x16ui64, (WCHAR *)&stru_1407D2340._Xmm15);
RtlInitUnicodeString(&DestinationString, pszDest);
Data.Data = p_SynchCounters;
Data.Size = 184;
result = PcwAddInstance(Buffer, &DestinationString, (unsigned int)ProcIndex, 1ui64, &Data);
if( result < 0 )
return result;
++v13;
}
RtlStringCbPrintfW(pszDest, 0x16ui64, (WCHAR *)&stru_1407D2340.TrapFrame);
RtlInitUnicodeString(&DestinationString, pszDest);
v20.Data = &SumProcInfo;
v20.Size = 184;
result = PcwAddInstance(Buffer, &DestinationString, v8 + (unsigned int)KeMaximumProcessors, 1ui64, &v20);
if( result < 0 )
return result;
}
++v8;
}
RtlStringCbPrintfW(pszDest, 0x16ui64, (WCHAR *)&stru_1407D2340._MxCsr);
RtlInitUnicodeString(&DestinationString, pszDest);
v20.Data = &v24;
v20.Size = 184;
return PcwAddInstance(
Buffer,
&DestinationString,
(unsigned int)KeMaximumProcessors + (unsigned __int16)KeNumberNodes,
1ui64,
&v20);
}Referenced by:
No references.