ViCheckAdapterBuffers

VOID **__fastcall ViCheckAdapterBuffers(INT64 a1){
  UINT64 v1; 
  VOID **result; 
  _QWORD *v3; 
  UINT16 v4; 
  UINT64 *v5; 
  _QWORD *v6; 
  unsigned __int8 v7; 
  unsigned __int64 v8; 
  UINT64 v9; 
  UINT16 v10; 
  unsigned __int64 v11; 
  _QWORD *v12; 
  _QWORD *v13; 
  void *retaddr; 
  result = &retaddr;
  v3 = (_QWORD *)(a1 + 80);
  v4 = 0;
  if( (_QWORD *)*v3 != v3 )
  {
    v5 = (UINT64 *)(a1 + 96);
    KeAcquireSpinLockRaiseToDpc((UINT64 *)(a1 + 96), v1);
    v6 = (_QWORD *)*v3;
    v8 = v7;
    while( 1 )
    {
      v12 = v6 - 6;
      v13 = v12 + 6;
      if( v3 == v12 + 6 )
        break;
      v9 = *((unsigned int *)v12 + 2);
      v10 = v4 | 1;
      v11 = v12[3] - v12[2];
      if( v11 < 8 )
        v10 = v4;
      v4 = v10 | 2;
      if( v9 + v11 + 8 > *((unsigned int *)v12 + 1) )
        v4 = v10;
      ViCheckTag((PVOID)v12[3], v9, 0i64, v4);
      v6 = (_QWORD *)*v13;
    }
    KxReleaseSpinLock(v5);
    result = (VOID **)(unsigned int)KiIrqlFlags;
    __writecr8(v8);
  }
  return result;
}

Referenced by:

VfMapTransfer
VfMapTransferEx