PiProcessNewDeviceNode
NTSTATUS __stdcall PiProcessNewDeviceNode(_DEVICE_NODE *DeviceNode){
__int64 v2;
int v3;
VOID *v4;
_DEVICE_OBJECT *PhysicalDeviceObject;
int v6;
WORD *v7;
NTSTATUS v8;
PROFILE_STATUS v9;
char v10;
PROFILE_STATUS v11;
__int64 v12;
__int64 v13;
NTSTATUS v14;
NTSTATUS v15;
WCHAR *v16;
__int64 v17;
__int64 v18;
int v19;
__int64 v20;
int v21;
_DEVICE_OBJECT *v22;
_DEVICE_OBJECT *v23;
int v24;
_ETHREAD *v25;
wchar_t *Buffer;
int v27;
int v28;
int v29;
int v30;
WCHAR *v31;
WCHAR *v32;
UINT8 v33;
VOID *v34;
_ETHREAD *v35;
INT64 v36;
_ETHREAD *v37;
_ETHREAD *v38;
VOID *v39;
wchar_t *v40;
UINT8 *v41;
int v42;
int v43;
char v44;
int v45;
int v46;
PVOID v47;
int AlternateStringData;
unsigned int v49;
NTSTATUS v50;
NTSTATUS v51;
_ETHREAD *v52;
int v53;
INT64 v54;
INT64 v55;
HPNPOPCTX *v56;
_DEVICE_NODE *Parent;
PWCHAR v59;
__int64 v60;
_ETHREAD *CurrentThread;
UINT64 v62;
NTSTATUS FailedInstallProblemStatus;
unsigned int v64;
__int64 v65;
__int64 v66;
wchar_t *v67;
int v68;
bool v69;
UINT64 v70;
NTSTATUS v71;
unsigned int Problem;
int v73;
WCHAR v74;
__int16 *p_Type;
_UNICODE_STRING *p_DriverName;
VOID **v77;
VOID **v78;
_DEVOBJ_EXTENSION *DeviceObjectExtension;
_WORD *v80;
__int64 v81;
_WORD *v82;
__int64 v83;
__int16 *v84;
_UNICODE_STRING *v85;
VOID **v86;
VOID **v87;
_DEVOBJ_EXTENSION *v88;
_WORD *v89;
__int64 v90;
_WORD *v91;
__int64 v92;
unsigned int v93;
unsigned int v94;
NTSTATUS v95;
int v96;
char v97;
unsigned int v98;
int v99;
unsigned int v100;
int v101;
unsigned int v102;
UINT64 *CmRegPropType;
UINT64 *PropertySize;
UINT64 Flags;
bool v106;
char v107[3];
UINT8 PropertyBuffer[4];
unsigned __int8 Removable[4];
int v110;
UINT64 Disposition;
PVOID InstanceKey;
UINT64 v113;
int v114;
UINT64 ConfigFlagsUpdate;
_DWORD v116[3];
PWCHAR InstanceID;
PCWSTR CompatibleIds;
PWCHAR DeviceID;
UINT64 v120;
PVOID P;
WCHAR *HardwareId;
WCHAR *GloballyUniqueId;
PWCHAR BusID;
int v125;
int v126;
__int64 v127;
PVOID v128;
WCHAR *Str;
WCHAR *ContainerID;
HPNPOPCTX *hPnpOpCtx;
_UNICODE_STRING DestinationString;
__int64 v133;
__int128 v134;
__int128 v135;
void(__fastcall *v136)(_QWORD, __int64 *);
_DEVICE_CAPABILITIES Capabilities;
_GUID Guid;
*(_QWORD *)&v116[1] = 0i64;
memset(&Capabilities, 0i64, sizeof(Capabilities));
Guid = 0i64;
CompatibleIds = 0i64;
DestinationString = 0i64;
P = 0i64;
hPnpOpCtx = 0i64;
HardwareId = 0i64;
InstanceID = 0i64;
v126 = 0;
v128 = 0i64;
ContainerID = 0i64;
v113 = 0i64;
v120 = 0i64;
Removable[0] = 0;
GloballyUniqueId = 0i64;
if( (byte_140C130BB & 8) != 0 )
McTemplateK0p_EtwWriteTransfer(v2, (const _EVENT_DESCRIPTOR *)KMPnPEvt_ProcessNewDevice_Start, 0i64, DeviceNode);
LOBYTE(v114) = 0;
v106 = 0;
v116[0] = 0;
v3 = 0;
v110 = 0;
v4 = 0i64;
PhysicalDeviceObject = DeviceNode->PhysicalDeviceObject;
v133 = *(_QWORD *)&KUSER_SHARED_DATA.SystemTime.LowPart;
*(_DWORD *)PropertyBuffer = 0;
LODWORD(ConfigFlagsUpdate) = 0;
v107[0] = 0;
InstanceKey = 0i64;
Disposition = 0i64;
PiPnpRtlBeginOperation(&hPnpOpCtx);
PipClearDevNodeFlags(DeviceNode, 0x2000000ui64);
Str = 0i64;
v125 = 0;
BusID = 0i64;
DeviceID = 0i64;
v6 = PnpQueryID(DeviceNode, 0, (UINT64 *)&Str, &v125);
if( v6 < 0 )
{
v68 = v6;
if( v6 == -1073479624 )
v68 = -1073741823;
v110 = v68;
}
else
{
BusID = Str;
v7 = wcschr(Str, 92);
*v7 = 0;
DeviceID = v7 + 1;
}
v8 = PpIrpQueryCapabilities(PhysicalDeviceObject, &Capabilities);
PipClearDevNodeUserFlags(DeviceNode, 2ui64);
v10 = 0;
if( v8 >= 0 )
{
if( (Capabilities._bf_4 & 0x20000) != 0 )
PipSetDevNodeUserFlags(DeviceNode, 2ui64);
if( (Capabilities._bf_4 & 0x40) != 0 )
v10 = 1;
}
if( (Capabilities._bf_4 & 0x20) != 0 )
{
if( DeviceNode->DockInfo.DockStatus == DOCK_EJECTIRP_COMPLETED )
PpProfileCancelTransitioningDock(DeviceNode, v9);
v11 = DOCK_QUIESCENT;
}
else
{
v11 = DOCK_NOTDOCKDEVICE;
}
DeviceNode->DockInfo.DockStatus = v11;
v127 = -1i64;
v136 = 0i64;
v134 = 0i64;
v135 = 0i64;
if( (int)PnpQueryInterface(
PhysicalDeviceObject,
(_IO_SECURITY_CONTEXT *)&GUID_PNP_EXTENDED_ADDRESS_INTERFACE,
1,
0x28u,
0i64,
&v134) >= 0 )
{
if( v136 )
{
if( WORD1(v134) == 1 )
{
v136(*((_QWORD *)&v134 + 1), &v127);
if( *((_QWORD *)&v135 + 1) )
(*((void(__fastcall **)(_QWORD))&v135 + 1))(*((_QWORD *)&v134 + 1));
}
}
}
PnpQueryDeviceText(DeviceNode->PhysicalDeviceObject, 0, v12, &P);
PnpQueryDeviceText(DeviceNode->PhysicalDeviceObject, 1, v13, &v128);
v14 = PnpQueryID(DeviceNode, 3, (UINT64 *)&InstanceID, &v126);
v15 = v14;
if( v10 )
{
if( v14 == -1073741637 )
{
PipSetDevNodeProblem(DeviceNode, 9ui64, -1073741637);
PipSetDevNodeFlags(DeviceNode->Parent, 0x200000ui64);
PnpSetInvalidIDEvent((const VOID **)&DeviceNode->Parent->InstancePath);
}
}
else if( (DeviceNode->Flags & 0x2000) == 0 || DeviceNode->Problem != 9 )
{
Parent = DeviceNode->Parent;
if( Parent != (_DEVICE_NODE *)*(&PnpReplaceEvent + 831) )
{
v16 = InstanceID;
goto LABEL_136;
}
}
v16 = InstanceID;
while( 1 )
{
if( v15 < 0 )
{
v69 = (DeviceNode->Flags & 0x2000) == 0;
v110 = v15;
if( v69 || DeviceNode->Problem != 9 )
{
if( v15 == -1073741670 )
{
v70 = 3i64;
v71 = -1073741670;
}
else
{
v71 = v15;
v70 = 19i64;
}
PipSetDevNodeProblem(DeviceNode, v70, v71);
}
}
v19 = PiBuildDeviceNodeInstancePath(DeviceNode, BusID, DeviceID, v16);
if( v19 >= 0 )
{
if( (byte_140C130BB & 8) != 0 )
McTemplateK0pz_EtwWriteTransfer(v18, v17, v20, DeviceNode, DeviceNode->InstancePath.Buffer);
v19 = PiCreateDeviceInstanceKey(DeviceNode, &InstanceKey, (UINT64 *)((char *)&Disposition + 4));
v21 = 0;
if( v19 < 0 )
{
PipSetDevNodeProblem(DeviceNode, 0x13ui64, v19);
v3 = HIDWORD(Disposition);
v4 = InstanceKey;
}
else
{
v3 = HIDWORD(Disposition);
v4 = InstanceKey;
if( HIDWORD(Disposition) == 1 )
v21 = 0x20000;
LODWORD(Disposition) = v21;
}
}
if( v19 >= 0 )
v19 = v110;
v110 = v19;
PpMarkDeviceStackExtensionFlag(PhysicalDeviceObject, 0x10ui64, 1u);
PipSetDevNodeState(DeviceNode, DeviceNodeInitialized);
if( (DeviceNode->Flags & 0x2000) != 0 )
{
Problem = DeviceNode->Problem;
if( Problem <= 0x13 )
{
v73 = 524808;
if( _bittest(&v73, Problem) )
break;
}
}
if( v3 == 1 )
{
CurrentThread = (_ETHREAD *)KeGetCurrentThread();
--CurrentThread->Tcb.KernelApcDisable;
ExAcquireResourceSharedLite((UINT64)&PnpReplaceEvent + 6688, 1);
v4 = InstanceKey;
if( InstanceKey && P )
{
v66 = -1i64;
do
++v66;
while( *((_WORD *)P + v66) );
LODWORD(Flags) = Disposition;
LODWORD(PropertySize) = 2 * v66 + 2;
LODWORD(CmRegPropType) = 1;
CmSetDeviceRegProp(
*(&stru_140CF2E80 + 607),
DeviceNode->InstancePath.Buffer,
InstanceKey,
CM_REG_PROP_DEVICEDESC,
(UINT64)CmRegPropType,
(UINT8 *)P,
(UINT64)PropertySize,
Flags);
}
ExReleaseResourceLite((PERESOURCE)((char *)&PnpReplaceEvent + 6688));
KeLeaveCriticalRegion();
v3 = HIDWORD(Disposition);
goto LABEL_31;
}
v22 = (_DEVICE_OBJECT *)PnpDeviceObjectFromDeviceInstanceWithTag((__int64)&DeviceNode->InstancePath, 0x65706E50u);
v23 = v22;
if( !v22 )
goto LABEL_30;
if( v22 == PhysicalDeviceObject )
{
ObfDereferenceObjectWithTag(v22, 0x65706E50ui64);
LABEL_30:
v19 = v110;
LABEL_31:
if( (DeviceNode->Flags & 0x2000) != 0 && DeviceNode->Problem == 42 )
PipClearDevNodeProblem(DeviceNode);
break;
}
if( !v10 )
{
PpvUtilFailDriver(
PPVERROR_DUPLICATE_PDO_ENUMERATED,
PhysicalDeviceObject->DriverObject->MajorFunction[27],
PhysicalDeviceObject,
v22);
IoAddTriageDumpDataBlock(PhysicalDeviceObject, (_BYTE *)PhysicalDeviceObject->Size);
p_Type = &PhysicalDeviceObject->DriverObject->Type;
if( p_Type )
{
IoAddTriageDumpDataBlock(p_Type, (_BYTE *)(unsigned int)p_Type[1]);
p_DriverName = &PhysicalDeviceObject->DriverObject->DriverName;
if( p_DriverName->Length )
{
IoAddTriageDumpDataBlock(p_DriverName, (_BYTE *)2);
IoAddTriageDumpDataBlock(
PhysicalDeviceObject->DriverObject->DriverName.Buffer,
(_BYTE *)PhysicalDeviceObject->DriverObject->DriverName.Length);
}
}
v77 = (VOID **)PhysicalDeviceObject->DeviceObjectExtension->DeviceNode;
if( v77 )
{
v78 = v77 + 5;
IoAddTriageDumpDataBlock(v77, (_BYTE *)0x310);
if( *(_WORD *)v78 )
{
IoAddTriageDumpDataBlock(v78, (_BYTE *)2);
IoAddTriageDumpDataBlock(v78[1], (_BYTE *)*(unsigned __int16 *)v78);
}
DeviceObjectExtension = PhysicalDeviceObject->DeviceObjectExtension;
v80 = DeviceObjectExtension->DeviceNode;
if( v80[28] )
{
IoAddTriageDumpDataBlock(v80 + 28, (_BYTE *)2);
IoAddTriageDumpDataBlock(
*((VOID **)PhysicalDeviceObject->DeviceObjectExtension->DeviceNode + 8),
(_BYTE *)*((unsigned __int16 *)PhysicalDeviceObject->DeviceObjectExtension->DeviceNode + 28));
DeviceObjectExtension = PhysicalDeviceObject->DeviceObjectExtension;
}
v81 = *((_QWORD *)DeviceObjectExtension->DeviceNode + 2);
if( v81 )
{
v82 = (_WORD *)(v81 + 56);
if( *v82 )
{
IoAddTriageDumpDataBlock(v82, (_BYTE *)2);
v83 = *((_QWORD *)PhysicalDeviceObject->DeviceObjectExtension->DeviceNode + 2);
IoAddTriageDumpDataBlock(*(VOID **)(v83 + 64), (_BYTE *)*(unsigned __int16 *)(v83 + 56));
}
}
}
IoAddTriageDumpDataBlock(v23, (_BYTE *)v23->Size);
v84 = &v23->DriverObject->Type;
if( v84 )
{
IoAddTriageDumpDataBlock(v84, (_BYTE *)(unsigned int)v84[1]);
v85 = &v23->DriverObject->DriverName;
if( v85->Length )
{
IoAddTriageDumpDataBlock(v85, (_BYTE *)2);
IoAddTriageDumpDataBlock(v23->DriverObject->DriverName.Buffer, (_BYTE *)v23->DriverObject->DriverName.Length);
}
}
v86 = (VOID **)v23->DeviceObjectExtension->DeviceNode;
if( v86 )
{
v87 = v86 + 5;
IoAddTriageDumpDataBlock(v86, (_BYTE *)0x310);
if( *(_WORD *)v87 )
{
IoAddTriageDumpDataBlock(v87, (_BYTE *)2);
IoAddTriageDumpDataBlock(v87[1], (_BYTE *)*(unsigned __int16 *)v87);
}
v88 = v23->DeviceObjectExtension;
v89 = v88->DeviceNode;
if( v89[28] )
{
IoAddTriageDumpDataBlock(v89 + 28, (_BYTE *)2);
IoAddTriageDumpDataBlock(
*((VOID **)v23->DeviceObjectExtension->DeviceNode + 8),
(_BYTE *)*((unsigned __int16 *)v23->DeviceObjectExtension->DeviceNode + 28));
v88 = v23->DeviceObjectExtension;
}
v90 = *((_QWORD *)v88->DeviceNode + 2);
if( v90 )
{
v91 = (_WORD *)(v90 + 56);
if( *v91 )
{
IoAddTriageDumpDataBlock(v91, (_BYTE *)2);
v92 = *((_QWORD *)v23->DeviceObjectExtension->DeviceNode + 2);
IoAddTriageDumpDataBlock(*(VOID **)(v92 + 64), (_BYTE *)*(unsigned __int16 *)(v92 + 56));
}
}
}
KeBugCheckEx(0xCAu, (PVOID)1, PhysicalDeviceObject, v23, 0i64);
}
ZwClose((_HANDLE)v4);
Capabilities._bf_4 &= ~0x40u;
InstanceKey = 0i64;
v4 = 0i64;
v10 = 0;
PipSetDevNodeProblem(DeviceNode, 0x2Aui64, 0);
PnpLogDuplicateDevice(BusID, v16, v74);
if( (_DEVICE_NODE *)*((_QWORD *)v23->DeviceObjectExtension->DeviceNode + 2) == DeviceNode->Parent )
PpvUtilFailDriver(
PPVERROR_DUPLICATE_PDO_ENUMERATED,
PhysicalDeviceObject->DriverObject->MajorFunction[27],
PhysicalDeviceObject,
v23);
ObfDereferenceObjectWithTag(v23, 0x65706E50ui64);
Parent = DeviceNode->Parent;
LABEL_136:
v15 = PipMakeGloballyUniqueId(Parent->PhysicalDeviceObject, v16, &GloballyUniqueId);
if( v16 )
ExFreePoolWithTag(v16, 0);
v16 = GloballyUniqueId;
InstanceID = GloballyUniqueId;
}
if( v4 )
{
if( v3 != 1 )
PnpClearDeviceTemporaryProperties((INT64)DeviceNode->InstancePath.Buffer, (INT64)v4);
v24 = Disposition;
PnpSetObjectProperty(
*(&stru_140CF2E80 + 607),
(INT64)DeviceNode->InstancePath.Buffer,
1u,
(INT64)v4,
0i64,
(__int64)&DEVPKEY_Device_LastKnownParent,
18,
(__int64)DeviceNode->Parent->InstancePath.Buffer,
DeviceNode->Parent->InstancePath.Length + 2,
Disposition);
PnpSetObjectProperty(
*(&stru_140CF2E80 + 607),
(INT64)DeviceNode->InstancePath.Buffer,
1u,
(INT64)v4,
0i64,
(__int64)&DEVPKEY_Device_LastArrivalDate,
16,
(__int64)&v133,
8,
Disposition);
PnpSetObjectProperty(
*(&stru_140CF2E80 + 607),
(INT64)DeviceNode->InstancePath.Buffer,
1u,
(INT64)v4,
0i64,
(__int64)&DEVPKEY_Device_LastRemovalDate,
0,
0i64,
0,
Disposition);
PnpSetObjectProperty(
*(&stru_140CF2E80 + 607),
(INT64)DeviceNode->InstancePath.Buffer,
1u,
(INT64)v4,
0i64,
(__int64)&DEVPKEY_Device_HardwareConfigurationIndex,
7,
(__int64)&qword_140C50A2C,
4,
Disposition);
}
else
{
v24 = Disposition;
}
if( (Capabilities._bf_4 & 0x4000) != 0 )
{
if( (DeviceNode->Flags & 0x2000) == 0 || (v93 = DeviceNode->Problem, v93 != 1) && v93 != 14 )
PnpDisableDevice(DeviceNode, 0x1Dui64);
}
if( (DeviceNode->Flags & 0x2000) == 0
|| (v94 = DeviceNode->Problem, v110 = v19, v94 != 9) && (v110 = v19, v94 != 3) && (v110 = v19, v94 != 19) )
{
v25 = (_ETHREAD *)KeGetCurrentThread();
--v25->Tcb.KernelApcDisable;
ExAcquireResourceSharedLite((UINT64)&PnpReplaceEvent + 6688, 1);
v4 = InstanceKey;
if( InstanceKey && v128 )
{
v65 = -1i64;
do
++v65;
while( *((_WORD *)v128 + v65) );
LODWORD(Flags) = v24;
LODWORD(PropertySize) = 2 * v65 + 2;
LODWORD(CmRegPropType) = 1;
CmSetDeviceRegProp(
*(&stru_140CF2E80 + 607),
DeviceNode->InstancePath.Buffer,
InstanceKey,
CM_REG_PROP_LOCATION_INFORMATION,
(UINT64)CmRegPropType,
(UINT8 *)v128,
(UINT64)PropertySize,
Flags);
}
v3 = HIDWORD(Disposition);
PnpSaveDeviceCapabilities((__int64)DeviceNode, &Capabilities, HIDWORD(Disposition) == 1);
if( v127 != -1 )
PnpSetObjectProperty(
*(&stru_140CF2E80 + 607),
(INT64)DeviceNode->InstancePath.Buffer,
1u,
(INT64)v4,
0i64,
(__int64)&DEVPKEY_Device_ExtendedAddress,
9,
(__int64)&v127,
8,
v24);
Buffer = DeviceNode->InstancePath.Buffer;
LODWORD(Flags) = 0;
LODWORD(v113) = 4;
v106 = v3 == 1;
if( CmGetDeviceRegProp(*(&stru_140CF2E80 + 607), Buffer, v4, 11i64, &v120, PropertyBuffer, &v113, Flags) >= 0
&& (_DWORD)v120 == 4
&& (_DWORD)v113 == 4 )
{
v27 = *(_DWORD *)PropertyBuffer;
if( (PropertyBuffer[0] & 0x20) == 0 )
{
if( (PropertyBuffer[0] & 0x40) == 0 )
{
LABEL_47:
v28 = PnpMapDeviceObjectToDeviceInstance(
(__int64)DeviceNode->PhysicalDeviceObject,
(__int64)&DeviceNode->InstancePath);
v29 = v19;
if( v28 < 0 )
v29 = v28;
v110 = v29;
if( PnpBootMode )
{
DeviceNode->StateFlags |= 0x1000u;
v116[0] = 2;
}
else
{
v30 = (unsigned __int8)v114;
if( (*(_DWORD *)PropertyBuffer & 0x40000) != 0 )
v30 = 1;
v114 = v30;
}
ExReleaseResourceLite((PERESOURCE)((char *)&PnpReplaceEvent + 6688));
KeLeaveCriticalRegion();
goto LABEL_54;
}
v62 = 28i64;
LABEL_147:
if( (Capabilities._bf_4 & 0x100) != 0 )
{
v67 = DeviceNode->InstancePath.Buffer;
LODWORD(Flags) = v24;
*(_DWORD *)PropertyBuffer = v27 | 0x400;
LODWORD(PropertySize) = 4;
LODWORD(CmRegPropType) = 4;
CmSetDeviceRegProp(
*(&stru_140CF2E80 + 607),
v67,
v4,
CM_REG_PROP_CONFIGFLAGS,
(UINT64)CmRegPropType,
PropertyBuffer,
(UINT64)PropertySize,
Flags);
}
else
{
if( (_DWORD)v62 == 28 )
{
FailedInstallProblemStatus = PiDevCfgGetFailedInstallProblemStatus(DeviceNode->InstancePath.Buffer, v4);
v62 = 28i64;
}
else
{
FailedInstallProblemStatus = 0;
}
PipSetDevNodeProblem(DeviceNode, v62, FailedInstallProblemStatus);
}
goto LABEL_47;
}
v62 = 18i64;
if( (PropertyBuffer[0] & 1) != 0 )
goto LABEL_147;
}
else
{
v27 = 0;
*(_DWORD *)PropertyBuffer = 0;
v62 = 1i64;
}
v106 = 1;
goto LABEL_147;
}
LABEL_54:
PnpQueryID(DeviceNode, 1, (UINT64 *)&HardwareId, (_DWORD *)&v120 + 1);
v31 = HardwareId;
KseAddHardwareId(HardwareId);
PnpQueryID(DeviceNode, 2, (UINT64 *)&CompatibleIds, (_DWORD *)&v113 + 1);
PnpGenerateDeviceIdsHash((__int64)v31, (__int64)CompatibleIds, &DeviceNode->DeviceIdsHash);
PnpIrpQueryID(DeviceNode->PhysicalDeviceObject, 5, (UINT64 *)&v116[1]);
v32 = *(WCHAR **)&v116[1];
if( *(_QWORD *)&v116[1] )
{
RtlInitUnicodeString(&DestinationString, *(PCWSTR *)&v116[1]);
if( RtlGUIDFromString(&DestinationString, &Guid) < 0 )
{
ExFreePoolWithTag(v32, 0);
v32 = 0i64;
*(_QWORD *)&v116[1] = 0i64;
}
}
if( PiQueryRemovableDeviceOverride(DeviceNode, v31, (WCHAR *)CompatibleIds, Removable) >= 0 )
{
v33 = Removable[0];
}
else
{
v33 = (Capabilities._bf_4 & 0x20) == 0 && (Capabilities._bf_4 & 0x40000) == 0 && (Capabilities._bf_4 & 0x10) != 0;
if( v32 )
goto LABEL_67;
}
v34 = 0i64;
if( v3 != 1 )
v34 = v4;
if( PipGenerateContainerID(DeviceNode, v34, v33, v32, &ContainerID) >= 0 )
{
if( v32 )
ExFreePoolWithTag(v32, 0);
v32 = ContainerID;
*(_QWORD *)&v116[1] = ContainerID;
}
LABEL_67:
if( !v32
|| (RtlInitUnicodeString(&DestinationString, v32),
RtlGUIDFromString(&DestinationString, &DeviceNode->ContainerID) < 0) )
{
DeviceNode->ContainerID = 0i64;
}
v35 = (_ETHREAD *)KeGetCurrentThread();
--v35->Tcb.KernelApcDisable;
ExAcquireResourceSharedLite((UINT64)&PnpReplaceEvent + 6688, 1);
PipSetDevNodeFlags(DeviceNode, 0x20ui64);
ExReleaseResourceLite((PERESOURCE)((char *)&PnpReplaceEvent + 6688));
KeLeaveCriticalRegion();
if( InstanceKey && *(_QWORD *)&v116[1] )
{
v37 = (_ETHREAD *)KeGetCurrentThread();
--v37->Tcb.KernelApcDisable;
ExAcquireResourceExclusiveLite((UINT64)&PnpReplaceEvent + 6688, 1, v36);
PiDcUpdateDeviceContainerMembership(DeviceNode->InstancePath.Buffer, InstanceKey, *(WCHAR **)&v116[1]);
ExReleaseResourceLite((PERESOURCE)((char *)&PnpReplaceEvent + 6688));
KeLeaveCriticalRegion();
}
v38 = (_ETHREAD *)KeGetCurrentThread();
--v38->Tcb.KernelApcDisable;
ExAcquireResourceSharedLite((UINT64)&PnpReplaceEvent + 6688, 1);
v39 = InstanceKey;
v40 = (wchar_t *)CompatibleIds;
v41 = (UINT8 *)HardwareId;
if( InstanceKey )
{
v42 = HIDWORD(v120);
if( v106 || HIDWORD(Disposition) == 1 )
{
v44 = v107[0];
}
else
{
v43 = PnpCheckDeviceIdsChanged((__int64)DeviceNode, InstanceKey, HardwareId, SHIDWORD(v120), 1, (__int64)v107);
v44 = v107[0];
if( v43 < 0 )
v44 = 0;
v107[0] = v44;
if( !v44 )
{
v45 = PnpCheckDeviceIdsChanged((__int64)DeviceNode, v39, v40, SHIDWORD(v113), 0, (__int64)v107);
v44 = v107[0];
if( v45 < 0 )
v44 = 0;
}
}
if( v41 )
{
LODWORD(Flags) = Disposition;
LODWORD(PropertySize) = v42;
LODWORD(CmRegPropType) = 7;
CmSetDeviceRegProp(
*(&stru_140CF2E80 + 607),
DeviceNode->InstancePath.Buffer,
v39,
CM_REG_PROP_HARDWAREID,
(UINT64)CmRegPropType,
v41,
(UINT64)PropertySize,
Flags);
}
v46 = Disposition;
if( v40 )
{
LODWORD(Flags) = Disposition;
LODWORD(PropertySize) = HIDWORD(v113);
LODWORD(CmRegPropType) = 7;
CmSetDeviceRegProp(
*(&stru_140CF2E80 + 607),
DeviceNode->InstancePath.Buffer,
v39,
CM_REG_PROP_COMPATIBLEIDS,
(UINT64)CmRegPropType,
(UINT8 *)v40,
(UINT64)PropertySize,
Flags);
}
if( v44 || (_BYTE)v114 )
{
if( v106 )
{
v96 = *(_DWORD *)PropertyBuffer;
v97 = ConfigFlagsUpdate;
}
else
{
v95 = PpDevCfgCheckDeviceNeedsUpdate(DeviceNode->InstancePath.Buffer, v39, &ConfigFlagsUpdate);
v96 = *(_DWORD *)PropertyBuffer;
if( v95 < 0 )
{
v97 = 0;
}
else
{
v97 = ConfigFlagsUpdate;
v96 = ConfigFlagsUpdate | *(_DWORD *)PropertyBuffer;
*(_DWORD *)PropertyBuffer |= ConfigFlagsUpdate;
}
}
if( (v97 & 0x20) != 0 || (v96 & 0x40000) != 0 )
{
LODWORD(Flags) = v46;
LODWORD(PropertySize) = 4;
*(_DWORD *)PropertyBuffer = v96 & 0xFFFBFFFF;
LODWORD(CmRegPropType) = 4;
CmSetDeviceRegProp(
*(&stru_140CF2E80 + 607),
DeviceNode->InstancePath.Buffer,
v39,
CM_REG_PROP_CONFIGFLAGS,
(UINT64)CmRegPropType,
PropertyBuffer,
(UINT64)PropertySize,
Flags);
LOBYTE(v96) = PropertyBuffer[0];
}
if( (v96 & 0x20) != 0 )
{
v106 = 1;
PipSetDevNodeProblem(DeviceNode, 0x12ui64, 0);
}
}
}
ExReleaseResourceLite((PERESOURCE)((char *)&PnpReplaceEvent + 6688));
KeLeaveCriticalRegion();
v47 = P;
if( v39 )
{
DeviceID = 0i64;
AlternateStringData = 0;
HIDWORD(ConfigFlagsUpdate) = 0;
v49 = 0;
if( P )
{
v60 = -1i64;
do
++v60;
while( *((_WORD *)P + v60) );
v49 = 2 * v60 + 2;
AlternateStringData = PnpFindAlternateStringData(P, v49, &DeviceID, (_DWORD *)&ConfigFlagsUpdate + 1);
}
PnpSetObjectProperty(
*(&stru_140CF2E80 + 607),
(INT64)DeviceNode->InstancePath.Buffer,
1u,
(INT64)v39,
0i64,
(__int64)&DEVPKEY_Device_BusReportedDeviceDesc,
AlternateStringData != 0 ? 25 : 18,
(__int64)v47,
v49,
Disposition);
if( (int)PnpGetDeviceLocationStrings((__int64)DeviceNode, (__int64 *)&DeviceID, (_DWORD *)&ConfigFlagsUpdate + 1) >= 0 )
{
v59 = DeviceID;
PnpSetObjectProperty(
*(&stru_140CF2E80 + 607),
(INT64)DeviceNode->InstancePath.Buffer,
1u,
(INT64)v39,
0i64,
(__int64)&DEVPKEY_Device_LocationPaths,
8210,
(__int64)DeviceID,
2 * HIDWORD(ConfigFlagsUpdate),
Disposition);
ExFreePoolWithTag(v59, 0);
}
}
PnpQueryBusInformation((__int64)DeviceNode);
v50 = PiDmaGuardProcessNewDeviceNode(DeviceNode);
v51 = v110;
if( v50 < 0 )
v51 = v50;
if( (Capabilities._bf_4 & 0x4000) == 0 && ((DeviceNode->Flags & 0x2000) == 0 || DeviceNode->Problem != 14) )
{
if( v106 )
{
v64 = v116[0];
if( HIDWORD(Disposition) == 1 )
v64 = v116[0] | 1;
PpDevCfgProcessDevice(DeviceNode, v39, v64);
}
else if( v39 )
{
PpDevCfgProcessDeviceOperations(DeviceNode, v39);
}
}
PiQueryResourceRequirements(DeviceNode);
if( (DeviceNode->Flags & 0x2000) == 0
|| (v98 = DeviceNode->Problem, v98 > 0x1D)
|| (v99 = 541606408, !_bittest(&v99, v98)) )
{
PnpIsDeviceInstanceEnabled(v39, &DeviceNode->InstancePath.Length, 1);
}
if( v39 )
PnpInitializeSessionId((__int64)DeviceNode, (INT64)v39, HIDWORD(Disposition) == 1);
PiQueryAndAllocateBootResources(DeviceNode);
if( (DeviceNode->Flags & 0x2000) == 0
|| (v100 = DeviceNode->Problem, v100 > 0x13)
|| (v101 = 524808, !_bittest(&v101, v100)) )
{
v52 = (_ETHREAD *)KeGetCurrentThread();
--v52->Tcb.KernelApcDisable;
ExAcquireResourceSharedLite((UINT64)&PnpReplaceEvent + 6688, 1);
PnpSaveDeviceCapabilities((__int64)DeviceNode, &Capabilities, HIDWORD(Disposition) == 1);
ExReleaseResourceLite((PERESOURCE)((char *)&PnpReplaceEvent + 6688));
KeLeaveCriticalRegion();
PpHotSwapUpdateRemovalPolicy(DeviceNode);
v53 = PpDeviceRegistration(&DeviceNode->InstancePath, 1u, &DeviceNode->ServiceName, 0);
if( v53 < 0 )
PipSetDevNodeProblem(DeviceNode, 0x13ui64, v53);
v39 = InstanceKey;
v41 = (UINT8 *)HardwareId;
v47 = P;
v40 = (wchar_t *)CompatibleIds;
}
if( (DeviceNode->Flags & 0x2000) == 0 || (v102 = DeviceNode->Problem, v102 != 9) && v102 != 3 )
{
PnpIrpDeviceEnumerated(PhysicalDeviceObject);
if( v39 )
PiUpdateDevicePanel((INT64)DeviceNode, v39);
PnpRaiseNtPlugPlayDevicePropertyChangeEvent(v54, DeviceNode->InstancePath.Buffer, 1);
PnpRaiseNtPlugPlayDevicePropertyChangeEvent(v55, DeviceNode->InstancePath.Buffer, 14);
PnpSetPlugPlayEvent((__int128 *)&GUID_DEVICE_ENUMERATED, PhysicalDeviceObject);
PnpNewDeviceNodeDependencyCheck(DeviceNode);
}
if( v41 )
ExFreePoolWithTag(v41, 0);
if( v40 )
ExFreePoolWithTag(v40, 0);
if( *(_QWORD *)&v116[1] )
ExFreePoolWithTag(*(PVOID *)&v116[1], 0);
if( v39 )
ZwClose((_HANDLE)v39);
if( InstanceID )
ExFreePoolWithTag(InstanceID, 0);
if( v128 )
ExFreePoolWithTag(v128, 0);
if( v47 )
ExFreePoolWithTag(v47, 0);
if( BusID )
ExFreePoolWithTag(BusID, 0);
v56 = hPnpOpCtx;
if( hPnpOpCtx )
PiPnpRtlEndOperation(hPnpOpCtx);
if( (byte_140C130BB & 8) != 0 )
McTemplateK0p_EtwWriteTransfer(
(__int64)v56,
(const _EVENT_DESCRIPTOR *)KMPnPEvt_ProcessNewDevice_Stop,
0i64,
DeviceNode);
if( DeviceNode->DockInfo.DockStatus )
PnpTraceDockDeviceEnumeration();
return v51;
}Referenced by:
PipProcessDevNodeTree