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