KdInitSystem

UINT8 __fastcall KdInitSystem(UINT64 Phase, _LOADER_PARAMETER_BLOCK *LoaderBlock){
  char v3; 
  char v4; 
  char v6; 
  __int64 v7; 
  struct _KPRCB *CurrentPrcb; 
  char *v9; 
  char v10; 
  CHAR *v11; 
  __int64 v12; 
  unsigned int v13; 
  CHAR *v14; 
  CHAR *v15; 
  const INT8 *v16; 
  unsigned __int64 v17; 
  __int64 v18; 
  INT8 *j; 
  INT8 *v20; 
  __int64 v21; 
  unsigned int v22; 
  __int64 **k; 
  __int64 v24; 
  char *v25; 
  unsigned int v26; 
  char v27; 
  __int64 v28; 
  unsigned int i; 
  VOID *PoolWithTag; 
  __int64 v31; 
  int v32[8]; 
  struct _STRING DestinationString; 
  char SourceString[256]; 
  v3 = 0;
  v4 = 0;
  if( (_DWORD)Phase == -1 )
  {
    if( (*(_DWORD *)(*((_QWORD *)LoaderBlock + 30) + 132i64) & 8) != 0 )
      __debugbreak();
  }
  else
  {
    if( (_DWORD)Phase )
    {
      KeQueryPerformanceCounter(&KdPerformanceCounterRate);
      if( !KdPitchDebugger )
      {
        for( i = 0; i < (unsigned int)KeNumberProcessors_0; ++i )
        {
          PoolWithTag = ExAllocatePoolWithTag(NonPagedPoolNx, 0x1000ui64, 0x6F49644Bui64);
          v31 = (__int64)PoolWithTag;
          if( PoolWithTag )
          {
            memset((INT64)PoolWithTag, 0i64);
            _InterlockedOr(v32, 0);
            KdLogBuffer[i] = v31;
          }
        }
      }
      KdpLoaderDebuggerBlock = 0i64;
      return 1;
    }
    if( (_BYTE)KdDebuggerEnabled )
      goto LABEL_31;
    KdpDebugRoutineSelect = 0;
    BYTE1(KdDebuggerEnabled) = 0;
    if( !KdPitchDebugger || (v6 = 1, !*(_BYTE *)KdLocalDebugEnabled) )
      v6 = 0;
    if( KdDebugDevice && *(_DWORD *)(KdDebugDevice + 236) == 3 )
      KdTransportMaxPacketSize = 1152;
    if( !KdpDebuggerDataListHead )
    {
      *(&KdpContext + 1) = KdDebugDevice;
      qword_140C00C90 = (__int64)MmGetPagedPoolCommitPointer();
      KdpPowerSpinLock = 0i64;
      qword_140C40598 = (__int64)&KdpPowerListHead;
      KdpPowerListHead = (__int64)&KdpPowerListHead;
      qword_140C40578 = (__int64)&KdpDebuggerDataListHead;
      KdpDebuggerDataListHead = (__int64)&KdpDebuggerDataListHead;
      KdRegisterDebuggerDataBlock(v7, (__int64)&KdDebuggerDataBlock);
      WORD1(KdVersionBlock) = NtBuildNumber;
      WORD3(KdVersionBlock) |= 1u;
      LOWORD(KdVersionBlock) = (unsigned int)NtBuildNumber >> 28;
      *((_QWORD *)&xmmword_140C0F398 + 1) = &PsLoadedModuleList;
      *(_WORD *)((char *)&KdVersionBlock + 11) = 13059;
      qword_140C0F3A8 = (__int64)&KdpDebuggerDataListHead;
    }
    CurrentPrcb = KeGetCurrentPrcb();
    if( !*((_QWORD *)CurrentPrcb + 4280) )
    {
      *((_DWORD *)CurrentPrcb + 8562) = 1048587;
      *((_QWORD *)CurrentPrcb + 4280) = (char *)CurrentPrcb + 496;
    }
    if( LoaderBlock )
    {
      CurrentPrcb = *(struct _KPRCB **)(*((_QWORD *)LoaderBlock + 2) + 48i64);
      off_140C00DF8 = &KdpLoaderDebuggerBlock;
      KdpLoaderDebuggerBlock = (__int64)LoaderBlock + 16;
      v9 = (char *)*((_QWORD *)LoaderBlock + 27);
      *(_QWORD *)&xmmword_140C0F398 = CurrentPrcb;
      if( v9 )
      {
        strupr(v9);
        LODWORD(KdPrintBufferAllocateSize) = 0;
        v10 = 0;
        v11 = strstr(v9, "DBGPRINT_LOG_SIZE=");
        if( v11 )
        {
          v13 = (atol(v11 + 18) + 4095) & 0xFFFFF000;
          LODWORD(KdPrintBufferAllocateSize) = v13;
          if( v13 > 0x1000000 )
          {
            LODWORD(KdPrintBufferAllocateSize) = 0x1000000;
            v13 = 0x1000000;
          }
          if( v13 <= 0x1000 )
            LODWORD(KdPrintBufferAllocateSize) = 0;
        }
        if( strstr(v9, "NODEBUG") )
        {
          KdPitchDebugger = 1;
          KdPageDebuggerSection = 1;
          KdpBootedNodebug = 1;
        }
        else if( strstr(v9, "DEBUGPORT=LOCAL") )
        {
          KdPitchDebugger = 1;
          v6 = 1;
          KdPageDebuggerSection = 1;
          LOBYTE(KdDebuggerNotPresent) = 1;
          *(_BYTE *)KdLocalDebugEnabled = 1;
          KdpBootedNodebug = 0;
        }
        else
        {
          v14 = v9;
          do
          {
            v15 = strstr(v14, " DEBUG=");
            if( !v15 )
            {
              v15 = strstr(v14, " DEBUG");
              if( !v15 )
                break;
            }
            v14 = v15 + 6;
            v17 = v15[6];
            if( (unsigned __int8)v17 <= 0x3Du )
            {
              v18 = 0x2000000100000001i64;
              if( _bittest64(&v18, v17) )
              {
                KdpBootedNodebug = 0;
                v10 = 1;
                if( v15[6] == 61 )
                {
                  for( j = v15 + 7; ; j = v20 + 1 )
                  {
                    LOBYTE(v17) = *j;
                    v20 = j;
                    while( (_BYTE)v17 )
                    {
                      if( (unsigned __int8)v17 <= 0x2Cu )
                      {
                        v21 = 0x100100000200i64;
                        if( _bittest64(&v21, v17) )
                          break;
                      }
                      LOBYTE(v17) = *++v20;
                    }
                    v17 = (unsigned int)((_DWORD)v20 - (_DWORD)j);
                    if( (_DWORD)v20 == (_DWORD)j )
                      break;
                    switch( (_DWORD)v17 )
                    {
                      case 0xA:
                        v17 = strncmp(j, (size_t)"AUTOENABLE", 0xAui64, v16, *(va_list *)&DestinationString.Length);
                        if( !(_DWORD)v17 )
                        {
                          v3 = 1;
                          KdAutoEnableOnEvent = 1;
                          v4 = 0;
                        }
                        break;
                      case 7:
                        v17 = strncmp(j, (size_t)"DISABLE", 7ui64, v16, *(va_list *)&DestinationString.Length);
                        if( !(_DWORD)v17 )
                        {
                          v3 = 1;
                          KdAutoEnableOnEvent = 0;
                          v4 = 1;
                        }
                        break;
                      case 6:
                        v17 = strncmp(j, (size_t)"NOUMEX", 6ui64, v16, *(va_list *)&DestinationString.Length);
                        if( !(_DWORD)v17 )
                          KdIgnoreUmExceptions = 1;
                        break;
                    }
                    if( *v20 != 44 )
                      break;
                  }
                }
                break;
              }
            }
          }
          while( v15 != (CHAR *)-6i64 );
        }
        if( strstr(v9, "NOEVENT") )
        {
          KdEventLoggingEnabled = 0;
        }
        else if( strstr(v9, "EVENT") )
        {
          KdEventLoggingEnabled = 1;
          v10 = 1;
          KdPageDebuggerSection = 0;
        }
      }
      else
      {
        KdPitchDebugger = 1;
        v10 = 0;
        KdPageDebuggerSection = 1;
      }
    }
    else
    {
      v10 = 1;
      *(_QWORD *)&xmmword_140C0F398 = PsNtosImageBase;
    }
    ImageBase = (PVOID)xmmword_140C0F398;
    if( !v6 )
    {
      if( LoaderBlock && *((_DWORD *)LoaderBlock + 3) != 1 )
        v10 = 0;
      if( !v10 )
      {
        LOBYTE(KdDebuggerNotPresent) = 1;
        goto LABEL_31;
      }
      if( (int)KdInitialize(0i64, LoaderBlock, &KdpContext) < 0 )
      {
        KdPitchDebugger = 0;
        v10 = 0;
        LOBYTE(KdDebuggerNotPresent) = 1;
        *(_BYTE *)KdLocalDebugEnabled = 1;
      }
      else
      {
        KdpDebugRoutineSelect = 1;
      }
    }
    if( !KdpDebuggerStructuresInitialized )
    {
      BYTE4(KdpContext) = 0;
      LODWORD(KdpContext) = 20;
      KeInitializeDpc(&KdpTimeSlipDpc, (PKDEFERRED_ROUTINE)KdpTimeSlipDpcRoutine, 0i64);
      KeInitializeTimerEx((PKTIMER)KdpTimeSlipTimer, NotificationTimer);
      KdpTimeSlipWorkItem.Parameter = 0i64;
      KdpTimeSlipWorkItem.WorkerRoutine = KdpTimeSlipWork;
      KdpTimeSlipWorkItem.List.Flink = 0i64;
      KdpDebuggerStructuresInitialized = 1;
    }
    KdTimerStart = 0i64;
    if( KdEventLoggingEnabled && KdpBootedNodebug )
    {
      KdPitchDebugger = 1;
      KdEventLoggingPresent = v10;
      LOBYTE(KdDebuggerNotPresent) = 1;
      *(_BYTE *)KdLocalDebugEnabled = 0;
    }
    else
    {
      LOBYTE(KdDebuggerEnabled) = 1;
      KUSER_SHARED_DATA.KdDebuggerEnabled = 1;
      if( *(_BYTE *)KdLocalDebugEnabled )
        goto LABEL_31;
    }
    if( KdEventLoggingEnabled && !(_BYTE)KdDebuggerEnabled )
    {
LABEL_31:
      if( LoaderBlock )
      {
        v12 = *((_QWORD *)LoaderBlock + 30);
        if( v12 )
          memset((void *)(v12 + 2464), 0, 0x20ui64);
      }
      return 1;
    }
    KdPitchDebugger = 0;
    if( v3 )
    {
      KdDisableDebuggerWithLock((UINT8)CurrentPrcb);
      KdBlockEnable = v4;
      goto LABEL_31;
    }
    if( LoaderBlock )
    {
      v22 = 0;
      for( k = (__int64 **)*((_QWORD *)LoaderBlock + 2); k != (__int64 **)((char *)LoaderBlock + 16); ++v22 )
      {
        if( v22 >= 3 )
          break;
        DestinationString = 0i64;
        LODWORD(v24) = 0;
        v25 = (char *)k[10];
        v26 = *((unsigned __int16 *)k + 36) >> 1;
        if( v26 >= 0x100 )
          v26 = 255;
        do
        {
          v27 = *v25;
          v25 += 2;
          v28 = (unsigned int)v24;
          v24 = (unsigned int)(v24 + 1);
          SourceString[v28] = v27;
        }
        while( (unsigned int)v24 < v26 );
        if( (unsigned int)v24 >= 0x100ui64 )
          _report_rangecheckfailure();
        SourceString[v24] = 0;
        RtlInitAnsiString(&DestinationString, SourceString, v26);
        DbgLoadImageSymbols(&DestinationString, k[6], 0xFFFFFFFFui64);
        k = (__int64 **)*k;
      }
    }
    else
    {
      DbgLoadImageSymbols(0i64, ImageBase, 0xFFFFFFFFui64);
    }
    if( LoaderBlock )
    {
      BYTE1(KdDebuggerEnabled) = KdPollBreakIn();
      goto LABEL_31;
    }
  }
  return 1;
}

Referenced by:

KdEnableDebuggerWithLock
KeEnterKernelDebugger
KiSetFeatureBits
KiSetProcessorSignature
KiSystemStartup
Phase1InitializationDiscard
PopHiberCheckResume