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