IopInitializeBootDrivers
UINT64 __stdcall IopInitializeBootDrivers(_LOADER_PARAMETER_BLOCK *LoaderBlock, _DRIVER_OBJECT **PreviousDriver){
_LOADER_PARAMETER_BLOCK *v2;
NTSTATUS RegistryValue;
_QWORD *v4;
unsigned int GroupOrderIndex;
__int64 v6;
unsigned int v7;
unsigned __int16 i;
__int64 v9;
_QWORD *v10;
unsigned __int16 v11;
unsigned __int16 v12;
unsigned __int16 v13;
const _UNICODE_STRING *v14;
_LIST_ENTRY *Flink;
VOID *v16;
_QWORD *v17;
_LIST_ENTRY *v18;
VOID **PoolWithTag;
VOID **v20;
unsigned int v21;
UINT16 DriverTagPriority;
__int64 **v23;
__int64 *j;
_TREE_ENTRY *v25;
unsigned __int16 v26;
__int64 v27;
__int64 v28;
__int64 *v29;
NTSTATUS v30;
_LOADER_PARAMETER_EXTENSION *Extension;
__int64 ArcOSDataDeviceName;
_LIST_ENTRY *p_AttachedHives;
_LIST_ENTRY *v34;
UINT64 *v35;
NTSTATUS Index;
unsigned __int16 v37;
void **v38;
void *v39;
__int64 v41;
void *v42;
int started;
_UNICODE_STRING *v44;
void **v45;
__int64 v46;
int v47;
void *v48;
UINT64 v49;
VOID *v50;
HPNPCTX *v51;
INT64 v52;
INT64 v53;
unsigned __int16 *v54;
INT64 v55;
INT64 v56;
INT64 v57;
PVOID v58;
UINT64 dwFlags;
INT64 dwFlagsa;
UINT64 pszFormat;
INT64 pszFormata;
VOID **phkResult;
int pRegDisposition;
int pRegDispositiona;
UINT64 *pRegDispositionb;
VOID *Handle;
PVOID Object;
CHAR v69[4];
_DWORD HardwareConfigIndex[3];
int v71;
VOID *hKey;
VOID *v73;
_UNICODE_STRING KeyName;
_LOADER_PARAMETER_BLOCK *v75;
_UNICODE_STRING DriverName;
_UNICODE_STRING DestinationString;
_UNICODE_STRING v78;
_UNICODE_STRING GroupName;
_UNICODE_STRING String2;
__int16 pszDest[64];
v75 = LoaderBlock;
*(_DWORD *)(&DriverName.MaximumLength + 1) = 0;
v2 = LoaderBlock;
memset(HardwareConfigIndex, 0, sizeof(HardwareConfigIndex));
Handle = 0i64;
*(_DWORD *)(&KeyName.MaximumLength + 1) = 0;
String2 = 0i64;
*(_DWORD *)(&v78.MaximumLength + 1) = 0;
GroupName = 0i64;
v73 = 0i64;
hKey = 0i64;
*(_DWORD *)v69 = 0;
DestinationString = 0i64;
Object = 0i64;
PnpDiagnosticTrace(&KMPnPEvt_BootStart_Start, 0, 0i64);
PnpDriverImageLoadPolicy = 3;
KeyName.Buffer = L"\\Registry\\Machine\\System\\CurrentControlSet\\Policies\\EarlyLaunch";
*(_DWORD *)&KeyName.Length = 8388734;
if( IopOpenRegistryKeyEx(&Handle, 0i64, &KeyName, 0x20019ui64) >= 0
|| (*(_DWORD *)&KeyName.Length = 8257660,
KeyName.Buffer = L"\\Registry\\Machine\\System\\CurrentControlSet\\Control\\EarlyLaunch",
IopOpenRegistryKeyEx(&Handle, 0i64, &KeyName, 0x20019ui64) >= 0) )
{
RegistryValue = IopGetRegistryValue(
Handle,
(PWCHAR)L"DriverLoadPolicy",
0i64,
(_KEY_VALUE_FULL_INFORMATION **)&HardwareConfigIndex[1]);
ZwClose((_HANDLE)Handle);
if( RegistryValue >= 0 )
{
if( *(_DWORD *)(*(_QWORD *)&HardwareConfigIndex[1] + 4i64) == 4
&& *(_DWORD *)(*(_QWORD *)&HardwareConfigIndex[1] + 12i64) >= 4u )
{
PnpDriverImageLoadPolicy = *(_DWORD *)(*(unsigned int *)(*(_QWORD *)&HardwareConfigIndex[1] + 8i64)
+ *(_QWORD *)&HardwareConfigIndex[1]);
}
ExFreePoolWithTag(*(PVOID *)&HardwareConfigIndex[1], 0);
}
}
if( PnpDriverImageLoadPolicy == 8 )
{
PnpDriverImageLoadPolicy = 0;
}
else if( (PnpDriverImageLoadPolicy & 0xFFFFFFF8) != 0 )
{
PnpDriverImageLoadPolicy = 3;
}
PipInitializeDriverDependentDLLs(0, (_LIST_ENTRY *)v2);
PipInitializeCoreDriversByGroup(CoreDriverGroup, v2);
PsNotifyCoreDriversInitialized();
PipInitializeEarlyLaunchDrivers(v2);
*(&stru_140C452E0 + 312) = 1;
PnpNotifyEarlyLaunchStatusUpdate(0);
PipInitializeDriverDependentDLLs(1, (_LIST_ENTRY *)v2);
PipInitializeCoreDriversByGroup(CoreExtensionsDriverGroup, v2);
PipInitializeCoreDriversByGroup(TpmCoreDriverGroup, v2);
*(&stru_140C452E0 + 141) = 3;
PipInitComputerIds(v2);
*(_DWORD *)&v78.Length = 2097182;
v78.Buffer = L"\\FileSystem\\RAW";
DriverName.Buffer = (wchar_t *)&word_140A76040;
*(_DWORD *)&DriverName.Length = 0x20000;
PnpInitializeBootStartDriver(
&v78,
(INT64)&DriverName,
(INT64)RawInitialize,
0i64,
&v2->LoadOrderListHead,
0,
0,
pRegDisposition,
(INT64)&Object);
v4 = Object;
if( !Object )
return 0i64;
GroupOrderIndex = PpInitGetGroupOrderIndex(0i64);
*(&stru_140C452E0 + 122) = GroupOrderIndex;
v71 = 0xFFFF;
if( (unsigned __int16)GroupOrderIndex == 0xFFFF )
{
if( *(&stru_140CF2E80 + 920) && *(_QWORD *)(*(&stru_140CF2E80 + 920) + 8i64) )
{
v49 = 16i64;
goto LABEL_122;
}
return 0i64;
}
*(&stru_140C452E0 + 63) = ExAllocatePoolWithTag(1ui64, 16i64 * GroupOrderIndex, 1852403792i64);
v6 = *(&stru_140C452E0 + 63);
if( !*(&stru_140C452E0 + 63) )
{
if( *(&stru_140CF2E80 + 920) && *(_QWORD *)(*(&stru_140CF2E80 + 920) + 8i64) )
{
v49 = 17i64;
goto LABEL_122;
}
return 0i64;
}
v7 = *(&stru_140C452E0 + 122);
for( i = 0; i < v7; *v10 = v10 )
{
v9 = i++;
v10 = (_QWORD *)(v6 + 16 * v9);
v10[1] = v10;
}
PipInitializeDriverDependentDLLs(2, (_LIST_ENTRY *)v2);
RtlInitUnicodeString(&DestinationString, L"System Reserved");
RtlInitUnicodeString(&String2, L"Boot Bus Extender");
v11 = word_140C50A34[0];
v12 = 0;
v13 = 0;
if( !word_140C50A34[0] )
goto LABEL_18;
do
{
v14 = (const _UNICODE_STRING *)((char *)qword_140C50A38 + 16 * v13);
if( !RtlCompareUnicodeString(v14, &DestinationString, 1u) )
goto LABEL_20;
if( !RtlCompareUnicodeString(v14, &String2, 1u) )
{
LOWORD(v71) = v13;
LABEL_20:
++v12;
}
if( v12 >= 2u )
break;
++v13;
}
while( v13 < v11 );
v2 = v75;
v4 = Object;
LABEL_18:
Flink = v2->BootDriverListHead.Flink;
while( Flink != &v2->BootDriverListHead )
{
v18 = Flink;
Flink = Flink->Flink;
if( SLODWORD(v18[3].Blink) >= 0 )
{
PoolWithTag = ExAllocatePoolWithTag(1ui64, 0x30ui64, 1852403792i64);
v20 = PoolWithTag;
if( PoolWithTag )
{
PoolWithTag[2] = 0i64;
PoolWithTag[4] = 0i64;
PoolWithTag[5] = 0i64;
PoolWithTag[1] = PoolWithTag;
*PoolWithTag = PoolWithTag;
PoolWithTag[3] = v18;
if( IopOpenRegistryKeyEx(&Handle, 0i64, (_UNICODE_STRING *)&v18[2], 0x20019ui64) < 0 )
{
ExFreePoolWithTag(v20, 0);
}
else
{
v20[4] = Handle;
v21 = PpInitGetGroupOrderIndex(Handle);
DriverTagPriority = PipGetDriverTagPriority(Handle);
*((_WORD *)v20 + 22) = DriverTagPriority;
v23 = (__int64 **)(*(&stru_140C452E0 + 63) + 16i64 * v21);
for( j = *v23; j != (__int64 *)v23 && *((_WORD *)j + 22) <= DriverTagPriority; j = (__int64 *)*j )
;
v16 = (VOID *)j[1];
v17 = *(_QWORD **)v16;
if( *(VOID **)(*(_QWORD *)v16 + 8i64) != v16 )
goto LABEL_143;
*v20 = v17;
v20[1] = v16;
v17[1] = v20;
*(_QWORD *)v16 = v20;
}
}
}
}
PnpNotifyEarlyLaunchStatusUpdate(1);
v25 = 0i64;
v26 = 0;
if( !*(&stru_140C452E0 + 122) )
{
LABEL_37:
PnpNotifyEarlyLaunchStatusUpdate(2);
PipUnloadEarlyLaunchDrivers(v2);
*(&PnpReplaceEvent + 6681) = 1;
PnpRequestDeviceAction(0i64, 0, 0, 0i64, 0i64, 0i64, 0i64);
if( PnpWaitForDevicesToStart() )
{
if( IopCallBootDriverReinitializationRoutines() && !PnpWaitForDevicesToStart() )
{
if( !*(&stru_140CF2E80 + 920) || !*(_QWORD *)(*(&stru_140CF2E80 + 920) + 8i64) )
return 0i64;
v49 = 20i64;
LABEL_122:
HdlspKernelAddLogEntry(v49, 0i64);
return 0i64;
}
if( memicmp(v2->ArcBootDeviceName, "ramdisk(", 8u) )
v30 = -1073741275;
else
v30 = RamdiskStart(v2);
if( (v30 < 0 || PnpWaitForDevicesToStart()) && (VhdInitialize((INT64)v2) < 0 || PnpWaitForDevicesToStart()) )
{
if( IopCreateArcNames(v2) < 0 )
return 0i64;
PnpBootDeviceWait(
(__int64)v2,
1,
(__int64(__fastcall *)(__int64, __int64, _UNICODE_STRING *))IopMarkBootPartition,
0i64);
Extension = v2->Extension;
*(&PnpReplaceEvent + 6682) = 1;
if( (Extension->_bf_84 & 0x400) != 0
&& (SbpStartLanman() < 0 || SbpWaitForVmbus() < 0 || SbpAddTransportToInstance() < 0) )
{
return 0i64;
}
ArcOSDataDeviceName = (__int64)v2->ArcOSDataDeviceName;
if( ArcOSDataDeviceName )
{
if( (int)PnpBootDeviceWait(
(__int64)v2,
3,
(__int64(__fastcall *)(__int64, __int64, _UNICODE_STRING *))PipCriticalDeviceWaitCallback,
ArcOSDataDeviceName) < 0 )
return 0i64;
}
p_AttachedHives = &v2->Extension->AttachedHives;
v34 = p_AttachedHives->Flink;
if( p_AttachedHives->Flink != p_AttachedHives )
{
while( (LODWORD(v34[1].Blink) & 0x80u) == 0
|| (int)PnpBootDeviceWait(
(__int64)v2,
4,
(__int64(__fastcall *)(__int64, __int64, _UNICODE_STRING *))PipCriticalDeviceWaitCallback,
(__int64)v34[5].Blink) >= 0 )
{
v34 = v34->Flink;
if( v34 == &v2->Extension->AttachedHives )
goto LABEL_51;
}
return 0i64;
}
LABEL_51:
if( PiCreateDriverDataDirectoryRoot() < 0 )
return 0i64;
pszDest[0] = 0;
Index = PipHardwareConfigGetIndex(v35);
if( Index >= 0 )
{
LODWORD(dwFlags) = 2048;
Index = RtlStringCchPrintfExW((WCHAR *)pszDest, 0x40ui64, 0i64, 0i64, dwFlags, (WCHAR *)L"%d");
}
v37 = 0;
if( !*(&stru_140C452E0 + 122) )
{
LABEL_57:
ExFreePoolWithTag(*(&stru_140C452E0 + 63), 0);
PnpDiagnosticTrace(&KMPnPEvt_BootStart_Stop, 0, 0i64);
return 1i64;
}
while( 1 )
{
while( 1 )
{
v38 = (void **)(*(&stru_140C452E0 + 63) + 16i64 * v37);
v39 = *v38;
if( *v38 != v38 )
break;
if( (unsigned int)++v37 >= *(&stru_140C452E0 + 122) )
goto LABEL_57;
}
if( *((void ***)v39 + 1) != v38 )
break;
v45 = *(void ***)v39;
if( *(void **)(*(_QWORD *)v39 + 8i64) != v39 )
break;
*v38 = v45;
v45[1] = v38;
v46 = *((_QWORD *)v39 + 2);
if( Index >= 0 && !*((_BYTE *)v39 + 46) && !*(_QWORD *)(v46 + 8) )
{
if( *(_QWORD *)(*(_QWORD *)(v46 + 48) + 8i64) )
{
v47 = *(_DWORD *)(v46 + 16);
if( (v47 & 0x400) == 0
&& (v47 & 8) == 0
&& IopGetRegistryValue(
*((PVOID *)v39 + 4),
(PWCHAR)L"Start",
0i64,
(_KEY_VALUE_FULL_INFORMATION **)&HardwareConfigIndex[1]) >= 0 )
{
v48 = *(void **)&HardwareConfigIndex[1];
if( *(_DWORD *)(*(_QWORD *)&HardwareConfigIndex[1] + 4i64) == 4
&& *(_DWORD *)(*(_QWORD *)&HardwareConfigIndex[1] + 12i64) >= 4u )
{
*(_DWORD *)v69 = *(_DWORD *)(*(unsigned int *)(*(_QWORD *)&HardwareConfigIndex[1] + 8i64)
+ *(_QWORD *)&HardwareConfigIndex[1]);
if( !*(_DWORD *)v69 )
{
*(_DWORD *)v69 = 3;
if( PiCreateDriverRedirectedStateKey(*(_QWORD *)(v46 + 48) + 24) >= 0 )
{
v50 = v73;
}
else
{
v50 = (VOID *)*((_QWORD *)v39 + 4);
v73 = v50;
}
LODWORD(dwFlags) = 2;
if( PnpCtxRegCreateKey(
*(&stru_140CF2E80 + 607),
v50,
(WCHAR *)L"StartOverride",
0i64,
dwFlags,
0i64,
&hKey,
0i64) >= 0 )
{
LODWORD(pszFormat) = 4;
PnpCtxRegSetValue((HPNPCTX *)4, hKey, (WCHAR *)pszDest, 4ui64, v69, pszFormat);
PnpCtxRegCloseKey(
v51,
hKey,
v52,
v53,
dwFlagsa,
pszFormata,
(INT64)phkResult,
(INT64)pRegDispositionb);
hKey = 0i64;
if( (byte_140C130BB & 1) != 0 )
{
v54 = (unsigned __int16 *)(*(_QWORD *)(v46 + 48) + 24i64);
Object = 0i64;
if( (int)PnpUnicodeStringToWstr((__int16 **)&Object, 0i64, v54) >= 0 )
{
v58 = Object;
if( (byte_140C130BB & 1) != 0 )
McTemplateK0dzd_EtwWriteTransfer(
v56,
v55,
v57,
HardwareConfigIndex[0],
(const WCHAR *)Object,
v69[0]);
PnpUnicodeStringToWstrFree(v58, *(_QWORD *)(v46 + 48) + 24i64);
}
}
}
if( v50 != *((VOID **)v39 + 4) )
{
ZwClose((_HANDLE)v50);
v73 = 0i64;
}
}
}
ExFreePoolWithTag(v48, 0);
}
}
}
if( v46 )
ObfDereferenceObjectWithTag((VOID *)v46, 0x746C6644ui64);
if( *((_BYTE *)v39 + 46) )
*(_DWORD *)(*(_QWORD *)(*((_QWORD *)v39 + 3) + 48i64) + 104i64) |= 0x20000u;
ZwClose(*((_QWORD *)v39 + 4));
ExFreePoolWithTag(v39, 0);
}
LABEL_143:
__fastfail(3u);
}
}
if( !*(&stru_140CF2E80 + 920) || !*(_QWORD *)(*(&stru_140CF2E80 + 920) + 8i64) )
return 0i64;
v49 = 19i64;
goto LABEL_122;
}
LABEL_32:
v27 = 16i64 * v26;
v28 = v27 + *(&stru_140C452E0 + 63);
v29 = *(__int64 **)(v27 + *(&stru_140C452E0 + 63));
while( 1 )
{
if( v29 == (__int64 *)v28 )
{
if( v26 == (_WORD)v71 )
{
IopAllocateLegacyBootResources(Internal, 0i64);
*(&PnpReplaceEvent + 6680) = 1;
*(&PnpReplaceEvent + 683) = IopAllocateBootResources;
}
if( (unsigned int)++v26 >= *(&stru_140C452E0 + 122) )
goto LABEL_37;
goto LABEL_32;
}
Handle = (VOID *)v29[4];
v41 = v29[3];
v75 = (_LOADER_PARAMETER_BLOCK *)v41;
*(_QWORD *)&DestinationString.Length = *(_QWORD *)(v41 + 48);
*((_BYTE *)v29 + 47) = 1;
if( IopGetDriverNameFromKeyNode(Handle, &DriverName) >= 0 )
{
if( IopGetRegistryValue(Handle, (PWCHAR)L"Group", 0i64, (_KEY_VALUE_FULL_INFORMATION **)&HardwareConfigIndex[1]) >= 0 )
{
v42 = *(void **)&HardwareConfigIndex[1];
if( *(_DWORD *)(*(_QWORD *)&HardwareConfigIndex[1] + 12i64) )
{
GroupName.Length = *(_WORD *)(*(_QWORD *)&HardwareConfigIndex[1] + 12i64);
GroupName.MaximumLength = GroupName.Length;
GroupName.Buffer = (wchar_t *)(*(_QWORD *)&HardwareConfigIndex[1]
+ *(unsigned int *)(*(_QWORD *)&HardwareConfigIndex[1] + 8i64));
v25 = PipLookupGroupName(&GroupName, 1ui64);
}
ExFreePoolWithTag(v42, 0);
v41 = (__int64)v75;
}
v4 = 0i64;
if( !(unsigned int)PipCheckDependencies(Handle) )
goto LABEL_96;
v4 = (_QWORD *)v29[2];
Object = v4;
if( !v4 && !*((_BYTE *)v29 + 46) )
{
started = PnpInitializeBootStartDriver(
&DriverName,
v41 + 32,
*(_QWORD *)(*(_QWORD *)&DestinationString.Length + 56i64),
*(INT64 *)&DestinationString.Length,
&v2->LoadOrderListHead,
0,
1,
pRegDispositiona,
(INT64)&Object);
v4 = Object;
*((_DWORD *)v29 + 10) = started;
if( !v4 )
goto LABEL_96;
ObfReferenceObjectWithTag(v4, 0x746C6644ui64);
}
if( v4 )
{
if( v25 )
++v25[7];
v29[2] = (__int64)v4;
goto LABEL_72;
}
LABEL_96:
*((_BYTE *)v29 + 46) = 1;
LABEL_72:
ExFreePoolWithTag(DriverName.Buffer, 0);
v25 = 0i64;
goto LABEL_73;
}
*((_BYTE *)v29 + 46) = 1;
LABEL_73:
if( !*((_BYTE *)v29 + 46) )
{
PnpLockDeviceActionQueue();
PipApplyFunctionToServiceInstances(v44, (VOID *)(v4[6] + 24i64));
PnpUnlockDeviceActionQueue();
PnpWaitForEmptyDeviceActionQueue();
PnpRequestDeviceAction(0i64, 7, 0, 0i64, 0i64, 0i64, 0i64);
}
if( PnpWaitForEmptyDeviceEventQueue() < 0 )
break;
v29 = (__int64 *)*v29;
v28 = v27 + *(&stru_140C452E0 + 63);
}
if( *(&stru_140CF2E80 + 920) && *(_QWORD *)(*(&stru_140CF2E80 + 920) + 8i64) )
{
v49 = 18i64;
goto LABEL_122;
}
return 0i64;
}Referenced by:
IoInitSystemPreDrivers