PipProcessStartPhase3
NTSTATUS __stdcall PipProcessStartPhase3(_DEVICE_NODE *DeviceNode, UINT64 MarkForReenumeration){
__int64 v2;
int v3;
int DeviceState;
__int64 v6;
_DEVICE_OBJECT *PhysicalDeviceObject;
HPNPOPCTX *v8;
PVOID v10;
PVOID v11;
char v12;
_ETHREAD *v13;
wchar_t *Buffer;
int v15;
wchar_t *v16;
int v17;
UINT8 *v18;
int v19;
int v20;
_ETHREAD *CurrentThread;
INT64 v22;
UINT64 *CmRegPropType;
UINT64 *PropertySize;
UINT64 Flags;
UINT64 Flagsa;
UINT8 PropertyBuffer[4];
VOID *BaseKeyHandle;
UINT64 v29;
UINT64 v30;
PVOID v31;
PVOID P;
HPNPOPCTX *hPnpOpCtx;
_UNICODE_STRING DestinationString[4];
int v35;
char v36;
char v37;
v35 = MarkForReenumeration;
v3 = MarkForReenumeration;
BaseKeyHandle = 0i64;
hPnpOpCtx = 0i64;
if( (byte_140C130BB & 0x10) != 0 )
McTemplateK0dz_EtwWriteTransfer(
(__int64)DeviceNode,
(const _EVENT_DESCRIPTOR *)KMPnPEvt_ProcessDeviceStart_Start,
v2,
3,
DeviceNode->InstancePath.Buffer);
DeviceState = PiPnpRtlBeginOperation(&hPnpOpCtx);
if( DeviceState >= 0 )
{
PhysicalDeviceObject = DeviceNode->PhysicalDeviceObject;
if( (DeviceNode->Flags & 0x20) != 0
|| (v31 = 0i64,
v30 = 0i64,
P = 0i64,
DestinationString[0] = 0i64,
PnpDeviceObjectToDeviceInstance((__int64)PhysicalDeviceObject, &BaseKeyHandle, 131097) < 0) )
{
LABEL_5:
if( (DeviceNode->Flags & 0x2000) != 0 && DeviceNode->Problem == 9 )
{
DeviceState = -1073741823;
}
else
{
if( v3 )
PipSetDevNodeFlags(DeviceNode, 8ui64);
PnpQueryAndSaveDeviceNodeCapabilities((__int64)DeviceNode);
DeviceState = PiProcessQueryDeviceState(PhysicalDeviceObject);
PiUpdateDevicePanel((INT64)DeviceNode, 0i64);
PnpSetPlugPlayEvent((__int128 *)&GUID_DEVICE_ARRIVAL, &DeviceNode->PhysicalDeviceObject->Type);
PnpSetDeviceInstanceStartedEvent((__int64)DeviceNode);
if( DeviceState >= 0 )
{
PpvUtilTestStartedPdoStack(PhysicalDeviceObject);
PipSetDevNodeState(DeviceNode, DeviceNodeStarted);
PnpStartedDeviceNodeDependencyCheck(DeviceNode);
PiCreateDriverSwDevices(DeviceNode);
if( SeAuditingPlugAndPlayEvents() )
PiAuditDeviceStart(&DeviceNode->InstancePath);
DeviceState = 0;
}
}
goto LABEL_12;
}
PnpQueryID(DeviceNode, 1, (UINT64 *)&P, (_DWORD *)&v30 + 1);
PnpQueryID(DeviceNode, 2, (UINT64 *)&v31, &v30);
v10 = v31;
v11 = P;
PnpGenerateDeviceIdsHash((__int64)P, (__int64)v31, &DeviceNode->DeviceIdsHash);
if( !v11 && !v10 )
{
LABEL_38:
PnpSetObjectProperty(
*(&stru_140CF2E80 + 607),
(INT64)DeviceNode->InstancePath.Buffer,
1u,
(INT64)BaseKeyHandle,
0i64,
(__int64)&DEVPKEY_Device_HardwareConfigurationIndex,
7,
(__int64)&qword_140C50A2C,
4,
0);
RtlInitUnicodeString(DestinationString, L"{00000000-0000-0000-FFFF-FFFFFFFFFFFF}");
RtlGUIDFromString(DestinationString, &DeviceNode->ContainerID);
PipSetDevNodeFlags(DeviceNode, 0x20ui64);
CurrentThread = (_ETHREAD *)KeGetCurrentThread();
--CurrentThread->Tcb.KernelApcDisable;
ExAcquireResourceSharedLite((UINT64)&PnpReplaceEvent + 6688, 1);
PiDcUpdateDeviceContainerMembership(
DeviceNode->InstancePath.Buffer,
BaseKeyHandle,
(WCHAR *)L"{00000000-0000-0000-FFFF-FFFFFFFFFFFF}");
ExReleaseResourceLite((PERESOURCE)((char *)&PnpReplaceEvent + 6688));
KeLeaveCriticalRegion();
PiUpdateDevicePanel((INT64)DeviceNode, BaseKeyHandle);
ZwClose((_HANDLE)BaseKeyHandle);
PnpRaiseNtPlugPlayDevicePropertyChangeEvent(v22, DeviceNode->InstancePath.Buffer, 1);
PnpSetPlugPlayEvent((__int128 *)&GUID_DEVICE_ENUMERATED, &DeviceNode->PhysicalDeviceObject->Type);
v3 = v35;
goto LABEL_5;
}
*(_DWORD *)PropertyBuffer = 0;
v12 = 0;
LODWORD(v29) = 0;
v13 = (_ETHREAD *)KeGetCurrentThread();
v36 = 0;
v37 = 0;
--v13->Tcb.KernelApcDisable;
ExAcquireResourceSharedLite((UINT64)&PnpReplaceEvent + 6688, 1);
Buffer = DeviceNode->InstancePath.Buffer;
LODWORD(Flags) = 0;
HIDWORD(v29) = 4;
if( CmGetDeviceRegProp(
*(&stru_140CF2E80 + 607),
Buffer,
BaseKeyHandle,
11i64,
&v29,
PropertyBuffer,
(UINT64 *)((char *)&v29 + 4),
Flags) >= 0
&& v29 == 0x400000004i64 )
{
v15 = *(_DWORD *)PropertyBuffer;
if( (PropertyBuffer[0] & 0x20) == 0 || (PropertyBuffer[0] & 1) != 0 )
goto LABEL_22;
}
else
{
v15 = 0;
*(_DWORD *)PropertyBuffer = 0;
}
v12 = 1;
LABEL_22:
v16 = (wchar_t *)v31;
v17 = v30;
v18 = (UINT8 *)P;
v19 = HIDWORD(v30);
if( (v15 & 0x400) == 0 )
{
v20 = 0;
if( !P
|| (v20 = PnpCheckDeviceIdsChanged(
(__int64)DeviceNode,
BaseKeyHandle,
(wchar_t *)P,
SHIDWORD(v30),
1,
(__int64)&v36),
v15 = *(_DWORD *)PropertyBuffer,
!v36) )
{
if( v16 )
{
v20 = PnpCheckDeviceIdsChanged((__int64)DeviceNode, BaseKeyHandle, v16, v17, 0, (__int64)&v36);
v15 = *(_DWORD *)PropertyBuffer;
}
}
if( v20 >= 0 && v36 )
{
v37 = 1;
*(_DWORD *)PropertyBuffer = v15 | 0x400;
v12 = 1;
}
}
if( v18 )
{
LODWORD(Flagsa) = 0;
LODWORD(PropertySize) = v19;
LODWORD(CmRegPropType) = 7;
CmSetDeviceRegProp(
*(&stru_140CF2E80 + 607),
DeviceNode->InstancePath.Buffer,
BaseKeyHandle,
CM_REG_PROP_HARDWAREID,
(UINT64)CmRegPropType,
v18,
(UINT64)PropertySize,
Flagsa);
ExFreePoolWithTag(v18, 0);
}
if( v16 )
{
LODWORD(Flagsa) = 0;
LODWORD(PropertySize) = v17;
LODWORD(CmRegPropType) = 7;
CmSetDeviceRegProp(
*(&stru_140CF2E80 + 607),
DeviceNode->InstancePath.Buffer,
BaseKeyHandle,
CM_REG_PROP_COMPATIBLEIDS,
(UINT64)CmRegPropType,
(UINT8 *)v16,
(UINT64)PropertySize,
Flagsa);
ExFreePoolWithTag(v16, 0);
}
if( v37 )
{
LODWORD(Flagsa) = 0;
LODWORD(PropertySize) = 4;
LODWORD(CmRegPropType) = 4;
CmSetDeviceRegProp(
*(&stru_140CF2E80 + 607),
DeviceNode->InstancePath.Buffer,
BaseKeyHandle,
CM_REG_PROP_CONFIGFLAGS,
(UINT64)CmRegPropType,
PropertyBuffer,
(UINT64)PropertySize,
Flagsa);
}
ExReleaseResourceLite((PERESOURCE)((char *)&PnpReplaceEvent + 6688));
KeLeaveCriticalRegion();
if( v12 )
PpDevCfgProcessDevice(DeviceNode, BaseKeyHandle, 0i64);
goto LABEL_38;
}
LABEL_12:
v8 = hPnpOpCtx;
if( hPnpOpCtx )
PiPnpRtlEndOperation(hPnpOpCtx);
if( (byte_140C130BB & 0x10) != 0 )
McTemplateK0dz_EtwWriteTransfer(
(__int64)v8,
(const _EVENT_DESCRIPTOR *)KMPnPEvt_ProcessDeviceStart_Stop,
v6,
3,
DeviceNode->InstancePath.Buffer);
return DeviceState;
}Referenced by:
PipProcessDevNodeTree