PopFxBuildDripsBlockingDeviceList

__int64 __fastcall PopFxBuildDripsBlockingDeviceList(UINT64 a1, _LIST_ENTRY *a2){
  NTSTATUS DevicePropertyData; 
  _ETHREAD *CurrentThread; 
  INT64 i; 
  _LIST_ENTRY *v7; 
  _LIST_ENTRY *Blink; 
  _ETHREAD *v9; 
  unsigned int SessionId; 
  unsigned __int8 v11; 
  int v12; 
  _KLOCK_ENTRY *v13; 
  bool v14; 
  __int64 v15; 
  int v16; 
  unsigned int v17; 
  __int64 v18; 
  _LIST_ENTRY *Flink; 
  _LIST_ENTRY *v20; 
  INT64 v21; 
  INT64 v22; 
  const _GUID *v23; 
  INT64 v24; 
  _LIST_ENTRY *v25; 
  unsigned int v26; 
  _LIST_ENTRY *v27; 
  _LIST_ENTRY *v28; 
  _LIST_ENTRY *v29; 
  unsigned __int64 v30; 
  VOID **PoolWithTag; 
  _LIST_ENTRY *v32; 
  INT64 v33; 
  unsigned int v34; 
  __int64 v35; 
  INT64 v36; 
  PVOID BugCheckParameter4; 
  VOID *Data; 
  UINT64 a3; 
  UINT64 Type; 
  UINT64 RequiredSize; 
  unsigned int v43; 
  unsigned int v44; 
  unsigned int v45; 
  unsigned int v46; 
  _UNICODE_STRING String1; 
  _UNICODE_STRING v48; 
  __int64 v49; 
  __int64 v50; 
  INT64 v51[2]; 
  _EVENT_DATA_DESCRIPTOR v52; 
  int *v53; 
  __int64 v54; 
  int *v55; 
  __int64 v56; 
  __int64 *v57; 
  __int64 v58; 
  _EVENT_DATA_DESCRIPTOR v59; 
  int *v60; 
  __int64 v61; 
  int *v62; 
  __int64 v63; 
  __int64 *v64; 
  __int64 v65; 
  __int64 v66; 
  wchar_t v67; 
  __int64 v68; 
  wchar_t v69; 

  v67 = aPci[4];
  v48.Buffer = (wchar_t *)&v66;
  *(_OWORD *)v51 = 0i64;
  v69 = aUsb_0[4];
  v66 = *(_QWORD *)L"PCI\\";
  DevicePropertyData = 0;
  String1.Buffer = (wchar_t *)&v68;
  Type = 0i64;
  RequiredSize = 0i64;
  *(_QWORD *)&v48.Length = 655368i64;
  v68 = *(_QWORD *)L"USB\\";
  *(_QWORD *)&String1.Length = 655368i64;
  IoLockUnlockPnpDeviceTree(1);
  HIDWORD(a3) = -1;
  CurrentThread = (_ETHREAD *)KeGetCurrentThread();
  --CurrentThread->Tcb.KernelApcDisable;
  ExAcquirePushLockExclusiveEx((_EX_PUSH_LOCK *)&stru_140C23628 + 498, 0i64);
  ExAcquirePushLockExclusiveEx((_EX_PUSH_LOCK *)&stru_140C23628 + 489, 0i64);
  a2->Blink = a2;
  a2->Flink = a2;
  for( i = *(&stru_140C23628 + 485); (_UNKNOWN *)i != (_UNKNOWN *)((char *)&stru_140C23628 + 3880); i = *(_QWORD *)i )
  {
    v7 = (_LIST_ENTRY *)(i + 872);
    if( *(_QWORD *)(i + 48) && PopFxIsDripsBlockingDevice(i, a1, (UINT64 *)(i + 888)) )
    {
      PopFxAddRefDevice((POP_FX_DEVICE *)i);
      Blink = a2->Blink;
      if( Blink->Flink != a2 )
        __fastfail(3u);
      v7->Flink = a2;
      *(_QWORD *)(i + 880) = Blink;
      Blink->Flink = v7;
      a2->Blink = v7;
    }
  }
  if( (_InterlockedExchangeAdd64((_QWORD *)&stru_140C23628 + 489, 0xFFFFFFFFFFFFFFFFui64) & 6) == 2 )
    ExfTryToWakePushLock((_EX_PUSH_LOCK *)&stru_140C23628 + 489);
  v9 = (_ETHREAD *)KeGetCurrentThread();
  LODWORD(a3) = 0;
  if( MiGetSystemRegionType((UINT64)&stru_140C23628 + 3912) == 1 )
    SessionId = MmGetSessionIdEx(v9->Tcb.ApcState.Process);
  else
    SessionId = -1;
  --v9->Tcb.SpecialApcDisable;
  v11 = ++v9->Tcb.AbAllocationRegionCount;
  v12 = ((char)v9->Tcb.AbEntrySummary | (char)v9->Tcb.AbOrphanedEntrySummary) ^ 0x3F;
  while( 1 )
  {
    v14 = !_BitScanReverse((unsigned int *)&v15, v12);
    if( v14 )
      goto LABEL_20;
    v13 = &v9->Tcb.LockEntries[v15];
    v12 &= ~(1 << v15);
    if( (v13->AcquiredByte & 1) != 0
      && (v13->LockState.$E8276A2CF8B819ED32D1B6FEB35D730A::_bf_0 & 1) == 0
      && (v13->LockState.$E8276A2CF8B819ED32D1B6FEB35D730A::_bf_0 & 0x7FFFFFFFFFFFFFFCi64) == (((unsigned __int64)&stru_140C23628
                                                                                              + 3912) & 0x7FFFFFFFFFFFFFFCi64)
      && v13->LockState.SessionId == SessionId )
    {
      v13->AcquiredByte &= ~1u;
      if( v13->LockState.$E8276A2CF8B819ED32D1B6FEB35D730A::_bf_0 )
        break;
    }
  }
  if( !v13 )
  {
LABEL_20:
    if( (*(&v9->Tcb.MiscFlags + 1) & 0x10000) == 0 )
      KeBugCheckEx(0x162u, v9, (char *)&stru_140C23628 + 3912, (PVOID)SessionId, 0i64);
    goto LABEL_27;
  }
  v13->CrossThreadReleasableAndBusyByte |= 2u;
  if( v13->LockState.$E8276A2CF8B819ED32D1B6FEB35D730A::_bf_0 < 0 )
    KiAbEntryRemoveFromTree(v13);
  v16 = v13->BoostBitmap.AllFields & 0x1FFFF;
  v17 = v13->BoostBitmap.AllFields & 0xFFFE0000;
  v13->ThreadLocalFlags &= ~1u;
  LODWORD(a3) = v16;
  v13->BoostBitmap.AllFields = v17;
  v13->LockState.$E8276A2CF8B819ED32D1B6FEB35D730A::_bf_0 = 0i64;
  v18 = v13 - v9->Tcb.LockEntries;
  if( v11 == 1 )
    v9->Tcb.AbEntrySummary |= 1 << v18;
  else
    _InterlockedOr8((volatile signed __int8 *)&v9->Tcb.AbOrphanedEntrySummary, 1 << v18);
LABEL_27:
  --v9->Tcb.AbAllocationRegionCount;
  KiAbThreadRemoveBoosts(&v9->Tcb, (char *)&stru_140C23628 + 3912, &a3);
  v14 = v9->Tcb.SpecialApcDisable++ == -1;
  if( v14 && ($F25F8C4BA33AF922A5F1AF68CD89DDDF *)v9->Tcb.ApcState.ApcListHead[0].Flink != &v9->Tcb.152 )
    KiCheckForKernelApcDelivery();
  Flink = a2->Flink;
  if( a2->Flink != a2 )
  {
    while( 1 )
    {
      v20 = Flink[-52].Blink;
      LODWORD(BugCheckParameter4) = 4;
      DevicePropertyData = IoGetDevicePropertyData(
                             (_DEVICE_OBJECT *)v20[2].Flink,
                             (_DEVPROPKEY *)&DEVPKEY_PciDevice_DeviceType,
                             0i64,
                             0i64,
                             (UINT64)BugCheckParameter4,
                             (char *)&a3 + 4,
                             (UINT64 *)((char *)&RequiredSize + 4),
                             &RequiredSize);
      if( DevicePropertyData < 0 || HIDWORD(a3) != 8 )
      {
        LODWORD(BugCheckParameter4) = 16;
        DevicePropertyData = IoGetDevicePropertyData(
                               (_DEVICE_OBJECT *)v20[2].Flink,
                               (_DEVPROPKEY *)&DEVPKEY_Device_ClassGuid,
                               0i64,
                               0i64,
                               (UINT64)BugCheckParameter4,
                               v51,
                               (UINT64 *)((char *)&Type + 4),
                               &Type);
        if( DevicePropertyData < 0 || Type != 0x100000000Di64 )
          goto LABEL_81;
        v24 = *(_QWORD *)&GUID_DEVICE_CLASS_USB_CONTROLLER.Data1 - v51[0];
        if( *(_QWORD *)&GUID_DEVICE_CLASS_USB_CONTROLLER.Data1 == v51[0] )
          v24 = *(_QWORD *)GUID_DEVICE_CLASS_USB_CONTROLLER.Data4 - v51[1];
        if( v24 )
        {
LABEL_81:
          DevicePropertyData = 0;
          goto LABEL_82;
        }
      }
      v25 = v20->Blink;
      v26 = 0;
      v27 = v20;
      while( v25 )
      {
        v27 = v25;
        v25 = v25->Blink;
      }
      if( v27 != v20 )
        break;
LABEL_82:
      Flink = Flink->Flink;
      if( Flink == a2 )
        goto LABEL_83;
    }
    do
    {
      if( HIDWORD(v27[9].Blink) == 1 )
      {
        _InterlockedAnd((volatile signed __int32 *)&v27[18].Blink, 0xFFFFFFDF);
        if( (unsigned __int8)RtlPrefixUnicodeString(&String1, (PCUNICODE_STRING)&v27[2].Blink, 0)
          || (unsigned __int8)RtlPrefixUnicodeString(&v48, (PCUNICODE_STRING)&v27[2].Blink, 0) )
        {
          v29 = v27;
          if( v27 == v20 )
          {
LABEL_52:
            _InterlockedOr((volatile signed __int32 *)&v27[18].Blink, 0x20u);
            if( v26 + 1 < v26 )
              goto LABEL_87;
            ++v26;
            DevicePropertyData = 0;
          }
          else
          {
            while( HIDWORD(v29[9].Blink) == 1 )
            {
              v29 = v29[1].Flink;
              if( v29 == v20 )
                goto LABEL_52;
            }
          }
        }
      }
      v28 = v27->Flink;
      if( v27->Flink )
      {
        do
        {
          v27 = v28;
          v28 = v28->Blink;
        }
        while( v28 );
      }
      else
      {
        v27 = v27[1].Flink;
      }
    }
    while( v27 != v20 );
    if( !v26 )
      goto LABEL_82;
    v21 = 0xFFFFFFFFi64;
    v30 = 8i64 * v26;
    if( v30 > 0xFFFFFFFF )
    {
LABEL_87:
      DevicePropertyData = -1073741675;
      goto LABEL_84;
    }
    DevicePropertyData = 0;
    PoolWithTag = ExAllocatePoolWithTag(1ui64, (unsigned int)v30, 1297630800i64);
    v32 = (_LIST_ENTRY *)PoolWithTag;
    if( PoolWithTag )
    {
      memset(PoolWithTag, 0i64, 8 * v26);
      v33 = (INT64)v20->Blink;
      v23 = 0i64;
      v34 = 0;
      v21 = (INT64)v20;
      while( v33 )
      {
        v21 = v33;
        v33 = *(_QWORD *)(v33 + 8);
      }
      if( (_LIST_ENTRY *)v21 == v20 )
        goto LABEL_76;
      v22 = 1i64;
      while( 1 )
      {
        _m_prefetchw((const void *)(v21 + 296));
        if( (_InterlockedOr((volatile signed __int32 *)(v21 + 296), 0) & 0x20) != 0 )
        {
          if( v34 >= v26 )
          {
            if( *(&stru_140C00F40 + 1194) > 5u && tlgKeywordOn((__int64)&stru_140C00F40 + 4776, 0x400000000000i64) )
            {
              v54 = 4i64;
              v43 = v34 + 1;
              v44 = v26;
              v53 = (int *)&v43;
              v56 = 4i64;
              v55 = (int *)&v44;
              v49 = 0x1000000i64;
              v57 = &v49;
              v58 = 8i64;
              tlgWriteTransfer_EtwWriteTransfer(
                (__int64)&stru_140C00F40 + 4776,
                (unsigned __int8 *)byte_140025F88,
                0i64,
                v23,
                5u,
                &v52);
            }
LABEL_76:
            if( v34 != v26
              && *(&stru_140C00F40 + 1194) > 5u
              && tlgKeywordOn((__int64)&stru_140C00F40 + 4776, 0x400000000000i64) )
            {
              v45 = v34;
              v60 = (int *)&v45;
              v61 = 4i64;
              v62 = (int *)&v46;
              v46 = v26;
              v64 = &v50;
              v63 = 4i64;
              v50 = 0x1000000i64;
              v65 = 8i64;
              tlgWriteTransfer_EtwWriteTransfer(
                (__int64)&stru_140C00F40 + 4776,
                (unsigned __int8 *)&byte_140025FE7,
                0i64,
                0i64,
                5u,
                &v59);
            }
            Flink[1].Blink = v32;
            LODWORD(Flink[2].Flink) = v34;
            goto LABEL_82;
          }
          _InterlockedAnd((volatile signed __int32 *)(v21 + 296), 0xFFFFFFDF);
          v35 = v34++;
          *((_QWORD *)&v32->Flink + v35) = v21;
        }
        v36 = *(_QWORD *)v21;
        if( *(_QWORD *)v21 )
        {
          do
          {
            v21 = v36;
            v36 = *(_QWORD *)(v36 + 8);
          }
          while( v36 );
        }
        else
        {
          v21 = *(_QWORD *)(v21 + 16);
        }
        if( (_LIST_ENTRY *)v21 == v20 )
          goto LABEL_76;
      }
    }
    DevicePropertyData = -1073741670;
LABEL_83:
    if( DevicePropertyData < 0 )
LABEL_84:
      PopFxDestroyDripsBlockingDeviceList((INT64)a2, v21, v22, (INT64)v23, (INT64)BugCheckParameter4, (INT64)Data);
  }
  return(unsigned int)DevicePropertyData;
}

Referenced by:

PopDripsWatchdogCallbackHandler
PopDripsWatchdogTakeAction