HalpDpStartProcessor

NTSTATUS __stdcall HalpDpStartProcessor(PVOID BugCheckParameter2){
  _DWORD *v1; 
  __int64 v2; 
  unsigned int v3; 
  unsigned int v4; 
  __int64 v5; 
  unsigned int v6; 
  __int64 v7; 
  _DWORD *v8; 
  unsigned __int64 MaximumRegisteredProcessorCount; 
  unsigned int v10; 
  NTSTATUS result; 
  UINT64 Id; 

  v4 = 0;
  v5 = (unsigned int)BugCheckParameter2;
  LODWORD(Id) = 0;
  v6 = v3;
  v7 = v2;
  v8 = v1;
  MaximumRegisteredProcessorCount = (unsigned int)HalpQueryMaximumRegisteredProcessorCount();
  dword_140C49D18 = *((_DWORD *)qword_140C49D10 + 2 * v5 + 1);
  if( (int)HalGetProcessorIdByNtNumber((unsigned int)v5, &Id) < 0 )
    KeBugCheckEx(
      0x5Cu,
      (PVOID)0x2001,
      (PVOID)(unsigned int)v5,
      (PVOID)(unsigned int)MaximumRegisteredProcessorCount,
      0i64);
  v10 = 0;
  if( v6 )
  {
    while( *v8 != (_DWORD)Id )
    {
      ++v10;
      ++v8;
      if( v10 >= v6 )
        goto LABEL_8;
    }
    v4 = *(_DWORD *)(v7 + 4i64 * v10);
  }
LABEL_8:
  if( v10 == v6 )
    KeBugCheckEx(0x5Cu, (PVOID)0x2001, (PVOID)(unsigned int)v5, (PVOID)(unsigned int)Id, (PVOID)1);
  LOBYTE(result) = HalpInterruptStartProcessor(
                     (unsigned int)v5,
                     v4,
                     3ui64,
                     (_KPROCESSOR_STATE *)Memory + (unsigned int)v5);
  if( result != 4 )
    KeBugCheckEx(0x5Cu, (PVOID)0x2001, (PVOID)(unsigned int)v5, (PVOID)MaximumRegisteredProcessorCount, (PVOID)2);
  return result;
}

Referenced by:

HalpDpReplaceControl