IovpCompleteRequest2

VOID __fastcall IovpCompleteRequest2(UINT64 a1, INT64 a2){
  _DWORD *v2; 
  _QWORD *v5; 
  char v6; 
  __int64 v7; 
  __int64 v8; 
  __int64 v9; 
  __int64 v10; 
  int v11; 
  int v12; 
  int v13; 
  IO_STACK_LOCATION *v14; 
  int v15; 
  _QWORD *v16; 
  _QWORD *v17; 
  __int64 v18; 
  int v19; 
  __int64 v20; 
  int v21; 
  unsigned __int8 v22; 
  unsigned __int64 v23; 
  __int64 v24; 
  int v25; 
  __int64 v26; 
  bool v27; 
  UINT8 *v28; 
  UINT64 v29; 
  __int64 v30; 
  unsigned int i; 
  __int64 v32; 
  __int64 v33; 
  INT64 OriginalStatus; 
  INT64 StatusToAdvance; 
  v2 = *(_DWORD **)a2;
  if( !*(_QWORD *)a2 )
    return;
  v5 = *(_QWORD **)(a2 + 8);
  KeAcquireSpinLockRaiseToDpc(v5 + 1, a2);
  *((_BYTE *)v5 + 16) = v6;
  if( v5[31] )
    ViWdIrpBeforeCompletionRoutine((_VF_WATCHDOG_IRP **)v5 + 31);
  v7 = *(char *)(a1 + 67);
  v8 = 30 * v7;
  LODWORD(StatusToAdvance) = *(_DWORD *)(a1 + 48);
  v9 = (__int64)&v2[30 * v7 - 10];
  v10 = *(_QWORD *)(v9 + 8);
  v11 = *(_DWORD *)(v10 + 4);
  if( (v11 & 0x40000000) != 0 )
  {
    v12 = 0;
  }
  else
  {
    v12 = 1;
    *(_DWORD *)(v10 + 4) = v11 | 0x40000000;
    LOBYTE(v7) = *(_BYTE *)(a1 + 67);
  }
  v13 = v9 == v10;
  v14 = (IO_STACK_LOCATION *)(*(_QWORD *)(a1 + 184) - 72i64);
  if( (char)v7 <= *(char *)(a1 + 66)
    && (unsigned __int8)(*(_BYTE *)v14 - 3) <= 1u
    && *(_QWORD *)(a1 + 8)
    && (MmVerifierData & 0x6000) != 0 )
  {
    MdlInvariantPostProcessing1((INT64)v5, a1, (CHAR *)(*(_QWORD *)(a1 + 184) - 72i64));
    v9 = (__int64)&v2[v8 - 10];
  }
  VfMajorVerifyIrpStackUpward((__int64)v5, v14, v9, v12, v13);
  v15 = v2[8];
  LODWORD(OriginalStatus) = StatusToAdvance;
  if( (v15 & 2) == 0 && (v2[v8 - 9] & 0x4000000) != 0 && !*(_BYTE *)(a1 + 65) )
  {
    if( (*(_DWORD *)(a1 + 16) & 0x800) != 0 )
    {
      ViErrorReport6(574i64, *(const VOID **)&v2[v8], (const VOID *)a1, (unsigned int)StatusToAdvance);
      v15 = v2[8];
    }
    v2[8] = v15 | 2;
  }
  v16 = &v2[v8 - 6];
  while( 1 )
  {
    v17 = (_QWORD *)*v16;
    if( (_QWORD *)*v16 == v16 )
      break;
    if( (_QWORD *)v17[1] != v16 || (v18 = *v17, *(_QWORD **)(*v17 + 8i64) != v17) )
      __fastfail(3u);
    *v16 = v18;
    *(_QWORD *)(v18 + 8) = v16;
    v19 = *((_DWORD *)v17 - 2) | 0x40000000;
    *((_DWORD *)v17 - 2) = v19;
    *((_DWORD *)v17 + 6) = StatusToAdvance;
    if( *(_BYTE *)(a1 + 65) )
      *((_DWORD *)v17 - 2) = v19 | 0x2000000;
    v20 = v17[5];
    if( (*(_BYTE *)(v20 + 16) & 0x70) == 112 )
    {
      v21 = *(_DWORD *)(v20 + 48);
      if( v21 != -2147483626 && (v21 & 0xC0000000) != -1073741824 )
      {
        v22 = *((_BYTE *)v17 + 48);
        if( v22 == 3 || v22 == 5 || v22 == 7 || v22 == 10 )
          goto LABEL_35;
        if( v22 <= 0xBu )
          goto LABEL_38;
        if( v22 <= 0xDu )
        {
LABEL_35:
          v23 = *((unsigned int *)v17 + 14);
        }
        else
        {
          if( v22 > 0xFu )
          {
            if( v22 != 25 )
              goto LABEL_38;
            goto LABEL_35;
          }
          v24 = v5[25];
          if( !v24 || v24 != *(_QWORD *)(v20 + 24) )
            goto LABEL_38;
          v23 = *((unsigned int *)v5 + 52);
        }
        if( *(_QWORD *)(v20 + 56) > v23 )
          ViErrorReport1(786i64, *(const VOID **)(a2 + 32), (const VOID *)v20);
      }
    }
LABEL_38:
    if( (v5[7] & 0x20) == 0 )
    {
      if( (unsigned int)VfMajorAdvanceIrpStatus(v14, (unsigned int)OriginalStatus, &StatusToAdvance) )
      {
        *((_DWORD *)v17 - 2) |= 0x8000000u;
        *((_DWORD *)v17 + 7) = StatusToAdvance;
      }
    }
  }
  *(_DWORD *)(a1 + 48) = StatusToAdvance;
  memset((INT64)&v2[v8 - 10], 0i64);
  v16[1] = v16;
  *v16 = v16;
  v25 = *((unsigned __int8 *)v5 + 184);
  *((_BYTE *)v5 + 186) = *(_BYTE *)(a1 + 67) + 1;
  if( v25 == *(char *)(a1 + 67) )
  {
    *(_QWORD *)a2 = 0i64;
    *(_QWORD *)(a2 + 8) = 0i64;
    VfMajorVerifyFinalIrpStack((__int64)v5, (_BYTE *)(*(_QWORD *)(a1 + 184) - 72i64));
    v26 = *(_QWORD *)v2;
    *(_DWORD *)(v26 + 56) &= ~1u;
    *(_QWORD *)(v26 + 240) = 0i64;
    IovpSessionDataDereference(v2);
    v27 = (*((_DWORD *)v5 + 6))-- == 1;
    LOBYTE(OriginalStatus) = 0;
    if( v27 )
    {
      ViIrpDatabaseAcquireLockExclusive((UINT8 *)&OriginalStatus);
      v28 = (UINT8 *)*v5;
      ((void(__fastcall *)(_QWORD *, _QWORD, __int64))v5[6])(v5, *v5, 1i64);
      *v5 = 0i64;
      VfUtilAddressRangeRemoveCheckEmpty(
        (_VF_ADDRESS_RANGE *)(ViIrpDatabaseAddressRanges
                            + 16i64 * (unsigned __int8)(-125 * ((unsigned __int64)v28 >> 12))),
        v28,
        v29);
      ViIrpDatabaseReleaseLockExclusive(OriginalStatus);
    }
    _InterlockedDecrement((volatile signed __int32 *)v5 + 5);
    v30 = v5[28];
    if( v30 )
    {
      for( i = 0; i < *(_DWORD *)v30; ++i )
      {
        v32 = *(_QWORD *)(v30 + 8);
        v33 = 32i64 * i;
        if( *(_QWORD *)(v33 + v32) )
        {
          *(_OWORD *)(v33 + v32) = 0i64;
          *(_OWORD *)(v33 + v32 + 16) = 0i64;
        }
        v30 = v5[28];
      }
      *(_QWORD *)(v30 + 16) = 0i64;
    }
  }
  else
  {
    IovpSessionDataReference(v2);
    _InterlockedAdd((volatile signed __int32 *)v5 + 5, 1u);
  }
  VfIrpDatabaseEntryReleaseLock(v5);
  --*(_DWORD *)(a2 + 20);
}

Referenced by:

IovpLocalCompletionRoutine