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