PnpRestartDeviceNode

__int64 __fastcall PnpRestartDeviceNode(__int64 a1){
  _PNP_DEVNODE_STATE *v2; 
  unsigned int v3; 
  bool v4; 
  void *v5; 
  PpDevNodeLockTree(4);
  if( (*(_DWORD *)(a1 + 396) & 0x10) != 0 )
  {
    PipClearDevNodeUserFlags(a1, 5);
    PipClearDevNodeFlags((_DEVICE_NODE *)a1, 0x108000ui64);
    *(_DWORD *)(a1 + 704) &= 0xFFFFBC03;
    v3 = 0;
    v4 = *(_DWORD *)(a1 + 300) == 769;
    *(_DWORD *)(a1 + 296) = 0;
    *(_DWORD *)(a1 + 120) = 0;
    *(_DWORD *)(a1 + 124) = 0;
    if( !v4 )
    {
      PipClearDevNodeFlags((_DEVICE_NODE *)a1, 0x7C200D00ui64);
      if( *(_WORD *)(a1 + 56) )
      {
        ExFreePoolWithTag(*(PVOID *)(a1 + 64), 0);
        *(_DWORD *)(a1 + 56) = 0;
        *(_QWORD *)(a1 + 64) = 0i64;
      }
      ExAcquireFastMutex(&PiResourceListLock);
      v5 = *(void **)(a1 + 440);
      if( v5 )
      {
        ExFreePoolWithTag(v5, 0);
        *(_QWORD *)(a1 + 440) = 0i64;
        PipClearDevNodeFlags((_DEVICE_NODE *)a1, 0x200ui64);
      }
      KeReleaseGuardedMutex(&PiResourceListLock);
    }
    *(_DWORD *)(a1 + 660) = -1;
    PipSetDevNodeState((_DEVICE_NODE *)a1, DeviceNodeUninitialized, v2);
  }
  else
  {
    v3 = -1073741823;
  }
  PpDevNodeUnlockTree(4);
  return v3;
}

Referenced by:

PiProcessClearDeviceProblem
PiProcessQueryRemoveNoFdo
PiProfileUpdateDeviceTreeCallback
PiRestartDevice
PiRestartRemovalRelations
PnpProcessQueryRemoveAndEject