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