HvlPhase2Initialize
NTSTATUS __stdcall HvlPhase2Initialize(_LOADER_PARAMETER_BLOCK *LoaderBlock){
UINT64 v1;
_QWORD *v2;
EVENT_DESCRIPTOR *v3;
EVENT_DESCRIPTOR *v4;
EVENT_DESCRIPTOR *v5;
EVENT_DESCRIPTOR *v6;
EVENT_DESCRIPTOR *v7;
volatile CCHAR v8;
NTSTATUS result;
UINT64 v10;
_BYTE *v11;
UINT64 *v12;
INT64 v13;
UINT64 v14;
WCHAR *v15;
int v16;
WCHAR v17;
struct _UNICODE_STRING DestinationString;
EVENT_DESCRIPTOR *v19[6];
struct _OBJECT_ATTRIBUTES ObjectAttributes;
PCALLBACK_OBJECT CallbackObject;
v2 = (_QWORD *)*((_QWORD *)LoaderBlock + 30);
*(&ObjectAttributes.Length + 1) = 0;
DestinationString = 0i64;
*(&ObjectAttributes.Attributes + 1) = 0;
v3 = (EVENT_DESCRIPTOR *)v2[316];
v4 = (EVENT_DESCRIPTOR *)v2[317];
v5 = (EVENT_DESCRIPTOR *)v2[318];
v6 = (EVENT_DESCRIPTOR *)v2[319];
v7 = (EVENT_DESCRIPTOR *)v2[320];
if( v3 )
{
HvlpEtwRegister(LoaderBlock, v1);
v19[0] = v3;
v19[1] = v4;
v19[2] = v5;
v19[3] = v6;
v19[4] = v7;
HvlpLogHypervisorLaunchError(v19);
EtwUnregister(HvlGlobalSystemEventsHandle);
HvlGlobalSystemEventsHandle = 0i64;
}
if( !(_BYTE)HvlHypervisorConnected )
return 0;
if( (HvlpFlags & 2) == 0 )
goto LABEL_10;
HvlpDiscoverTopologyComplete();
HvlpSchedulerType = HvlpQueryHypervisorSchedulerType();
if( HvlpSchedulerType == 4 )
KeNumberProcessorsGroup0[3] = 1;
v8 = KeNumberProcessorsGroup0[3];
if( !v8
|| (result = HvlpInitializeSvmIommuSupport(),
v1 = 0x80000000i64,
LoaderBlock = (_LOADER_PARAMETER_BLOCK *)(result + 0x80000000),
(int)LoaderBlock < 0)
|| result == -1073741637 )
{
LABEL_10:
HvlpInitializeHvCrashdumpPhase2((INT64)LoaderBlock, v1);
if( (HvlpRootFlags & 1) == 0 )
{
LABEL_19:
if( ExCbEnlightenmentState )
ExNotifyWithProcessing(ExCbEnlightenmentState, 0i64, 0i64, 0i64);
HvlpRegisterPowerPolicyCallbacks();
return 0;
}
HvlpEtwRegister(v11, v10);
HvlpWriteEventLog((EVENT_DESCRIPTOR *)&HV_EVENTLOG_START_SUCCEEDED, 0i64, 0i64);
HvlpLogHypervisorSchedulerType(v13, v12, v14);
HvlpCheckTscSync();
HvlpLogIommuInitStatus();
HvlpLogGuestStateScrubbingStatus();
if( (unsigned int)HvlpLogicalProcessorCount < 0x400 )
{
v15 = &HvlpLogicalProcessorRegions + 60 * (unsigned int)HvlpLogicalProcessorCount;
if( !*(_DWORD *)v15 )
{
v16 = v15[28];
if( (_WORD)v16 )
HvlpLogProcessorStartupFailure(*((_DWORD *)v15 + 2), v16, (__int64)(v15 + 28));
}
}
HvlpLogMicrocodeUpdateStatus();
if( HvlpMinrootConfigurationError )
HvlpWriteEventLog((EVENT_DESCRIPTOR *)&HV_EVENTLOG_CORE_SCHEDULER_PROCESSOR_CONFIGURATION_WARNING, 0i64, 0i64);
RtlInitUnicodeString(&DestinationString, L"\\Callback\\PowerState", v17);
ObjectAttributes.Length = 48;
ObjectAttributes.ObjectName = &DestinationString;
ObjectAttributes.RootDirectory = 0i64;
ObjectAttributes.Attributes = 80;
CallbackObject = 0i64;
*(_OWORD *)&ObjectAttributes.SecurityDescriptor = 0i64;
result = ExCreateCallback(&CallbackObject, &ObjectAttributes, 0, 1u);
if( result >= 0 )
{
ExRegisterCallback(CallbackObject, HvlpPowerStateCallback, 0i64);
goto LABEL_19;
}
}
return result;
}Referenced by:
IoInitSystemPreDrivers