IovpCallDriver2

VOID **__fastcall IovpCallDriver2(INT64 a1, INT64 *a2){
  VOID **result; 
  _DWORD *v3; 
  __int64 v6; 
  char v7; 
  bool v8; 
  int v9; 
  _DEVICE_OBJECT *v10; 
  VOID *LowerDeviceObjectWithTag; 
  VOID *v12; 
  _DEVICE_OBJECT *v13; 
  _DWORD *DeviceNode; 
  int v15; 
  _FAST_IO_DISPATCH *FastIoDispatch; 
  _VF_ERROR_ID v17; 
  int v18; 
  INT64 v19; 
  _VF_ERROR_ID v20; 
  VOID *v21; 
  INT64 v22; 
  int v23; 
  int v24; 
  __int64 v25; 
  _QWORD *v26; 
  int v27; 
  void *retaddr; 

  result = &retaddr;
  v3 = *(_DWORD **)a1;
  if( !*(_QWORD *)a1 )
    return result;
  v6 = *(_QWORD *)(a1 + 16);
  v7 = KeAcquireSpinLockRaiseToDpc((UINT64 *)(v6 + 8));
  v8 = *(_QWORD *)(v6 + 216) == 0i64;
  *(_BYTE *)(v6 + 16) = v7;
  if( !v8 && (*(_DWORD *)(a1 + 24) & 0x2000000) != 0 )
    *(_DWORD *)a2 = 259;
  v9 = *(_DWORD *)(a1 + 24);
  v10 = *(_DEVICE_OBJECT **)(a1 + 160);
  if( (v9 & 0x20000000) != 0 && *(_DWORD *)a2 != 259 && (v9 & 0x1000000) == 0 )
  {
    LowerDeviceObjectWithTag = IovUtilGetLowerDeviceObjectWithTag(*(_QWORD *)(a1 + 160));
    v12 = LowerDeviceObjectWithTag;
    if( (*(_DWORD *)(a1 + 24) & 0x10000000) != 0 )
    {
LABEL_12:
      if( !LowerDeviceObjectWithTag )
        goto LABEL_19;
      FastIoDispatch = v10->DriverObject->FastIoDispatch;
      if( FastIoDispatch && FastIoDispatch->FastIoDetachDevice )
        goto LABEL_17;
      v17 = 541;
      goto LABEL_16;
    }
    v13 = *(_DEVICE_OBJECT **)(a1 + 64);
    DeviceNode = v13->DeviceObjectExtension->DeviceNode;
    if( !DeviceNode )
      goto LABEL_17;
    v15 = DeviceNode[99];
    if( (v15 & 0x10) == 0 )
    {
      if( (v15 & 0x10000) == 0 )
        goto LABEL_17;
      goto LABEL_12;
    }
    if( v10 == v13 )
    {
      if( (unsigned int)IovUtilIsDeviceObjectMarked(v10, 0) )
      {
        v17 = 545;
LABEL_16:
        ViErrorReport10(v17, *(VOID **)(a1 + 48), *(const VOID **)(a1 + 72), v10);
      }
    }
    else if( !(unsigned int)IovUtilIsDeviceObjectMarked(v10, 0) && (unsigned int)IovUtilIsDeviceObjectMarked(v10, 0) )
    {
      v17 = 547;
      goto LABEL_16;
    }
LABEL_17:
    if( v12 )
      ObfDereferenceObjectWithTag(v12, 0x49667256ui64);
  }
LABEL_19:
  v18 = *(_DWORD *)(a1 + 24);
  if( (v18 & 0x40000000) == 0 || (v3[8] & 2) != 0 )
    goto LABEL_35;
  v19 = *(unsigned int *)a2;
  if( (v18 & 0x2000000) != 0 )
  {
    if( (_DWORD)v19 == 259 || (v18 & 0x1000000) != 0 )
      goto LABEL_35;
    v20 = 574;
  }
  else
  {
    if( (_DWORD)v19 != 259 && (v18 & 0x1000000) == 0 )
      goto LABEL_35;
    v20 = 588;
  }
  ViErrorReport6(v20, *(VOID **)(a1 + 48), *(const VOID **)(a1 + 72), v19);
  v3[8] |= 2u;
LABEL_35:
  v21 = (VOID *)*(unsigned int *)a2;
  if( (*(_DWORD *)(a1 + 24) & 0x40000000) != 0 )
  {
    v22 = *(unsigned int *)(a1 + 56);
    if( (_DWORD)v21 == (_DWORD)v22 || (_DWORD)v21 == 259 )
    {
      if( (_DWORD)v21 == -1 )
        ViErrorReport6(549, *(VOID **)(a1 + 48), *(const VOID **)(a1 + 72), 0xFFFFFFFFi64);
    }
    else
    {
      v23 = v3[8];
      if( (v23 & 1) == 0 )
      {
        ViErrorReport4(v21, *(_IRP_MINI_SNAPSHOT **)(a1 + 48), a1 + 72, v22);
        v23 = v3[8];
      }
      v3[8] = v23 | 1;
    }
  }
  else
  {
    if( (_DWORD)v21 != 259 )
    {
      v24 = *(_DWORD *)(v6 + 56);
      if( (v24 & 0x400000) == 0 )
      {
        ViErrorReport1(550, *(VOID **)(a1 + 48), *(const VOID **)(a1 + 72));
        v24 = *(_DWORD *)(v6 + 56);
      }
      *(_DWORD *)(v6 + 56) = v24 | 0x400000;
    }
    *(_DWORD *)(*(_QWORD *)(a1 + 8) + 4i64) |= 0x4000000u;
    v25 = *(_QWORD *)(a1 + 32);
    if( *(_QWORD *)(v25 + 8) != a1 + 32 || (v26 = *(_QWORD **)(a1 + 40), *v26 != a1 + 32) )
      __fastfail(3u);
    *v26 = v25;
    *(_QWORD *)(v25 + 8) = v26;
  }
  v27 = *(_DWORD *)(a1 + 24);
  if( (v27 & 0x8000000) != 0 && *(_DWORD *)a2 != 259 && (v27 & 0x1000000) == 0 )
    *(_DWORD *)a2 = *(_DWORD *)(a1 + 60);
  IovpSessionDataDereference(v3);
  _InterlockedDecrement((volatile signed __int32 *)(v6 + 20));
  VfIrpDatabaseEntryReleaseLock((_IOV_DATABASE_HEADER *)v6);
  return result;
}

Referenced by:

VfAfterCallDriver