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