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