IovpCompleteRequest1

INT64 __fastcall IovpCompleteRequest1(unsigned __int64 a1, char a2, __int64 a3){
  unsigned __int8 CurrentIrql; 
  INT64 result; 
  __int64 v8; 
  _IOV_FORCED_PENDING_TRACE *started; 
  __int64 v10; 
  __int64 v11; 
  int v12; 
  __int64 v13; 
  CurrentIrql = KeGetCurrentIrql();
  result = (INT64)VfIrpDatabaseEntryFindAndLock(a1);
  v8 = result;
  if( result )
  {
    *(_BYTE *)(result + 61) = CurrentIrql;
    started = 0i64;
    *(_BYTE *)(result + 60) = CurrentIrql;
    v10 = *(_QWORD *)(result + 240);
    *(_QWORD *)a3 = v10;
    *(_QWORD *)(a3 + 8) = result;
    v11 = *(_QWORD *)(a1 + 184);
    if( v10 )
    {
      if( (*(_DWORD *)(result + 56) & 0x10) != 0 )
        ViErrorReport1(521i64, *(const VOID **)(a3 + 32), (const VOID *)a1);
      *(_BYTE *)(v8 + 185) = a2;
      if( *(_QWORD *)(v8 + 216) && *(int *)(v8 + 56) >= 0 )
      {
        started = VfPendingStartLogging((_IRP *)a1);
        *(_BYTE *)(*(_QWORD *)(a1 + 184) + 3i64) |= 1u;
      }
      *(_QWORD *)(v10 + 48) = 0i64;
      v12 = *(unsigned __int8 *)(v8 + 186) - *(char *)(a1 + 67);
      *(_DWORD *)(a3 + 20) = v12;
      IovpAdvanceStackDownwards(v10 + 80, *(_BYTE *)(a1 + 67), v11, v11 + 72i64 * v12, v12, 0, 0, &v13);
      result = VfIrpDatabaseEntryReleaseLock((_QWORD *)v8);
      if( started )
        return VfPendingFinishLogging((INT64)started);
    }
    else
    {
      return VfIrpDatabaseEntryReleaseLock((_QWORD *)result);
    }
  }
  else
  {
    *(_QWORD *)a3 = 0i64;
  }
  return result;
}

Referenced by:

IovCompleteRequest