PipSendQueryRemoveIrpAndCheckOpenHandles
NTSTATUS __stdcall PipSendQueryRemoveIrpAndCheckOpenHandles(
INT64 a1,
INT64 a2,
INT64 a3,
UINT64 a4,
VOID **DeviceObjects,
INT64 a6){
_DEVICE_OBJECT *v6;
_DWORD *a5;
unsigned int v9;
int v10;
int v11;
char v12;
int v13;
void *DeviceNode;
__int64 v15;
__int64 v17;
_QWORD *v18;
_QWORD *v19;
__int64 v20;
_ENUM_HANDLES_CONTEXT EnumContext[2];
__int64 v22;
__int64 v23[2];
int v24;
bool v25;
__int16 v26;
char v27;
_DEVICE_OBJECT *VetoingDevice;
v6 = *(_DEVICE_OBJECT **)(a2 + 152);
a5 = (_DWORD *)a6;
v9 = a4;
v10 = a1;
VetoingDevice = 0i64;
v11 = PnpDeleteLockedDeviceNodes(
v6,
(_RELATION_LIST *)a3,
0,
1,
*(_DWORD *)(a2 + 16),
*(_DWORD *)(a2 + 20),
a6,
a6 + 8);
v12 = 0;
v26 = 0;
if( (v10 & 0xFFFFFFFB) == 0 )
v12 = 1;
v27 = 0;
LOBYTE(v26) = v12;
v13 = v11;
if( v6 )
DeviceNode = v6->DeviceObjectExtension->DeviceNode;
else
DeviceNode = 0i64;
v24 = 0;
v22 = (__int64)DeviceNode + 40;
v23[1] = (__int64)v23;
v23[0] = (__int64)v23;
*(_QWORD *)EnumContext = 0i64;
v25 = (NtGlobalFlag & 0x4000) != 0;
if( v13 < 0 )
{
if( *a5 == 6 )
PnpCollectOpenHandles(DeviceObjects, v9, (__int64)EnumContext);
}
else
{
v13 = PipEventRemovalCheckOpenHandles((_DEVICE_OBJECT **)DeviceObjects, v9, &VetoingDevice);
if( v13 < 0 )
{
PipRecordOpenHandleVeto(v9, (_DEVICE_OBJECT **)DeviceObjects, VetoingDevice, EnumContext, (INT64)a5);
PnpDeleteLockedDeviceNodes(v6, (_RELATION_LIST *)a3, 1, 1, 0, 0, 0i64, 0i64);
v13 = -2147483608;
}
}
if( (_BYTE)v26 )
{
PnpLogVetoInformation(v22, v23);
while( 1 )
{
v15 = v23[0];
if( (__int64 *)v23[0] == v23 )
break;
if( *(__int64 **)(v23[0] + 8) != v23
|| (v17 = *(_QWORD *)v23[0], *(_QWORD *)(*(_QWORD *)v23[0] + 8i64) != v23[0]) )
{
LABEL_23:
__fastfail(3u);
}
v23[0] = *(_QWORD *)v23[0];
*(_QWORD *)(v17 + 8) = v23;
v18 = (_QWORD *)(v15 - 24);
while( 1 )
{
v19 = (_QWORD *)*v18;
if( (_QWORD *)*v18 == v18 )
break;
if( (_QWORD *)v19[1] != v18 )
goto LABEL_23;
v20 = *v19;
if( *(_QWORD **)(*v19 + 8i64) != v19 )
goto LABEL_23;
*v18 = v20;
*(_QWORD *)(v20 + 8) = v18;
HalPutDmaAdapter((PADAPTER_OBJECT)*(v19 - 1));
ExFreePoolWithTag(v19 - 1, 0x50706E50u);
}
ExFreePoolWithTag(v18, 0x4F706E50u);
}
}
return v13;
}Referenced by:
PipProcessQueryRemovalInKernelMode