IopInitializePlugPlayServices
NTSTATUS __stdcall IopInitializePlugPlayServices(_LOADER_PARAMETER_BLOCK *LoaderBlock, UINT64 Phase){
unsigned int *v3;
WCHAR v4;
unsigned int *v5;
WCHAR v6;
NTSTATUS result;
INT64 v8;
INT64 v9;
INT64 v10;
INT64 v11;
NTSTATUS CachedContextBaseKey;
INT64 v13;
INT64 v14;
INT64 v15;
INT64 v16;
INT64 v17;
INT64 v18;
INT64 v19;
HANDLE v20;
HANDLE v21;
LPGUID v22;
_DEVICE_OBJECT *v23;
PDEVICE_OBJECT v24;
UNICODE_STRING *v25;
_PNP_DEVNODE_STATE *v26;
INT64 v27;
INT64 v28;
INT64 v29;
INT64 v30;
unsigned __int64 v31;
__int64 v32;
INT64 v33;
INT64 v34;
WCHAR v35;
PUNICODE_STRING Class;
struct _OBJECT_ATTRIBUTES *Classa;
PUNICODE_STRING Classb;
UINT64 CreateOptions;
UINT8 SystemFirmwareUpdated[8];
HANDLE Handle;
PVOID P;
UNICODE_STRING KeyName;
void *KeyHandle;
PVOID v45;
PVOID BaseHandle;
PVOID v47;
PVOID v48;
PVOID v49;
HANDLE v50;
PDEVICE_OBJECT DeviceObject;
UINT64 Disposition;
UNICODE_STRING v53;
UNICODE_STRING GuidString;
UNICODE_STRING InsertionString2;
struct _UNICODE_STRING DestinationString;
struct _OBJECT_ATTRIBUTES ObjectAttributes;
struct _EVENT_DATA_DESCRIPTOR UserData;
struct _EVENT_DATA_DESCRIPTOR v59;
PDEVICE_OBJECT *p_DeviceObject;
__int64 v61;
HANDLE *v62;
__int64 v63;
PVOID *v64;
__int64 v65;
PVOID *v66;
__int64 v67;
PVOID *v68;
__int64 v69;
PVOID *p_BaseHandle;
__int64 v71;
PVOID *v72;
__int64 v73;
PVOID *p_P;
__int64 v75;
UNICODE_STRING *v76;
__int64 v77;
v50 = 0i64;
Handle = 0i64;
BaseHandle = 0i64;
*(_DWORD *)(&KeyName.MaximumLength + 1) = 0;
DeviceObject = 0i64;
LODWORD(Disposition) = 0;
*(&ObjectAttributes.Length + 1) = 0;
*(&ObjectAttributes.Attributes + 1) = 0;
v45 = 0i64;
P = 0i64;
v47 = 0i64;
v48 = 0i64;
v49 = 0i64;
KeyHandle = 0i64;
*(_DWORD *)(&v53.MaximumLength + 1) = 0;
*(_DWORD *)(&GuidString.MaximumLength + 1) = 0;
SystemFirmwareUpdated[0] = 0;
DestinationString = 0i64;
InsertionString2 = 0i64;
if( (_DWORD)Phase )
{
if( (_DWORD)Phase != 1 )
return -1073741584;
result = PnpDiagInitialize((INT64)LoaderBlock, Phase);
if( result >= 0 )
{
PnpTraceInitialize();
result = PiDcInit(1ui64);
if( result >= 0 )
{
result = PiUEventInit(1ui64);
if( result >= 0 )
{
v31 = *((_QWORD *)LoaderBlock + 30) + 136i64;
*(_QWORD *)&UserData.Size = 80i64;
UserData.Ptr = v31;
PnpDiagnosticTrace(&KMPnPEvt_OsLoader_Time, 1ui64, &UserData);
if( (unsigned int)dword_140C02E30 > 4 && tlgKeywordOn((__int64)&dword_140C02E30, 0x400000000000i64) )
{
v32 = *((_QWORD *)LoaderBlock + 30);
DeviceObject = *(PDEVICE_OBJECT *)(v32 + 136);
p_DeviceObject = &DeviceObject;
v61 = 8i64;
v50 = *(HANDLE *)(v32 + 144);
v62 = &v50;
v63 = 8i64;
v49 = *(PVOID *)(v32 + 152);
v64 = &v49;
v65 = 8i64;
v48 = *(PVOID *)(v32 + 160);
v66 = &v48;
v67 = 8i64;
v47 = *(PVOID *)(v32 + 184);
v68 = &v47;
v69 = 8i64;
BaseHandle = *(PVOID *)(v32 + 192);
p_BaseHandle = &BaseHandle;
v71 = 8i64;
v45 = *(PVOID *)(v32 + 168);
v72 = &v45;
v73 = 8i64;
P = *(PVOID *)(v32 + 176);
p_P = &P;
v75 = 8i64;
*(_QWORD *)&v53.Length = *(_QWORD *)(v32 + 2496);
v76 = &v53;
v77 = 8i64;
tlgWriteTransfer_EtwWriteTransfer(
(__int64)&dword_140C02E30,
(unsigned __int8 *)byte_14002408B,
0i64,
0i64,
0xBu,
&v59);
}
TraceLoggingUnregister_EtwUnregister((INT64)&dword_140C02E30);
result = PiPnpRtlInit(1ui64);
if( result >= 0 )
{
result = PiCslInitialize(v34, v33, v35);
if( result >= 0 )
{
CachedContextBaseKey = PiDmaGuardInitialize(1i64);
if( CachedContextBaseKey >= 0 )
{
result = PiKsrInitialize();
if( result < 0 )
return result;
PnpRequestDeviceAction(
*((_DEVICE_OBJECT **)IopRootDeviceNode + 4),
ReenumerateRootDevices,
0,
0i64,
0i64,
0i64);
KeInitializeEvent(&PnpShutdownEvent, NotificationEvent, 0);
if( (*(_DWORD *)(*((_QWORD *)LoaderBlock + 30) + 132i64) & 0x400) == 0 )
PpInitializeBootDDB(LoaderBlock, 1ui64);
return 0;
}
return CachedContextBaseKey;
}
}
}
}
}
}
else
{
PnPInitialized = 0;
PnpSystemHiveLimits = 80;
dword_140C50A54 = 90;
CmRegisterSystemHiveLimitCallback(LoaderBlock);
PnpSystemHiveTooLarge = 0;
ObjectAttributes.ObjectName = &CmRegistryMachineHardwareDescriptionSystemName;
ObjectAttributes.Length = 48;
LODWORD(CreateOptions) = 0;
ObjectAttributes.RootDirectory = 0i64;
ObjectAttributes.Attributes = 576;
*(_OWORD *)&ObjectAttributes.SecurityDescriptor = 0i64;
if( ZwCreateKey(&KeyHandle, 0xF003Fui64, &ObjectAttributes, 0i64, 0i64, CreateOptions, &Disposition) >= 0 )
{
if( IopGetRegistryValue(KeyHandle, (PWCHAR)L"OldSystemBiosDate", 0i64, (KEY_VALUE_FULL_INFORMATION **)&v45) >= 0 )
{
v3 = (unsigned int *)v45;
if( v45 )
{
if( IopGetRegistryValue(KeyHandle, (PWCHAR)L"SystemBiosDate", 0i64, (KEY_VALUE_FULL_INFORMATION **)&P) >= 0 )
{
v5 = (unsigned int *)P;
if( P )
{
RtlInitUnicodeString(&DestinationString, (PCWSTR)((char *)v3 + v3[2]), v4);
RtlInitUnicodeString(&InsertionString2, (PCWSTR)((char *)v5 + v5[2]), v6);
LODWORD(Class) = 0;
PnpLogEvent(&DestinationString, &InsertionString2, 1073741868i64, 0i64, (UINT64)Class);
ExFreePoolWithTag(v5, 0);
}
}
ExFreePoolWithTag(v3, 0);
}
}
ZwClose(KeyHandle);
}
result = PnpDeviceCompletionQueueInitialize();
if( result >= 0 )
{
PiInitFirmwareResources(LoaderBlock);
if( (*(_DWORD *)(*((_QWORD *)LoaderBlock + 30) + 132i64) & 0x400) == 0 )
PpInitializeBootDDB(LoaderBlock, 0i64);
PipInitDeviceOverrideCache();
KeInitializeEvent(&PnpSystemDeviceEnumerationComplete, NotificationEvent, 0);
result = PiInitCacheGroupInformation();
if( result >= 0 )
{
KeInitializeSemaphore(&PpRegistrySemaphore, 1i64, 1i64);
result = PnpInitializeLegacyBusInformationTable();
if( result >= 0 )
{
IopInitializeResourceMap(LoaderBlock);
IopAllocateBootResourcesRoutine = (__int64)IopReportBootResources;
IopInitReservedResourceList = 0i64;
PnpDefaultInterfaceType = 1;
ArbInitializeOsInaccessibleRange((unsigned int)dword_140C4DC20);
CachedContextBaseKey = IopPortInitialize(v9, v8);
if( CachedContextBaseKey < 0 )
return CachedContextBaseKey;
CachedContextBaseKey = IopMemInitialize(v11, v10);
if( CachedContextBaseKey < 0 )
return CachedContextBaseKey;
CachedContextBaseKey = IopDmaInitialize(v14, v13);
if( CachedContextBaseKey < 0 )
return CachedContextBaseKey;
CachedContextBaseKey = IopIrqInitialize(v16, v15);
if( CachedContextBaseKey < 0 )
return CachedContextBaseKey;
CachedContextBaseKey = IopBusNumberInitialize(v18, v17);
if( CachedContextBaseKey < 0 )
return CachedContextBaseKey;
CachedContextBaseKey = PiPnpRtlInit(0i64);
if( CachedContextBaseKey < 0 )
return CachedContextBaseKey;
PipMigratePnpState();
CachedContextBaseKey = PiDmInit();
if( CachedContextBaseKey < 0 )
return CachedContextBaseKey;
CachedContextBaseKey = PnpCtxGetCachedContextBaseKey(PiPnpRtlCtx, 4, (__int64 *)&BaseHandle);
if( CachedContextBaseKey < 0 )
return CachedContextBaseKey;
KeyName.Buffer = L"Control\\Pnp";
*(_DWORD *)&KeyName.Length = 1572886;
LODWORD(Class) = 0;
if( IopCreateRegistryKeyEx(&Handle, BaseHandle, &KeyName, 0xF003Fui64, (UINT64)Class, 0i64) >= 0 )
{
if( IopGetRegistryValue(Handle, (PWCHAR)L"AsynchronousOptions", 0i64, (KEY_VALUE_FULL_INFORMATION **)&v47) >= 0 )
{
if( *((_DWORD *)v47 + 1) == 4 && *((_DWORD *)v47 + 3) == 4 )
PnpAsyncOptions = *(_DWORD *)((char *)v47 + *((unsigned int *)v47 + 2));
ExFreePoolWithTag(v47, 0);
}
if( IopGetRegistryValue(Handle, (PWCHAR)L"BootOptions", 0i64, (KEY_VALUE_FULL_INFORMATION **)&v48) >= 0 )
{
if( *((_DWORD *)v48 + 1) == 4 && *((_DWORD *)v48 + 3) == 4 )
PnpBootOptions = *(_DWORD *)((char *)v48 + *((unsigned int *)v48 + 2));
ExFreePoolWithTag(v48, 0);
}
if( IopGetRegistryValue(
Handle,
(PWCHAR)L"FindBestConfigurationTimeout",
0i64,
(KEY_VALUE_FULL_INFORMATION **)&v49) >= 0 )
{
if( *((_DWORD *)v49 + 1) == 4 && *((_DWORD *)v49 + 3) == 4 )
PnpFindBestConfigurationTimeout = *(_DWORD *)((char *)v49 + *((unsigned int *)v49 + 2));
ExFreePoolWithTag(v49, 0);
}
PiDmaGuardProcessRegistry(Handle);
IopQueryDeviceResetRegistrySettings(Handle);
ZwClose(Handle);
}
*(_DWORD *)&KeyName.Length = 4063292;
KeyName.Buffer = L"\\Registry\\Machine\\System\\Setup";
if( (int)IopOpenRegistryKeyEx(&Handle, 0i64, &KeyName, 0x20019ui64) >= 0 )
{
PipUpdateSetupInProgress(Handle);
if( IopGetRegistryValue(Handle, (PWCHAR)L"Upgrade", 0i64, (KEY_VALUE_FULL_INFORMATION **)&P) >= 0 )
{
if( *((_DWORD *)P + 1) == 4
&& *((_DWORD *)P + 3) == 4
&& *(_DWORD *)((char *)P + *((unsigned int *)P + 2)) )
{
PnpSetupUpgradeInProgress = 1;
}
ExFreePoolWithTag(P, 0);
}
if( IopGetRegistryValue(Handle, (PWCHAR)L"RollbackActive", 0i64, (KEY_VALUE_FULL_INFORMATION **)&P) >= 0 )
{
if( *((_DWORD *)P + 1) == 4
&& *((_DWORD *)P + 3) == 4
&& *(_DWORD *)((char *)P + *((unsigned int *)P + 2)) )
{
PnpSetupRollbackActiveInProgress = 1;
}
ExFreePoolWithTag(P, 0);
}
if( PnpSetupInProgress || PnpSetupOOBEInProgress )
{
qword_140C454F0 = (__int64)PipUpdateSetupInProgressCallback;
qword_140C454F8 = (__int64)Handle;
*(_QWORD *)PnpSetupWorkItem = 0i64;
PipUpdateSetupInProgressNotify(Handle);
}
else
{
ZwClose(Handle);
}
Handle = 0i64;
}
CachedContextBaseKey = PipHardwareConfigInit((PGUID)(*((_QWORD *)LoaderBlock + 30) + 2568i64));
if( CachedContextBaseKey < 0 )
return CachedContextBaseKey;
PipCheckSystemFirmwareUpdated(SystemFirmwareUpdated);
CachedContextBaseKey = PiDcInit(0i64);
if( CachedContextBaseKey < 0 )
return CachedContextBaseKey;
CachedContextBaseKey = PiAuCreateSecurityObjects();
if( CachedContextBaseKey < 0 )
return CachedContextBaseKey;
CachedContextBaseKey = PiDqInit();
if( CachedContextBaseKey < 0 )
return CachedContextBaseKey;
CachedContextBaseKey = PpDevCfgInit();
if( CachedContextBaseKey < 0 )
return CachedContextBaseKey;
PipResetDevices(v19);
CachedContextBaseKey = CmCreateDevice(PiPnpRtlCtx, L"HTREE\\ROOT\\0", 983103, &v50, 0i64, 0);
if( CachedContextBaseKey < 0 )
return CachedContextBaseKey;
v20 = v50;
CmSetDeviceRegProp(
PiPnpRtlCtx,
L"HTREE\\ROOT\\0",
(__int64)v50,
0x25u,
1u,
(__int64)L"{00000000-0000-0000-FFFF-FFFFFFFFFFFF}",
0x4Eu,
0);
HIDWORD(Disposition) = 0;
CmSetDeviceRegProp(PiPnpRtlCtx, L"HTREE\\ROOT\\0", (__int64)v20, 0xBu, 4u, (__int64)&Disposition + 4, 4u, 0);
ZwClose(v20);
qword_140C44A18 = (__int64)&IopPendingEjects;
IopPendingEjects = (__int64)&IopPendingEjects;
qword_140C44A28 = (__int64)&IopPendingSurpriseRemovals;
IopPendingSurpriseRemovals = &IopPendingSurpriseRemovals;
ExInitializeResourceLite(&IopDeviceTreeLock);
ExInitializeResourceLite(&IopSurpriseRemoveListLock);
ExInitializeResourceLite(&PnpDevicePropertyLock);
ExInitializeResourceLite(&PiEngineLock);
PnpSpinLock = 0i64;
KeInitializeGuardedMutex(&PiResourceListLock);
PnpRebuildPowerRelationsQueueLock.Count = 1;
PnpRebuildPowerRelationsQueueLock.Event.Header.WaitListHead.Blink = &PnpRebuildPowerRelationsQueueLock.Event.Header.WaitListHead;
PnpRebuildPowerRelationsQueueLock.Event.Header.WaitListHead.Flink = &PnpRebuildPowerRelationsQueueLock.Event.Header.WaitListHead;
PnpRebuildPowerRelationsQueueLock.Owner = 0i64;
PnpRebuildPowerRelationsQueueLock.Contention = 0;
LOWORD(PnpRebuildPowerRelationsQueueLock.Event.Header.Lock) = 1;
PnpRebuildPowerRelationsQueueLock.Event.Header.Size = 6;
PnpRebuildPowerRelationsQueueLock.Event.Header.SignalState = 0;
CachedContextBaseKey = PiDeviceDependencyInit();
if( CachedContextBaseKey < 0 )
return CachedContextBaseKey;
CachedContextBaseKey = PnpInitializeDeviceActions();
if( CachedContextBaseKey < 0 )
return CachedContextBaseKey;
PpProfileInit();
IopWarmEjectPdo = 0i64;
KeInitializeEvent(&IopWarmEjectLock, SynchronizationEvent, 1u);
*(_DWORD *)&KeyName.Length = 2490404;
KeyName.Buffer = L"\\Driver\\PnpManager";
CachedContextBaseKey = IoCreateDriver((PHANDLE)&KeyName, (ACCESS_MASK)PipPnPDriverEntry, v21, v22, Classa);
if( CachedContextBaseKey < 0 )
return CachedContextBaseKey;
LODWORD(Classb) = 0;
CachedContextBaseKey = IoCreateDevice(PnpDriverObject, 0i64, 0i64, 4ui64, (UINT64)Classb, 0, &DeviceObject);
if( CachedContextBaseKey < 0 )
return CachedContextBaseKey;
v23 = DeviceObject;
v24 = DeviceObject;
*((_DWORD *)DeviceObject + 12) |= 0x1000u;
CachedContextBaseKey = PipAllocateDeviceNode((__int64)v24, &IopRootDeviceNode);
if( !IopRootDeviceNode )
{
IoDeleteDevice(v23);
IoDeleteDriver(PnpDriverObject);
LABEL_73:
if( CachedContextBaseKey >= 0 )
{
CachedContextBaseKey = CmAddDeviceToContainer(
PiPnpRtlCtx,
L"{00000000-0000-0000-FFFF-FFFFFFFFFFFF}",
L"{00000000-0000-0000-FFFF-FFFFFFFFFFFF}",
L"HTREE\\ROOT\\0",
0i64);
if( CachedContextBaseKey >= 0 )
{
if( SystemFirmwareUpdated[0] )
PiDcHandleSystemFirmwareUpdate();
PnpInitializePnpWatchdogs();
CachedContextBaseKey = PnpInitializeDeviceEvents();
if( CachedContextBaseKey >= 0 )
{
PnpInitializeNotification();
CachedContextBaseKey = PnpBusTypeGuidInitialize();
if( CachedContextBaseKey >= 0 )
{
KeInitializeEvent(&PnpReplaceEvent, SynchronizationEvent, 1u);
CachedContextBaseKey = PiSwInit();
if( CachedContextBaseKey >= 0 )
{
CachedContextBaseKey = PiUEventInit(0i64);
if( CachedContextBaseKey >= 0 )
{
CachedContextBaseKey = PiDaInit(v28, v27, v29, v30);
if( CachedContextBaseKey >= 0 )
{
CachedContextBaseKey = PiDmaGuardInitialize(0i64);
if( CachedContextBaseKey >= 0 )
{
PipProcessPendingOperations();
PnpRequestDeviceAction(
*((_DEVICE_OBJECT **)IopRootDeviceNode + 4),
ReenumerateRootDevices,
0,
0i64,
0i64,
0i64);
}
}
}
}
}
}
}
}
return CachedContextBaseKey;
}
PipSetDevNodeFlags((__int64)IopRootDeviceNode, 305);
PipSetDevNodeUserFlags((__int64)IopRootDeviceNode, 10);
*((_DWORD *)IopRootDeviceNode + 165) = -2;
CachedContextBaseKey = PnpAllocateDeviceInstancePath((__int64)IopRootDeviceNode, 0x1Au);
if( CachedContextBaseKey >= 0 )
{
*(_DWORD *)&v53.Length = 1703960;
v53.Buffer = (wchar_t *)L"HTREE\\ROOT\\0";
PnpCopyDeviceInstancePath((__int64)IopRootDeviceNode, &v53, v25);
CachedContextBaseKey = PnpMapDeviceObjectToDeviceInstance(
*((DEVICE_OBJECT **)IopRootDeviceNode + 4),
(UNICODE_STRING *)((char *)IopRootDeviceNode + 40));
if( CachedContextBaseKey >= 0 )
{
*(_DWORD *)&GuidString.Length = 5111884;
GuidString.Buffer = (wchar_t *)L"{00000000-0000-0000-FFFF-FFFFFFFFFFFF}";
RtlGUIDFromString(&GuidString, (GUID *)((char *)IopRootDeviceNode + 664));
PnpQueryAndSaveDeviceNodeCapabilities((__int64)IopRootDeviceNode);
PipSetDevNodeState((_DEVICE_NODE *)IopRootDeviceNode, DeviceNodeStarted, v26);
goto LABEL_73;
}
}
return CachedContextBaseKey;
}
}
}
}
return result;
}Referenced by:
IoInitSystemPreDrivers