ViCheckAdapterBuffers

VOID **__fastcall ViCheckAdapterBuffers(INT64 a1){
  VOID **result; 
  _QWORD *v2; 
  UINT16 v3; 
  UINT64 *v4; 
  unsigned __int8 v5; 
  _QWORD *v6; 
  unsigned __int64 v7; 
  UINT64 v8; 
  UINT16 v9; 
  unsigned __int64 v10; 
  _QWORD *v11; 
  _QWORD *v12; 
  void *retaddr; 

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

Referenced by:

VfMapTransfer
VfMapTransferEx