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