IovpCallDriver1

int __fastcall IovpCallDriver1(__int64 a1){
  unsigned __int64 v1; 
  unsigned __int8 CurrentIrql; 
  volatile signed __int32 *v4; 
  __int64 v5; 
  __int64 v6; 
  int v7; 
  int v8; 
  unsigned __int8 *v9; 
  int ShouldForce; 
  char *v11; 
  int v12; 
  __int64 v13; 
  int v14; 
  int v15; 
  __int64 v16; 
  _DEVICE_OBJECT *v17; 
  _DEVICE_OBJECT *v18; 
  __int64 v19; 
  int IsNewRequest; 
  char v21; 
  int v22; 
  __int64 v23; 
  bool v24; 
  void *LowerDeviceObjectWithTag; 
  __int64 v26; 
  _QWORD *v27; 
  _QWORD *v28; 
  __int64 v29; 
  __int64 v30; 
  void *v31; 
  VOID *v32; 
  char *v33; 
  char v34; 
  VOID *v36; 
  _IO_STACK_LOCATION *IrpLastSp; 
  __int64 v38; 
  char *v39; 
  INT64 started; 
  int v41; 
  int v42; 
  int v43; 
  VOID *v44; 
  v1 = *(_QWORD *)(a1 + 168);
  v38 = 0i64;
  IrpLastSp = 0i64;
  v42 = 0;
  CurrentIrql = KeGetCurrentIrql();
  LODWORD(v4) = *(_DWORD *)(v1 + 16) & 0xC0000000;
  if( (_DWORD)v4 )
  {
    if( (_DWORD)v4 != 0x40000000 )
      return(int)v4;
    v4 = VfIrpDatabaseEntryFindAndLock(v1);
    v5 = (__int64)v4;
  }
  else
  {
    v4 = VfIrpDatabaseEntryFindAndLock(v1);
    v5 = (__int64)v4;
    if( v4 )
    {
      *(_DWORD *)(v1 + 16) |= 0x40000000u;
    }
    else
    {
      LODWORD(v6) = VfPacketCreateAndLock(v1);
      v5 = v6;
      v7 = *(_DWORD *)(v1 + 16);
      if( v5 )
        LODWORD(v4) = v7 | 0x40000000;
      else
        LODWORD(v4) = v7 | 0x80000000;
      *(_DWORD *)(v1 + 16) = (_DWORD)v4;
    }
  }
  if( v5 )
  {
    v8 = *(_DWORD *)(v5 + 232);
    *(_BYTE *)(v5 + 61) = CurrentIrql;
    *(_BYTE *)(v5 + 60) = CurrentIrql;
    v36 = *(VOID **)(a1 + 176);
    v9 = (unsigned __int8 *)(*(_QWORD *)(v1 + 184) - 72i64);
    started = 0i64;
    v44 = v36;
    ShouldForce = VfPendingShouldForce(v8, CurrentIrql, v1, v9, v5, (unsigned __int64)v36);
    v11 = *(char **)(v5 + 240);
    v12 = ShouldForce;
    v13 = *(_QWORD *)(a1 + 160);
    v43 = ShouldForce;
    v39 = v11;
    if( v11 || (v14 = *(_DWORD *)(v5 + 56), (v14 & 1) != 0) )
    {
      v15 = 0;
      v41 = 0;
    }
    else
    {
      v41 = 1;
      *(_DWORD *)(v5 + 56) = v14 | 1;
      v11 = IovpSessionDataCreate(v13, (__int64 *)v5, v12);
      v39 = v11;
      v15 = 1;
    }
    *(_QWORD *)a1 = v11;
    *(_QWORD *)(a1 + 16) = v5;
    if( v11 )
    {
      v16 = *(_QWORD *)&KUSER_SHARED_DATA.SystemTime.LowPart;
      if( v15 )
      {
        LODWORD(v17) = IovUtilGetBottomDeviceObjectWithTag((PVOID)v13);
        v18 = v17;
        VfIrpLogRecordEvent(*(unsigned int *)(v5 + 232), v17, (_IRP *)v1);
        ObfDereferenceObjectWithTag(v18, 0x49667256ui64);
        _InterlockedIncrement((volatile signed __int32 *)(v5 + 20));
        v11 = v39;
        ++*(_DWORD *)(v5 + 24);
        IovpSessionDataReference(v11);
      }
      if( *(_QWORD *)(v1 + 104) )
      {
        ViErrorReport1(515i64, v44, (const VOID *)v1);
        *(_QWORD *)(v1 + 104) = 0i64;
      }
      if( (*(_DWORD *)(v5 + 56) & 0x10) != 0 )
        ViErrorReport1(517i64, v44, (const VOID *)v1);
      if( *(_BYTE *)(v1 + 67) <= *(_BYTE *)(v1 + 66)
        && (unsigned __int8)(*v9 - 3) <= 1u
        && *(_QWORD *)(*(_QWORD *)(a1 + 168) + 8i64)
        && (MmVerifierData & 0x6000) != 0 )
      {
        MdlInvariantPreProcessing1(a1, v5, (INT64)v9);
      }
      *((_DWORD *)v11 + 14) = IovpExamineDevObjForwarding(v13, *((_QWORD *)v11 + 6));
      IovpExamineIrpStackForwarding(v5, v41, v19, v1, v44, (unsigned __int16 *)v9, &IrpLastSp, &v42);
      if( v43 )
      {
        _InterlockedIncrement((volatile signed __int32 *)(v5 + 20));
        ++*(_DWORD *)(v5 + 24);
        *(_QWORD *)(v5 + 216) = v9;
        started = (INT64)VfPendingStartLogging((_IRP *)v1);
      }
      IsNewRequest = VfMajorIsNewRequest(IrpLastSp, (_IO_STACK_LOCATION *)v9);
      v21 = *(_BYTE *)(v1 + 67);
      v43 = IsNewRequest;
      v22 = IovpAdvanceStackDownwards(
              (__int64)(v11 + 80),
              v21,
              (__int64)v9,
              (__int64)IrpLastSp,
              v42,
              IsNewRequest,
              1,
              &v38);
      v23 = v38;
      *(_QWORD *)(v38 + 48) = v16;
      if( !v22 )
      {
        *(_DWORD *)(a1 + 24) |= 0x4000000u;
        v24 = v43 == 0;
        *(_QWORD *)(a1 + 40) = a1 + 32;
        *(_QWORD *)(a1 + 32) = a1 + 32;
        *(_QWORD *)(v23 + 56) = v16;
        v23 = v38;
        *(_QWORD *)(v38 + 112) = KeGetCurrentThread();
        if( !v24 )
        {
          *(_OWORD *)(v23 + 80) = *(_OWORD *)(v1 + 48);
          *(_OWORD *)(v23 + 96) = *(_OWORD *)(v1 + 48);
          if( v41 )
            *(_DWORD *)(v23 + 4) |= 0x8000000u;
        }
      }
      LowerDeviceObjectWithTag = IovUtilGetLowerDeviceObjectWithTag(v13);
      if( LowerDeviceObjectWithTag )
        ObfDereferenceObjectWithTag(LowerDeviceObjectWithTag, 0x49667256ui64);
      else
        *(_DWORD *)(v23 + 4) |= 0x10000000u;
      LODWORD(v26) = VfGetPristineDispatchRoutine(*(DRIVER_OBJECT **)(v13 + 8), *v9);
      *(_QWORD *)(v23 + 40) = v26;
      v27 = (_QWORD *)(a1 + 32);
      *(_DWORD *)(v23 + 4) &= ~0x40000000u;
      v28 = (_QWORD *)(v23 + 16);
      v29 = *(_QWORD *)(v23 + 16);
      if( *(_QWORD *)(v29 + 8) != v23 + 16 )
        __fastfail(3u);
      *v27 = v29;
      *(_QWORD *)(a1 + 40) = v28;
      *(_QWORD *)(v29 + 8) = v27;
      *v28 = v27;
      *(_QWORD *)(a1 + 8) = v23;
      *(_QWORD *)(a1 + 72) = v1;
      v30 = *(_QWORD *)(v1 + 184);
      *(_OWORD *)(a1 + 80) = *(_OWORD *)(v30 - 72);
      *(_OWORD *)(a1 + 96) = *(_OWORD *)(v30 - 56);
      *(_OWORD *)(a1 + 112) = *(_OWORD *)(v30 - 40);
      *(_OWORD *)(a1 + 128) = *(_OWORD *)(v30 - 24);
      *(_QWORD *)(a1 + 144) = *(_QWORD *)(v30 - 8);
      if( (v9[3] & 1) != 0 )
        *(_DWORD *)(a1 + 24) |= 0x1000000u;
      if( *v9 == 27 && v9[1] == 2 )
      {
        *(_DWORD *)(a1 + 24) |= 0x20000000u;
        LODWORD(v31) = IovUtilGetBottomDeviceObjectWithTag((PVOID)v13);
        *(_QWORD *)(a1 + 64) = v31;
        ObfDereferenceObjectWithTag(v31, 0x49667256ui64);
        if( (unsigned int)IovUtilIsInFdoStack((DEVICE_OBJECT *)v13)
          && !(unsigned int)IovUtilIsDeviceObjectMarked(v13, 3) )
        {
          *(_DWORD *)(a1 + 24) |= 0x10000000u;
        }
        VfDevObjMarkDeviceRemoved((DEVICE_OBJECT *)v13);
      }
      v32 = v44;
      if( v41 )
        VfMajorVerifyNewIrp(v5, v1, v9, v23, (__int64)v44);
      if( v43 && (*(_DWORD *)(v5 + 56) & 0x80000) == 0 )
        VfMajorVerifyNewRequest(v5, v13, (__int64)IrpLastSp, v9, v23, (__int64)v32);
      VfMajorVerifyIrpStackDownward(v5, v13, (__int64)IrpLastSp, v9, v23, (__int64)v32);
      v33 = v39;
      *((_QWORD *)v39 + 6) = v13;
      *(_BYTE *)(v5 + 186) = *(_BYTE *)(v1 + 67);
      *(_OWORD *)(*(_QWORD *)(v23 + 8) + 96i64) = *(_OWORD *)(v1 + 48);
      v34 = *(_BYTE *)(v1 + 67);
      if( v34 > 2 )
      {
        *(_QWORD *)(v1 + 184) -= 72i64;
        *(_BYTE *)(v1 + 67) = v34 - 1;
        *(_BYTE *)(*(_QWORD *)(v1 + 184) - 69i64) |= 0x10u;
        ++*(_BYTE *)(v1 + 67);
        *(_QWORD *)(v1 + 184) += 72i64;
      }
      IovpSessionDataReference(v33);
      _InterlockedIncrement((volatile signed __int32 *)(v5 + 20));
      if( VfWdCancelTimeoutTicks )
        ViWdBeforeCallDriver((_IRP *)v1, *(VOID **)(a1 + 48), (_VF_WATCHDOG_IRP **)(v5 + 248));
    }
    VfIrpDatabaseEntryReleaseLock((_QWORD *)v5);
    LODWORD(v4) = started;
    if( started )
      LODWORD(v4) = VfPendingFinishLogging(started);
  }
  return(int)v4;
}

Referenced by:

VfBeforeCallDriver