KdInitSystem

UINT8 __stdcall KdInitSystem(UINT64 Phase, _LOADER_PARAMETER_BLOCK *LoaderBlock){
  char v3; 
  char v4; 
  char v6; 
  UINT64 v7; 
  UINT64 v8; 
  _LIST_ENTRY *CurrentPrcb; 
  char *LoadOptions; 
  char v11; 
  CHAR v12; 
  __int64 v13; 
  CHAR v14; 
  CHAR v15; 
  __int64 v16; 
  CHAR v17; 
  __int64 v18; 
  __int64 v19; 
  _LOADER_PARAMETER_EXTENSION *Extension; 
  unsigned int v21; 
  __int64 v22; 
  UINT8 *v23; 
  __int64 v24; 
  __int64 v25; 
  __int64 v26; 
  unsigned __int64 v27; 
  __int64 v28; 
  INT8 *j; 
  INT8 *v30; 
  __int64 v31; 
  unsigned int v32; 
  _LIST_ENTRY *k; 
  __int64 v34; 
  char *Flink; 
  unsigned int v36; 
  char v37; 
  __int64 v38; 
  unsigned int i; 
  VOID **PoolWithTag; 
  VOID **v41; 
  int v42[8]; 
  _STRING DestinationString; 
  char SourceString[256]; 

  v3 = 0;
  v4 = 0;
  if( (_DWORD)Phase == -1 )
  {
    if( (LoaderBlock->Extension->_bf_84 & 8) != 0 )
      __debugbreak();
  }
  else
  {
    if( (_DWORD)Phase )
    {
      KeQueryPerformanceCounter(&KdPerformanceCounterRate);
      if( !KdPitchDebugger )
      {
        for( i = 0; i < (unsigned int)KeNumberProcessors_0; ++i )
        {
          PoolWithTag = ExAllocatePoolWithTag(0x200ui64, 0x1000ui64, 1867080779i64);
          v41 = PoolWithTag;
          if( PoolWithTag )
          {
            memset(PoolWithTag, 0i64, 0x1000u);
            _InterlockedOr(v42, 0);
            KdLogBuffer[i] = v41;
          }
        }
      }
      KdpLoaderDebuggerBlock = 0i64;
      return 1;
    }
    if( (_BYTE)KdDebuggerEnabled )
      goto LABEL_31;
    dword_140C50A74 = 0;
    BYTE1(KdDebuggerEnabled) = 0;
    if( !KdPitchDebugger || (v6 = 1, !KdLocalDebugEnabled) )
      v6 = 0;
    if( qword_140C49C28 && qword_140C49C28[59] == 3 )
      KdTransportMaxPacketSize = 1152;
    if( !KdpDebuggerDataListHead )
    {
      KdpContext.DebugDevice = (_DEBUG_DEVICE_DESCRIPTOR *)qword_140C49C28;
      qword_140C00C90 = (__int64)MmGetPagedPoolCommitPointer();
      *(&stru_140CF2E80 + 610) = 0i64;
      qword_140C40598 = (__int64)&KdpPowerListHead;
      KdpPowerListHead = (__int64)&KdpPowerListHead;
      qword_140C40578 = (__int64)&KdpDebuggerDataListHead;
      KdpDebuggerDataListHead = (__int64)&KdpDebuggerDataListHead;
      KdRegisterDebuggerDataBlock(v7, &KdDebuggerDataBlock, v8);
      *(_WORD *)&KdVersionBlock[2] = NtBuildNumber;
      *(_WORD *)&KdVersionBlock[6] |= 1u;
      *(_WORD *)KdVersionBlock = (unsigned int)NtBuildNumber >> 28;
      *(_QWORD *)&KdVersionBlock[24] = &PsLoadedModuleList;
      *(_WORD *)&KdVersionBlock[11] = 13059;
      *(_QWORD *)&KdVersionBlock[32] = &KdpDebuggerDataListHead;
    }
    CurrentPrcb = (_LIST_ENTRY *)KeGetCurrentPrcb();
    if( !CurrentPrcb[2140].Flink )
    {
      LODWORD(CurrentPrcb[2140].Blink) = 1048587;
      CurrentPrcb[2140].Flink = CurrentPrcb + 31;
    }
    if( LoaderBlock )
    {
      CurrentPrcb = LoaderBlock->LoadOrderListHead.Flink[3].Flink;
      off_140C00DF8 = &KdpLoaderDebuggerBlock;
      KdpLoaderDebuggerBlock = (__int64)&LoaderBlock->LoadOrderListHead;
      LoadOptions = LoaderBlock->LoadOptions;
      *(_QWORD *)&KdVersionBlock[16] = CurrentPrcb;
      if( LoadOptions )
      {
        strupr(LoadOptions);
        LODWORD(KdPrintBufferAllocateSize) = 0;
        v11 = 0;
        strstr((UINT8 *)LoadOptions, (UINT8 *)"DBGPRINT_LOG_SIZE=", v12);
        if( v13 )
        {
          v21 = (atol((const CHAR *)(v13 + 18)) + 4095) & 0xFFFFF000;
          LODWORD(KdPrintBufferAllocateSize) = v21;
          if( v21 > 0x1000000 )
          {
            LODWORD(KdPrintBufferAllocateSize) = 0x1000000;
            v21 = 0x1000000;
          }
          if( v21 <= 0x1000 )
            LODWORD(KdPrintBufferAllocateSize) = 0;
        }
        strstr((UINT8 *)LoadOptions, (UINT8 *)"NODEBUG", v14);
        if( v16 )
        {
          KdPitchDebugger = 1;
          KdPageDebuggerSection = 1;
          KdpBootedNodebug = 1;
        }
        else
        {
          strstr((UINT8 *)LoadOptions, (UINT8 *)"DEBUGPORT=LOCAL", v15);
          if( v22 )
          {
            KdPitchDebugger = 1;
            v6 = 1;
            KdPageDebuggerSection = 1;
            LOBYTE(KdDebuggerNotPresent) = 1;
            KdLocalDebugEnabled = 1;
            KdpBootedNodebug = 0;
          }
          else
          {
            v23 = (UINT8 *)LoadOptions;
            do
            {
              strstr(v23, (UINT8 *)" DEBUG=", v15);
              v25 = v24;
              if( !v24 )
              {
                strstr(v23, (UINT8 *)" DEBUG", v15);
                v25 = v26;
                if( !v26 )
                  break;
              }
              v23 = (UINT8 *)(v25 + 6);
              v27 = *(char *)(v25 + 6);
              if( (unsigned __int8)v27 <= 0x3Du )
              {
                v28 = 0x2000000100000001i64;
                if( _bittest64(&v28, v27) )
                {
                  KdpBootedNodebug = 0;
                  v11 = 1;
                  if( *(_BYTE *)(v25 + 6) == 61 )
                  {
                    for( j = (INT8 *)(v25 + 7); ; j = v30 + 1 )
                    {
                      LOBYTE(v27) = *j;
                      v30 = j;
                      while( (_BYTE)v27 )
                      {
                        if( (unsigned __int8)v27 <= 0x2Cu )
                        {
                          v31 = 0x100100000200i64;
                          if( _bittest64(&v31, v27) )
                            break;
                        }
                        LOBYTE(v27) = *++v30;
                      }
                      v27 = (unsigned int)((_DWORD)v30 - (_DWORD)j);
                      if( (_DWORD)v30 == (_DWORD)j )
                        break;
                      switch( (_DWORD)v27 )
                      {
                        case 0xA:
                          LODWORD(v27) = strncmp(j, (INT8 *)"AUTOENABLE", 0xAui64);
                          if( !(_DWORD)v27 )
                          {
                            v3 = 1;
                            KdAutoEnableOnEvent = 1;
                            v4 = 0;
                          }
                          break;
                        case 7:
                          LODWORD(v27) = strncmp(j, (INT8 *)"DISABLE", 7ui64);
                          if( !(_DWORD)v27 )
                          {
                            v3 = 1;
                            KdAutoEnableOnEvent = 0;
                            v4 = 1;
                          }
                          break;
                        case 6:
                          LODWORD(v27) = strncmp(j, (INT8 *)"NOUMEX", 6ui64);
                          if( !(_DWORD)v27 )
                            KdIgnoreUmExceptions = 1;
                          break;
                      }
                      if( *v30 != 44 )
                        break;
                    }
                  }
                  break;
                }
              }
            }
            while( v25 != -6 );
          }
        }
        strstr((UINT8 *)LoadOptions, (UINT8 *)"NOEVENT", v15);
        if( v18 )
        {
          KdEventLoggingEnabled = 0;
        }
        else
        {
          strstr((UINT8 *)LoadOptions, (UINT8 *)"EVENT", v17);
          if( v19 )
          {
            KdEventLoggingEnabled = 1;
            v11 = 1;
            KdPageDebuggerSection = 0;
          }
        }
      }
      else
      {
        KdPitchDebugger = 1;
        v11 = 0;
        KdPageDebuggerSection = 1;
      }
    }
    else
    {
      v11 = 1;
      *(_QWORD *)&KdVersionBlock[16] = PsNtosImageBase;
    }
    ImageBase = *(VOID **)&KdVersionBlock[16];
    if( !v6 )
    {
      if( LoaderBlock && LoaderBlock->OsLoaderSecurityVersion != 1 )
        v11 = 0;
      if( !v11 )
      {
        LOBYTE(KdDebuggerNotPresent) = 1;
        goto LABEL_31;
      }
      if( (int)KdInitialize(0i64, LoaderBlock, &KdpContext) < 0 )
      {
        KdPitchDebugger = 0;
        v11 = 0;
        LOBYTE(KdDebuggerNotPresent) = 1;
        KdLocalDebugEnabled = 1;
      }
      else
      {
        dword_140C50A74 = 1;
      }
    }
    if( !KdpDebuggerStructuresInitialized )
    {
      KdpContext.KdpControlCPending = 0;
      KdpContext.KdpDefaultRetries = 20;
      KeInitializeDpc(&KdpTimeSlipDpc, KdpTimeSlipDpcRoutine, 0i64);
      KeInitializeTimerEx((INT64)&KdpTimeSlipTimer, 0);
      KdpTimeSlipWorkItem.Parameter = 0i64;
      KdpTimeSlipWorkItem.WorkerRoutine = (void(__fastcall *)(void *))KdpTimeSlipWork;
      KdpTimeSlipWorkItem.List.Flink = 0i64;
      KdpDebuggerStructuresInitialized = 1;
    }
    KdTimerStart = 0i64;
    if( KdEventLoggingEnabled && KdpBootedNodebug )
    {
      KdPitchDebugger = 1;
      KdEventLoggingPresent = v11;
      LOBYTE(KdDebuggerNotPresent) = 1;
      KdLocalDebugEnabled = 0;
    }
    else
    {
      LOBYTE(KdDebuggerEnabled) = 1;
      KUSER_SHARED_DATA.KdDebuggerEnabled = 1;
      if( KdLocalDebugEnabled )
        goto LABEL_31;
    }
    if( KdEventLoggingEnabled && !(_BYTE)KdDebuggerEnabled )
    {
LABEL_31:
      if( LoaderBlock )
      {
        Extension = LoaderBlock->Extension;
        if( Extension )
          memset(Extension->BootEntropyResult.KdEntropy, 0, sizeof(Extension->BootEntropyResult.KdEntropy));
      }
      return 1;
    }
    KdPitchDebugger = 0;
    if( v3 )
    {
      KdDisableDebuggerWithLock((UINT8)CurrentPrcb);
      KdBlockEnable = v4;
      goto LABEL_31;
    }
    if( LoaderBlock )
    {
      v32 = 0;
      for( k = LoaderBlock->LoadOrderListHead.Flink; k != &LoaderBlock->LoadOrderListHead; ++v32 )
      {
        if( v32 >= 3 )
          break;
        DestinationString = 0i64;
        LODWORD(v34) = 0;
        Flink = (char *)k[5].Flink;
        v36 = LOWORD(k[4].Blink) >> 1;
        if( v36 >= 0x100 )
          v36 = 255;
        do
        {
          v37 = *Flink;
          Flink += 2;
          v38 = (unsigned int)v34;
          v34 = (unsigned int)(v34 + 1);
          SourceString[v38] = v37;
        }
        while( (unsigned int)v34 < v36 );
        if( (unsigned int)v34 >= 0x100ui64 )
          _report_rangecheckfailure();
        SourceString[v34] = 0;
        RtlInitAnsiString(&DestinationString, SourceString);
        DbgLoadImageSymbols(&DestinationString, k[3].Flink, 0xFFFFFFFF);
        k = k->Flink;
      }
    }
    else
    {
      DbgLoadImageSymbols(0i64, ImageBase, 0xFFFFFFFF);
    }
    if( LoaderBlock )
    {
      BYTE1(KdDebuggerEnabled) = KdPollBreakIn();
      goto LABEL_31;
    }
  }
  return 1;
}

Referenced by:

KdEnableDebuggerWithLock
KeEnterKernelDebugger
KiSetFeatureBits
KiSetProcessorSignature
KiSystemStartup
PopHiberCheckResume