KeRegisterProcessorChangeCallback
INT64 *__fastcall KeRegisterProcessorChangeCallback(VOID *a1, VOID *a2, INT8 a3){
unsigned int v5;
INT64 *v7;
unsigned int v9;
_KPRCB **v10;
unsigned int v11;
_KPRCB **v12;
_KPRCB *v13;
int v14;
VOID *v15;
_KPRCB *v16;
NTSTATUS v17;
PCALLBACK_OBJECT CallbackObject;
VOID *v19;
INT64 *v20;
_UNICODE_STRING DestinationString;
_OBJECT_ATTRIBUTES ObjectAttributes;
__int128 v23;
UINT64 Id;
v19 = a2;
*(_QWORD *)&ObjectAttributes.Length = 48i64;
*(_QWORD *)&ObjectAttributes.Attributes = 576i64;
v5 = 0;
LODWORD(Id) = 0;
CallbackObject = 0i64;
DestinationString = 0i64;
v23 = 0i64;
RtlInitUnicodeString(&DestinationString, (PCWSTR)&stru_1407D2340._Rbx);
ObjectAttributes.RootDirectory = 0i64;
ObjectAttributes.ObjectName = &DestinationString;
*(_OWORD *)&ObjectAttributes.SecurityDescriptor = 0i64;
v17 = ExCreateCallback(&CallbackObject, &ObjectAttributes, 0, 0);
if( v17 >= 0 )
{
ExAcquireFastMutex(&KiDynamicProcessorLock);
v7 = (INT64 *)ExRegisterCallback(CallbackObject, (PCALLBACK_FUNCTION)a1, a2);
v20 = v7;
HalPutDmaAdapter((PADAPTER_OBJECT)CallbackObject);
if( !v7 || (a3 & 1) == 0 )
{
LABEL_4:
KeReleaseGuardedMutex(&KiDynamicProcessorLock);
return v7;
}
v9 = KeNumberProcessors_0;
v10 = &KiProcessorBlock;
v11 = 0;
if( (_DWORD)KeNumberProcessors_0 )
{
v12 = &KiProcessorBlock;
while( 1 )
{
v13 = *v12;
*(_QWORD *)((char *)&v23 + 4) = v11;
WORD6(v23) = v13->Group;
BYTE14(v23) = v13->GroupIndex;
HalGetProcessorIdByNtNumber(v11, &Id);
LODWORD(v23) = 0;
v17 = 0;
((void(__fastcall *)(VOID *, __int128 *, NTSTATUS *))a1)(v19, &v23, &v17);
v14 = v17;
if( v17 < 0 )
break;
++v11;
++v12;
if( v11 >= v9 )
goto LABEL_9;
}
}
else
{
v14 = v17;
LABEL_9:
if( v14 >= 0 )
{
LODWORD(v23) = 1;
goto LABEL_11;
}
}
LODWORD(v23) = 2;
ExUnregisterCallback(v7);
v14 = v17;
v7 = 0i64;
v20 = 0i64;
LABEL_11:
DWORD2(v23) = v14;
if( v11 )
{
v15 = v19;
do
{
v16 = *v10;
DWORD1(v23) = v5;
WORD6(v23) = v16->Group;
BYTE14(v23) = v16->GroupIndex;
HalGetProcessorIdByNtNumber(v5, &Id);
((void(__fastcall *)(VOID *, __int128 *, NTSTATUS *))a1)(v15, &v23, &v17);
++v5;
++v10;
}
while( v5 < v11 );
v7 = v20;
}
goto LABEL_4;
}
return 0i64;
}Referenced by:
PoInitSystem