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