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