PipSetDevNodeProblem
VOID __stdcall PipSetDevNodeProblem(_DEVICE_NODE *DeviceNode, UINT64 Problem, NTSTATUS ProblemStatus){
int v3;
unsigned int v4;
unsigned int v5;
int v7;
INT64 v8;
wchar_t *Buffer;
HPNPOPCTX *hPnpOpCtx;
hPnpOpCtx = 0i64;
v3 = ProblemStatus;
v4 = Problem;
v5 = DeviceNode->Problem;
v7 = DeviceNode->ProblemStatus;
if( (DeviceNode->Flags & 0x2000) == 0 || __PAIR64__(v7, v5) != __PAIR64__(ProblemStatus, Problem) )
{
PiPnpRtlBeginOperation(&hPnpOpCtx);
PipSetDevNodeFlags(DeviceNode, 0x2000ui64);
Buffer = DeviceNode->InstancePath.Buffer;
DeviceNode->Problem = v4;
DeviceNode->ProblemStatus = v3;
if( Buffer )
{
if( v4 != v5 )
{
PnpRaiseNtPlugPlayDevicePropertyChangeEvent(v8, Buffer, 12);
v3 = DeviceNode->ProblemStatus;
}
if( v3 != v7 )
{
PnpRaiseNtPlugPlayDevicePropertyChangeEvent(v8, DeviceNode->InstancePath.Buffer, 13);
v3 = DeviceNode->ProblemStatus;
}
PnpTraceSetDevNodeProblem(
(__int64)&DeviceNode->InstancePath,
(__int64)&DeviceNode->ServiceName,
DeviceNode->State,
DeviceNode->Problem,
v3,
v5,
v7);
if( DeviceNode->Problem == 22 && SeAuditingWithTokenForSubcategory(137i64, 0i64) )
PiAuditDeviceEnableDisableAction(&DeviceNode->InstancePath, v5, DeviceNode->Problem);
}
if( hPnpOpCtx )
PiPnpRtlEndOperation(hPnpOpCtx);
}
}Referenced by:
IoReportDetectedDevice
IopInitializeDeviceInstanceKey
PiDevCfgProcessDevice
PiInitializeDevice
PiProcessNewDeviceNode
PiProcessQueryRemoveNoFdo
PiProcessSetDeviceProblem
PiProfileUpdateDeviceTreeCallback
PipCallDriverAddDevice
PipCallDriverAddDeviceQueryRoutine
PipProcessDevNodeTree
PipProcessEnumeratedChildDevice
PnpDisableDevice
PnpDriverLoadingFailed
PnpProcessAssignResources
PnpQueryID
PnpRemoveLockedDeviceNode
PnpSurpriseRemoveLockedDeviceNode