PipSendQueryRemoveIrpAndCheckOpenHandles
INT64 __fastcall PipSendQueryRemoveIrpAndCheckOpenHandles(
INT64 a1,
INT64 a2,
INT64 r8_0,
UINT64 a4,
VOID **DeviceObjects,
INT64 VetoType){
__int64 v6;
_DWORD *v8;
unsigned int v9;
int v10;
int v11;
char v12;
int v13;
__int64 v14;
_LIST_ENTRY *Flink;
int v17;
_LIST_ENTRY *v18;
_LIST_ENTRY **p_Blink;
_LIST_ENTRY *v20;
_LIST_ENTRY *v21;
INT64 a3;
_UNICODE_STRING *DeviceInstance;
_LIST_ENTRY VetoProcessListHead;
int v25;
bool v26;
__int16 v27;
char v28;
DEVICE_OBJECT *VetoingDevice;
v6 = *(_QWORD *)(a2 + 152);
v8 = (_DWORD *)VetoType;
v9 = a4;
v10 = a1;
LOBYTE(a4) = 1;
VetoingDevice = 0i64;
v11 = PnpDeleteLockedDeviceNodes(
(_DEVICE_OBJECT *)v6,
(_RELATION_LIST *)r8_0,
QueryRemoveDevice,
a4,
*(_DWORD *)(a2 + 16),
*(_DWORD *)(a2 + 20),
(_PNP_VETO_TYPE *)VetoType,
(_UNICODE_STRING *)(VetoType + 8));
v12 = 0;
v27 = 0;
if( (v10 & 0xFFFFFFFB) == 0 )
v12 = 1;
v28 = 0;
LOBYTE(v27) = v12;
v13 = v11;
if( v6 )
v14 = *(_QWORD *)(*(_QWORD *)(v6 + 312) + 40i64);
else
v14 = 0i64;
v25 = 0;
DeviceInstance = (_UNICODE_STRING *)(v14 + 40);
VetoProcessListHead.Blink = &VetoProcessListHead;
VetoProcessListHead.Flink = &VetoProcessListHead;
a3 = 0i64;
v26 = (NtGlobalFlag & 0x4000) != 0;
if( v13 < 0 )
{
if( *v8 == 6 )
PnpCollectOpenHandles((DEVICE_OBJECT **)DeviceObjects, (VOID *)v9, (INT64)&a3);
}
else
{
v13 = PipEventRemovalCheckOpenHandles((DEVICE_OBJECT **)DeviceObjects, v9, &VetoingDevice);
if( v13 < 0 )
{
PipRecordOpenHandleVeto(v9, DeviceObjects, VetoingDevice, (INT64)&a3, (INT64)v8);
LOBYTE(v17) = 1;
PnpDeleteLockedDeviceNodes(
(_DEVICE_OBJECT *)v6,
(_RELATION_LIST *)r8_0,
CancelRemoveDevice,
v17,
0,
0,
0i64,
0i64);
v13 = -2147483608;
}
}
if( (_BYTE)v27 )
{
PnpLogVetoInformation(DeviceInstance, &VetoProcessListHead);
while( 1 )
{
Flink = VetoProcessListHead.Flink;
if( VetoProcessListHead.Flink == &VetoProcessListHead )
break;
if( VetoProcessListHead.Flink->Blink != &VetoProcessListHead
|| (v18 = VetoProcessListHead.Flink->Flink, VetoProcessListHead.Flink->Flink->Blink != VetoProcessListHead.Flink) )
{
LABEL_23:
__fastfail(3u);
}
VetoProcessListHead.Flink = VetoProcessListHead.Flink->Flink;
v18->Blink = &VetoProcessListHead;
p_Blink = &Flink[-2].Blink;
while( 1 )
{
v20 = *p_Blink;
if( *p_Blink == (_LIST_ENTRY *)p_Blink )
break;
if( (_LIST_ENTRY **)v20->Blink != p_Blink )
goto LABEL_23;
v21 = v20->Flink;
if( v20->Flink->Blink != v20 )
goto LABEL_23;
*p_Blink = v21;
v21->Blink = (_LIST_ENTRY *)p_Blink;
HalPutDmaAdapter((PADAPTER_OBJECT)v20[-1].Blink);
ExFreePoolWithTag(&v20[-1].Blink, 0x50706E50u);
}
ExFreePoolWithTag(p_Blink, 0x4F706E50u);
}
}
return(unsigned int)v13;
}Referenced by:
PipProcessQueryRemovalInKernelMode