PopFxBuildDripsBlockingDeviceList

INT64 __stdcall PopFxBuildDripsBlockingDeviceList(UINT64 a1, _QWORD *a2){
  int v4; 
  _ETHREAD *CurrentThread; 
  ULONG_PTR *i; 
  _QWORD *v7; 
  _QWORD **v8; 
  _ETHREAD *v9; 
  unsigned int SessionId; 
  char v11; 
  int v12; 
  unsigned __int64 v13; 
  bool v14; 
  __int64 v15; 
  int v16; 
  unsigned int v17; 
  __int64 v18; 
  __int64 *v19; 
  __int64 *v20; 
  int v21; 
  int v22; 
  __int64 v23; 
  __int64 *v24; 
  unsigned int v25; 
  __int64 *v26; 
  __int64 *v27; 
  __int64 *v28; 
  unsigned __int64 v29; 
  _QWORD *PoolWithTag; 
  _QWORD *v31; 
  volatile signed __int32 *v32; 
  unsigned int v33; 
  volatile signed __int32 *v34; 
  __int64 v35; 
  volatile signed __int32 *v36; 
  const GUID *v37; 
  int v39; 
  int v40; 
  ULONG v41; 
  ULONG v42; 
  ULONG v43; 
  ULONG v44; 
  unsigned int v45; 
  unsigned int v46; 
  unsigned int v47; 
  unsigned int v48; 
  UNICODE_STRING String1; 
  UNICODE_STRING EventHandle; 
  __int64 v51; 
  __int64 v52; 
  __int128 v53; 
  struct _EVENT_DATA_DESCRIPTOR v54; 
  int *v55; 
  __int64 v56; 
  int *v57; 
  __int64 v58; 
  __int64 *v59; 
  __int64 v60; 
  struct _EVENT_DATA_DESCRIPTOR v61; 
  int *v62; 
  __int64 v63; 
  int *v64; 
  __int64 v65; 
  __int64 *v66; 
  __int64 v67; 
  __int64 v68; 
  wchar_t v69; 
  __int64 v70; 
  wchar_t v71; 
  v69 = aPci[4];
  v42 = 0;
  EventHandle.Buffer = (wchar_t *)&v68;
  v53 = 0i64;
  v71 = aUsb_0[4];
  v68 = *(_QWORD *)L"PCI\\";
  v4 = 0;
  String1.Buffer = (wchar_t *)&v70;
  v41 = 0;
  v43 = 0;
  *(_QWORD *)&EventHandle.Length = 655368i64;
  v70 = *(_QWORD *)L"USB\\";
  *(_QWORD *)&String1.Length = 655368i64;
  IoLockUnlockPnpDeviceTree(1);
  v44 = 0;
  v40 = -1;
  CurrentThread = (_ETHREAD *)KeGetCurrentThread();
  --*((_WORD *)CurrentThread + 242);
  ExAcquirePushLockExclusiveEx((UINT64)&PopFxBlockingDeviceListLock, 0i64);
  ExAcquirePushLockExclusiveEx((UINT64)&PopFxDeviceListLock, 0i64);
  a2[1] = a2;
  *a2 = a2;
  for( i = (ULONG_PTR *)PopFxDeviceList; i != &PopFxDeviceList; i = (ULONG_PTR *)*i )
  {
    v7 = i + 109;
    if( i[6] && PopFxIsDripsBlockingDevice((INT64)i, a1, i + 111) )
    {
      PopFxAddRefDevice((ULONG_PTR)i);
      v8 = (_QWORD **)a2[1];
      if( *v8 != a2 )
        __fastfail(3u);
      *v7 = a2;
      i[110] = (ULONG_PTR)v8;
      *v8 = v7;
      a2[1] = v7;
    }
  }
  if( (_InterlockedExchangeAdd64((volatile signed __int64 *)&PopFxDeviceListLock, 0xFFFFFFFFFFFFFFFFui64) & 6) == 2 )
    ExfTryToWakePushLock((volatile INT64 *)&PopFxDeviceListLock);
  v9 = (_ETHREAD *)KeGetCurrentThread();
  v39 = 0;
  if( (unsigned int)MiGetSystemRegionType((UINT64)&PopFxDeviceListLock) == 1 )
    SessionId = MmGetSessionIdEx(*((_QWORD *)v9 + 23));
  else
    SessionId = -1;
  --*((_WORD *)v9 + 243);
  v11 = ++*((_BYTE *)v9 + 794);
  v12 = (*((char *)v9 + 792) | *((char *)v9 + 870)) ^ 0x3F;
  while( 1 )
  {
    v14 = !_BitScanReverse((unsigned int *)&v15, v12);
    if( v14 )
      goto LABEL_20;
    v13 = *((_QWORD *)v9 + 100) + 96 * v15;
    v12 &= ~(1 << v15);
    if( (*(_BYTE *)(v13 + 26) & 1) != 0
      && (*(_DWORD *)(v13 + 32) & 1) == 0
      && (*(_QWORD *)(v13 + 32) & 0x7FFFFFFFFFFFFFFCi64) == ((unsigned __int64)&PopFxDeviceListLock & 0x7FFFFFFFFFFFFFFCi64)
      && *(_DWORD *)(v13 + 40) == SessionId )
    {
      *(_BYTE *)(v13 + 26) &= ~1u;
      if( *(_QWORD *)(v13 + 32) )
        break;
    }
  }
  if( !v13 )
  {
LABEL_20:
    if( (*((_DWORD *)v9 + 30) & 0x10000) == 0 )
      KeBugCheckEx(0x162u, (ULONG_PTR)v9, (ULONG_PTR)&PopFxDeviceListLock, SessionId, 0i64);
    goto LABEL_27;
  }
  *(_BYTE *)(v13 + 32) |= 2u;
  if( *(__int64 *)(v13 + 32) < 0 )
    KiAbEntryRemoveFromTree(v13);
  v16 = *(_DWORD *)(v13 + 88) & 0x1FFFF;
  v17 = *(_DWORD *)(v13 + 88) & 0xFFFE0000;
  *(_BYTE *)(v13 + 25) &= ~1u;
  v39 = v16;
  *(_DWORD *)(v13 + 88) = v17;
  *(_QWORD *)(v13 + 32) = 0i64;
  v18 = (__int64)(v13 - *((_QWORD *)v9 + 100)) / 96;
  if( v11 == 1 )
    *((_BYTE *)v9 + 792) |= 1 << v18;
  else
    _InterlockedOr8((volatile signed __int8 *)v9 + 870, 1 << v18);
LABEL_27:
  --*((_BYTE *)v9 + 794);
  KiAbThreadRemoveBoosts((ULONG_PTR)v9, (__int64)&PopFxDeviceListLock, (unsigned int *)&v39);
  v14 = (*((_WORD *)v9 + 243))++ == 0xFFFF;
  if( v14 && *((_ETHREAD **)v9 + 19) != (_ETHREAD *)((char *)v9 + 152) )
    KiCheckForKernelApcDelivery();
  v19 = (__int64 *)*a2;
  if( (_QWORD *)*a2 != a2 )
  {
    while( 1 )
    {
      v20 = (__int64 *)*(v19 - 103);
      IoGetDevicePropertyData((DEVICE_OBJECT *)v20[4], (DEVPROPKEY *)&DEVPKEY_PciDevice_DeviceType, 0i64, 0i64);
      v4 = v21;
      if( v21 < 0 || v40 != 8 )
      {
        IoGetDevicePropertyData((DEVICE_OBJECT *)v20[4], (DEVPROPKEY *)&DEVPKEY_Device_ClassGuid, 0i64, 0i64);
        v4 = v22;
        if( v22 < 0 || v41 != 13 || v42 != 16 )
          goto LABEL_81;
        v23 = *(_QWORD *)&GUID_DEVICE_CLASS_USB_CONTROLLER.Data1 - v53;
        if( *(_QWORD *)&GUID_DEVICE_CLASS_USB_CONTROLLER.Data1 == (_QWORD)v53 )
          v23 = *(_QWORD *)GUID_DEVICE_CLASS_USB_CONTROLLER.Data4 - *((_QWORD *)&v53 + 1);
        if( v23 )
        {
LABEL_81:
          v4 = 0;
          goto LABEL_82;
        }
      }
      v24 = (__int64 *)v20[1];
      v25 = 0;
      v26 = v20;
      while( v24 )
      {
        v26 = v24;
        v24 = (__int64 *)v24[1];
      }
      if( v26 != v20 )
        break;
LABEL_82:
      v19 = (__int64 *)*v19;
      if( v19 == a2 )
        goto LABEL_83;
    }
    do
    {
      if( *((_DWORD *)v26 + 39) == 1 )
      {
        _InterlockedAnd((volatile signed __int32 *)v26 + 74, 0xFFFFFFDF);
        if( (unsigned __int8)RtlPrefixUnicodeString(&String1, v26 + 5)
          || (unsigned __int8)RtlPrefixUnicodeString(&EventHandle, v26 + 5) )
        {
          v28 = v26;
          if( v26 == v20 )
          {
LABEL_53:
            _InterlockedOr((volatile signed __int32 *)v26 + 74, 0x20u);
            if( v25 + 1 < v25 )
              goto LABEL_87;
            ++v25;
            v4 = 0;
          }
          else
          {
            while( *((_DWORD *)v28 + 39) == 1 )
            {
              v28 = (__int64 *)v28[2];
              if( v28 == v20 )
                goto LABEL_53;
            }
          }
        }
      }
      v27 = (__int64 *)*v26;
      if( *v26 )
      {
        do
        {
          v26 = v27;
          v27 = (__int64 *)v27[1];
        }
        while( v27 );
      }
      else
      {
        v26 = (__int64 *)v26[2];
      }
    }
    while( v26 != v20 );
    if( !v25 )
      goto LABEL_82;
    v29 = 8i64 * v25;
    if( v29 > 0xFFFFFFFF )
    {
LABEL_87:
      v4 = -1073741675;
      goto LABEL_84;
    }
    v4 = 0;
    PoolWithTag = ExAllocatePoolWithTag(PagedPool, (unsigned int)v29, 0x4D584650ui64);
    v31 = PoolWithTag;
    if( PoolWithTag )
    {
      memset((INT64)PoolWithTag, 0i64);
      v32 = (volatile signed __int32 *)v20[1];
      v33 = 0;
      v34 = (volatile signed __int32 *)v20;
      while( v32 )
      {
        v34 = v32;
        v32 = (volatile signed __int32 *)*((_QWORD *)v32 + 1);
      }
      if( v34 == (volatile signed __int32 *)v20 )
        goto LABEL_76;
      while( 1 )
      {
        _m_prefetchw((const void *)(v34 + 74));
        if( (_InterlockedOr(v34 + 74, 0) & 0x20) != 0 )
        {
          if( v33 >= v25 )
          {
            if( (unsigned int)dword_140C021E8 > 5 && tlgKeywordOn((__int64)&dword_140C021E8, 0x400000000000i64) )
            {
              v56 = 4i64;
              v45 = v33 + 1;
              v46 = v25;
              v55 = (int *)&v45;
              v58 = 4i64;
              v57 = (int *)&v46;
              v51 = 0x1000000i64;
              v59 = &v51;
              v60 = 8i64;
              tlgWriteTransfer_EtwWriteTransfer(
                (__int64)&dword_140C021E8,
                (unsigned __int8 *)byte_140025F88,
                0i64,
                v37,
                5u,
                &v54);
            }
LABEL_76:
            if( v33 != v25
              && (unsigned int)dword_140C021E8 > 5
              && tlgKeywordOn((__int64)&dword_140C021E8, 0x400000000000i64) )
            {
              v47 = v33;
              v62 = (int *)&v47;
              v63 = 4i64;
              v64 = (int *)&v48;
              v48 = v25;
              v66 = &v52;
              v65 = 4i64;
              v52 = 0x1000000i64;
              v67 = 8i64;
              tlgWriteTransfer_EtwWriteTransfer(
                (__int64)&dword_140C021E8,
                (unsigned __int8 *)&byte_140025FE7,
                0i64,
                0i64,
                5u,
                &v61);
            }
            v19[3] = (__int64)v31;
            *((_DWORD *)v19 + 8) = v33;
            goto LABEL_82;
          }
          _InterlockedAnd(v34 + 74, 0xFFFFFFDF);
          v35 = v33++;
          v31[v35] = v34;
        }
        v36 = *(volatile signed __int32 **)v34;
        if( *(_QWORD *)v34 )
        {
          do
          {
            v34 = v36;
            v36 = (volatile signed __int32 *)*((_QWORD *)v36 + 1);
          }
          while( v36 );
        }
        else
        {
          v34 = (volatile signed __int32 *)*((_QWORD *)v34 + 2);
        }
        if( v34 == (volatile signed __int32 *)v20 )
          goto LABEL_76;
      }
    }
    v4 = -1073741670;
LABEL_83:
    if( v4 < 0 )
LABEL_84:
      PopFxDestroyDripsBlockingDeviceList(a2);
  }
  return(unsigned int)v4;
}

Referenced by:

PopDripsWatchdogCallbackHandler
PopDripsWatchdogTakeAction