ViRemoveChannelWcb

INT64 __fastcall ViRemoveChannelWcb(INT64 a1, INT64 a2, INT64 a3){
  char v6; 
  UINT64 *v8; 
  unsigned __int8 v9; 
  unsigned __int64 v10; 
  INT64 v11; 
  __int64 i; 
  INT64 v13; 
  __int64 v14; 
  _QWORD *v15; 
  v6 = 0;
  if( a2 && a3 )
    return 0i64;
  v8 = (UINT64 *)(a1 + 144);
  KeAcquireSpinLockRaiseToDpc((UINT64 *)(a1 + 144), a2);
  v10 = v9;
  v11 = a1 + 128;
  for( i = *(_QWORD *)(a1 + 128); ; i = *(_QWORD *)(v13 + 72) )
  {
    v13 = i - 72;
    if( v11 == v13 + 72 )
      break;
    if( a2 && (*(_QWORD *)(v13 + 96) == a2 || *(_QWORD *)(v13 + 88) == a2)
      || a3 && *(_QWORD *)(v13 + 40) == a3
      || *(_DWORD *)(v13 + 52) <= 1u )
    {
      v14 = *(_QWORD *)(v13 + 72);
      v15 = *(_QWORD **)(v13 + 80);
      if( *(_QWORD *)(v14 + 8) != v13 + 72 || *v15 != v13 + 72 )
        __fastfail(3u);
      *v15 = v14;
      v6 = 1;
      *(_QWORD *)(v14 + 8) = v15;
      break;
    }
  }
  KxReleaseSpinLock(v8);
  __writecr8(v10);
  if( v6 != 1 )
    return 0i64;
  return v13;
}

Referenced by:

VfCancelAdapterChannel
VfFreeAdapterChannel
VfFreeMapRegisters