InitBootProcessor
NTSTATUS __stdcall InitBootProcessor(_LOADER_PARAMETER_BLOCK *LoaderBlock){
char *LoadOptions;
CHAR v3;
UINT8 *v4;
CHAR v5;
__int64 v6;
UINT64 v7;
UINT8 *v8;
CHAR v9;
__int64 v10;
UINT64 v11;
__int64 v12;
_LIST_ENTRY *p_MemoryDescriptorListHead;
_LIST_ENTRY *v14;
_LIST_ENTRY *Flink;
ULONGLONG v16;
_LIST_ENTRY *Blink;
_LIST_ENTRY *v18;
_NLS_DATA_BLOCK *NlsData;
UINT16 *UnicodeCaseTableData;
UINT16 *OemCodePageData;
UINT16 *AnsiCodePageData;
int v23;
_NLSTABLEINFO *v24;
__int64 v25;
NTSTATUS v26;
_UNICODE_STRING *HostNtSystemRoot;
NTSTATUS v28;
int v29;
const INT8 *v30;
CHAR v31;
size_t v32;
VOID **PoolWithTag;
VOID **v34;
char *v35;
__int64 v36;
unsigned int v37;
_LIST_ENTRY *i;
char *v39;
unsigned int v40;
__int64 v41;
char v42;
NTSTATUS v43;
UINT64 *v44;
NTSTATUS Message;
NTSTATUS v46;
CHAR **v47;
UINT64 *v48;
NTSTATUS v49;
NTSTATUS v50;
NTSTATUS v51;
NTSTATUS v52;
NTSTATUS v53;
VOID *v54;
VOID **v55;
VOID **v56;
NTSTATUS result;
UINT64 DestinationString;
_STRING DestinationString_8;
UINT64 pcbRemaining;
UINT64 pullResult;
_IMAGE_RESOURCE_DATA_ENTRY *ResourceDataEntry;
PVOID Address;
INT64 v64;
INT8 *FileName[6];
UINT64 ResourceIdPath[4];
char pszDest[256];
INT8 SourceString[64];
dword_140D247B4 = -1;
dword_140D2399C = 259;
v64 = 0i64;
ResourceDataEntry = 0i64;
pcbRemaining = 0i64;
qword_140D23968 = (__int64)&PspTimeZoneStateBuffer;
dword_140D23998 = 1;
byte_140D23959 = 1;
DestinationString_8 = 0i64;
*(_OWORD *)&FileName[1] = 0i64;
ExpValidateLoader(LoaderBlock);
KUSER_SHARED_DATA.BootId = LoaderBlock->Extension->BootId;
ExpInitLicensing((INT64)&PspHostSiloGlobals);
if( (VslGetNestedPageProtectionFlags() & 6) == 6 )
ExpRevokeBootLoaderPagePrivileges((INT64)LoaderBlock);
VslGetSecureSpeculationControlInformation();
LoadOptions = LoaderBlock->LoadOptions;
LODWORD(InitializationPhase) = 0;
if( LoadOptions )
{
strupr(LoadOptions);
strstr((UINT8 *)LoadOptions, (UINT8 *)"PERFMEM", v3);
if( v4 )
{
strstr(v4, (UINT8 *)"=", v5);
if( v6 )
{
v7 = (__int64)atol((const CHAR *)(v6 + 1)) << 8;
if( LoaderBlock->Extension->BbtBuffer )
{
BBTPagesToReserve = v7;
}
else if( v7 )
{
BBTPagesToReserve = ExBurnMemory(LoaderBlock, v7, LoaderBBTMemory, &BBTMemoryDescriptor);
}
}
}
strstr((UINT8 *)LoadOptions, (UINT8 *)"BURNMEMORY", v5);
if( v8 )
{
strstr(v8, (UINT8 *)"=", v9);
if( v10 )
{
v11 = (__int64)atol((const CHAR *)(v10 + 1)) << 8;
if( v11 )
ExBurnMemory(LoaderBlock, v11, LoaderFirmwarePermanent, &BurnMemoryDescriptor);
}
}
strstr((UINT8 *)LoadOptions, (UINT8 *)"FORCEGROUPAWARE", v9);
if( v12 )
KeForceGroupAwareness = 1;
}
p_MemoryDescriptorListHead = &LoaderBlock->MemoryDescriptorListHead;
v14 = 0i64;
Flink = LoaderBlock->MemoryDescriptorListHead.Flink;
while( Flink != p_MemoryDescriptorListHead )
{
if( LODWORD(Flink[1].Flink) == 21 )
{
v16 = (ULONGLONG)Flink[2].Flink;
pullResult = 0i64;
if( RtlULongLongMult(v16, 0x1000ui64, &pullResult) < 0
|| RtlULongLongAdd(InitNlsTableSize, pullResult, &InitNlsTableSize) < 0 )
{
goto LABEL_94;
}
}
Blink = Flink[1].Blink;
v18 = Flink[2].Flink;
if( Blink < v14 )
KeBugCheckEx(0x31u, Flink, Blink, v18, v14);
Flink = Flink->Flink;
v14 = (_LIST_ENTRY *)((char *)v18 + (_QWORD)Blink);
}
NlsData = LoaderBlock->NlsData;
if( NlsData )
{
if( NlsData->AnsiCodePageData && NlsData->OemCodePageData )
{
InitNlsTableBase = NlsData->AnsiCodePageData;
InitAnsiCodePageDataOffset = 0;
InitOemCodePageDataOffset = LODWORD(NlsData->OemCodePageData) - LODWORD(NlsData->AnsiCodePageData);
v23 = LODWORD(NlsData->UnicodeCaseTableData) - LODWORD(NlsData->AnsiCodePageData);
}
else
{
v23 = 0;
InitNlsTableBase = NlsData->UnicodeCaseTableData;
InitAnsiCodePageDataOffset = 0;
InitOemCodePageDataOffset = 0;
}
InitUnicodeCaseTableDataOffset = v23;
UnicodeCaseTableData = (UINT16 *)NlsData->UnicodeCaseTableData;
OemCodePageData = (UINT16 *)NlsData->OemCodePageData;
AnsiCodePageData = (UINT16 *)NlsData->AnsiCodePageData;
}
else
{
UnicodeCaseTableData = 0i64;
InitNlsTableBase = 0i64;
OemCodePageData = 0i64;
InitUnicodeCaseTableDataOffset = 0;
AnsiCodePageData = 0i64;
InitAnsiCodePageDataOffset = 0;
InitOemCodePageDataOffset = 0;
}
RtlInitNlsTables(AnsiCodePageData, OemCodePageData, UnicodeCaseTableData, (_NLSTABLEINFO *)NlsData);
RtlResetRtlTranslations(v24);
*(&ExBootDevicesRemovedEvent + 103) = LoaderBlock->Extension->LeapSecondData;
WheaInitializeServices();
((void(__fastcall *)(PVOID))off_140C008B0[0])(HalIommuDispatch);
qword_140D577E8 = __rdtsc();
if( !HalInitSystem((unsigned int)InitializationPhase, (INT64)LoaderBlock) )
KeBugCheck(0x5Cu);
qword_140D577F0 = __rdtsc();
KeInitializeClock((unsigned int)InitializationPhase, LoaderBlock);
PsInitializeQuotaSystem(1ui64);
CmInitSystem0((__int64)LoaderBlock, v25);
KvfInitFeatureStates((INT64)LoaderBlock);
if( !PoEnergyEstimationEnabled() )
_interlockedbittestandreset((volatile signed __int32 *)KiProcessorBlock->IdleThread, 0x15u);
if( !KeInitSystem(0i64) )
KeBugCheckEx(0x31u, (PVOID)0xFFFFFFFFC0000001i64, (PVOID)0xB, 0i64, 0i64);
*(&ExBootDevicesRemovedEvent + 78) = ExComputeTickCountMultiplier();
KUSER_SHARED_DATA.TickCountMultiplier = *(&ExBootDevicesRemovedEvent + 78);
KUSER_SHARED_DATA.CryptoExponent = 0;
v26 = RtlStringCbPrintfA(pszDest, 0x100ui64, (INT8 *)"C:%s");
if( v26 < 0 )
KeBugCheckEx(0x6Eu, (PVOID)v26, 0i64, 0i64, 0i64);
RtlInitAnsiString(&DestinationString_8, pszDest);
DestinationString_8.Buffer[--DestinationString_8.Length] = 0;
HostNtSystemRoot = RtlGetHostNtSystemRoot();
HostNtSystemRoot->Buffer = (_WORD *)(&KUSER_SHARED_DATA + 48);
*(_DWORD *)&HostNtSystemRoot->Length = 34078720;
v28 = RtlAnsiStringToUnicodeString(HostNtSystemRoot, &DestinationString_8, 0);
if( v28 < 0 )
KeBugCheckEx(0x6Eu, (PVOID)v28, (PVOID)1, 0i64, 0i64);
ResourceIdPath[0] = 11i64;
ResourceIdPath[1] = 1i64;
ResourceIdPath[2] = 0i64;
Address = 0i64;
LODWORD(DestinationString) = 0;
if( LdrFindResource_U((VOID *)0x140000000i64, ResourceIdPath, 3ui64, &ResourceDataEntry) >= 0
&& LdrAccessResource((PVOID)0x140000000i64, ResourceDataEntry, &Address, &DestinationString) >= 0 )
{
KiBugCodeMessages = Address;
}
CmNtGlobalFlag2 &= 1u;
KUSER_SHARED_DATA.GlobalValidationRunlevel = CmGlobalValidationRunlevel;
KUSER_SHARED_DATA.ProcessorFeatures[23] = 1;
v29 = CmNtSpBuildNumber & 0xFFF;
WORD1(CmNtCSDVersion) = 0;
CmNtSpBuildNumber = v29;
if( CmNtCSDReleaseType )
LODWORD(CmNtCSDVersion) = (v29 << 16) | CmNtCSDVersion;
if( InitTickRolloverDelayLength != 4 || InitTickRolloverDelayType != 4 )
InitTickRolloverDelay = 0;
if( InitTickRolloverDelay )
{
KeAdjustInterruptTime(10000i64 * (unsigned int)-InitTickRolloverDelay, 1u);
KeRebaselineSystemTime();
}
NtGlobalFlag |= CmNtGlobalFlag;
NtGlobalFlag2 |= CmNtGlobalFlag2;
KUSER_SHARED_DATA.ActiveProcessorCount = 1;
KUSER_SHARED_DATA.ActiveGroupCount = 1;
KUSER_SHARED_DATA.UnparkedProcessorCount = 1;
if( !ExInitSystem() )
goto LABEL_94;
KeNumaInitialize();
VerifierInitSystem(LoaderBlock);
InitializeDynamicPartitioningPolicy(v30);
EtwBootPerfData = KeQueryPerformanceCounter(0i64);
if( !MmInitSystem(0i64, LoaderBlock) )
goto LABEL_94;
qword_140D57798 = KeQueryPerformanceCounter(0i64);
KiHwPolicyDriverImageBase = 0i64;
HalInitializeBios(0i64, (INT64)LoaderBlock);
InbvDriverInitialize(0i64, LoaderBlock, 0i64);
if( KiBugCodeMessages )
{
v32 = DestinationString;
PoolWithTag = ExAllocatePoolWithTag(0x200ui64, (unsigned int)DestinationString, 1665296715i64);
v34 = PoolWithTag;
if( !PoolWithTag )
KeBugCheck(0x7Du);
memmove(PoolWithTag, KiBugCodeMessages, v32);
KiBugCodeMessages = v34;
}
if( LoaderBlock->OsLoaderSecurityVersion != 1 )
{
v35 = LoaderBlock->LoadOptions;
if( v35 )
{
strstr((UINT8 *)v35, (UINT8 *)"DEBUG", v31);
if( v36 )
{
dword_140C508EC = 0;
KeBugCheckEx(0x196u, (PVOID)LoaderBlock->OsLoaderSecurityVersion, (PVOID)1, 0i64, 0i64);
}
}
}
v37 = 0;
for( i = LoaderBlock->LoadOrderListHead.Flink; i != &LoaderBlock->LoadOrderListHead; ++v37 )
{
if( v37 >= 3 )
{
v39 = (char *)i[5].Flink;
if( *(_WORD *)v39 == 92 )
{
v40 = LOWORD(i[4].Blink) >> 1;
if( (unsigned __int64)v40 + 1 <= 0x100 )
{
v41 = 0i64;
do
{
v42 = *v39;
v39 += 2;
pszDest[v41] = v42;
v41 = (unsigned int)(v41 + 1);
}
while( (unsigned int)v41 < v40 );
if( (unsigned int)v41 >= 0x100ui64 )
_report_rangecheckfailure();
pszDest[v41] = 0;
LABEL_64:
RtlInitAnsiString((PANSI_STRING)&FileName[1], pszDest);
DbgLoadImageSymbols((_STRING *)&FileName[1], i[3].Flink, 0xFFFFFFFF);
}
}
else if( ((unsigned __int64)LOWORD(i[5].Blink) >> 1) + ((unsigned __int64)HostNtSystemRoot->Length >> 1) + 17 <= 0x100 )
{
v43 = RtlStringCbPrintfA(pszDest, 0x100ui64, (INT8 *)"%ws\\System32\\Drivers\\%wZ");
if( v43 < 0 )
KeBugCheckEx(0x31u, (PVOID)v43, (PVOID)3, 0i64, 0i64);
goto LABEL_64;
}
}
i = i->Flink;
}
if( BYTE1(KdDebuggerEnabled) )
DbgBreakPointWithStatus(1u);
ExpInitializeBootEnvironment(LoaderBlock);
HvlPhase1Initialize();
if( LoaderBlock->Extension->Size >= 0xE38 )
HeadlessInit(LoaderBlock);
BootApplicationPersistentDataInitialize(LoaderBlock);
KUSER_SHARED_DATA.Reserved1 = 2147418111;
KUSER_SHARED_DATA.Reserved3 = 0x80000000;
if( (_DWORD)CmNtCSDVersion )
{
Message = RtlFindMessage((VOID *)0x140000000i64, 0xBui64, 0i64, 0x40000087ui64, (UINT16 **)&v64);
if( Message < 0 )
KeBugCheckEx(0x31u, (PVOID)Message, (PVOID)4, 0i64, 0i64);
RtlInitAnsiString(&DestinationString_8, (PCSZ)(v64 + 4));
DestinationString_8.Length -= 2;
v46 = RtlStringCbPrintfA(pszDest, 0x100ui64, (INT8 *)"%Z %u%c");
if( v46 < 0 )
KeBugCheckEx(0x31u, (PVOID)v46, (PVOID)5, 0i64, 0i64);
if( (CmNtCSDVersion & 0xFFFF0000) != 0 )
{
FileName[0] = 0i64;
v49 = RtlStringCbCatExA(pszDest, v47, v48);
if( v49 < 0 )
KeBugCheckEx(0x31u, (PVOID)v49, (PVOID)6, 0i64, 0i64);
v50 = RtlStringCbPrintfA(FileName[0], pcbRemaining, (INT8 *)"v.%u");
if( v50 < 0 )
KeBugCheckEx(0x31u, (PVOID)v50, (PVOID)7, 0i64, 0i64);
}
}
else
{
v51 = RtlStringCbCopyExA(pszDest, v44);
if( v51 < 0 )
KeBugCheckEx(0x31u, (PVOID)v51, (PVOID)8, 0i64, 0i64);
CmCSDVersionString.MaximumLength = 256 - pcbRemaining;
}
RtlInitAnsiString(&DestinationString_8, pszDest);
v52 = RtlAnsiStringToUnicodeString(&CmCSDVersionString, &DestinationString_8, 1u);
if( v52 < 0 )
KeBugCheckEx(0x31u, (PVOID)v52, (PVOID)9, 0i64, 0i64);
v53 = RtlStringCbPrintfA(SourceString, 0x40ui64, (INT8 *)"%u.%u");
if( v53 < 0 )
KeBugCheckEx(0x31u, (PVOID)v53, (PVOID)0xA, 0i64, 0i64);
if( !RtlCreateUnicodeStringFromAsciiz((INT64)&CmVersionString, (INT64)SourceString) )
LABEL_94:
KeBugCheck(0x31u);
if( (NtGlobalFlag & 0x2000) != 0 )
{
v55 = ExAllocatePoolWithTag(0x200ui64, 0x800000ui64, 1667331155i64);
v56 = v55;
if( v55 )
{
FileName[3] = (INT8 *)v55;
FileName[4] = (INT8 *)0x800000;
FileName[5] = (INT8 *)0x800000;
if( RtlControlStackTraceDataBase(v54) < 0 )
ExFreePoolWithTag(v56, 0x63617453u);
}
}
if( (NtGlobalFlag & 0x800000) != 0 )
RtlInitializeExceptionLog((UINT64)v54);
ExInitializeHandleTablePackage();
if( !ObInitSystem() )
KeBugCheck(0x5Eu);
if( !SeInitSystem() )
KeBugCheck(0x5Fu);
if( !PsInitSystem(0i64, LoaderBlock) || DbgkInitialize() < 0 )
KeBugCheck(0x60u);
if( !PpInitSystem() )
KeBugCheck(0x8Fu);
KUSER_SHARED_DATA.NtMajorVersion = 10;
KUSER_SHARED_DATA.NtMinorVersion = 0;
KUSER_SHARED_DATA.NtBuildNumber = 19041;
KUSER_SHARED_DATA.NativeProcessorArchitecture = KeProcessorArchitecture;
KUSER_SHARED_DATA.ImageNumberLow = -31132;
KUSER_SHARED_DATA.ImageNumberHigh = -31132;
result = 0;
KUSER_SHARED_DATA.LangGenerationCount = 0;
return result;
}Referenced by:
KiInitializeKernel