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