IovpLocalCompletionRoutine

VOID __fastcall IovpLocalCompletionRoutine(UINT64 a1, INT64 a2, INT64 a3, INT64 a4){
  INT64 v5; 
  char v8; 
  char v9; 
  INT64 v10; 
  UINT64 v11; 
  unsigned int v12; 
  void *v13; 
  INT64(__fastcall *v14)(INT64, UINT64, INT64, INT64, INT64); 
  INT64 v15; 
  __int64 v16; 
  void *v17; 
  __int64 v18; 
  char v19; 
  INT64 v20; 
  char v21; 
  char v22; 
  char v23; 
  v5 = *(_QWORD *)a3;
  v8 = *(_BYTE *)(*(_QWORD *)a3 + 3i64);
  *(_BYTE *)(v5 + 1) = *(_BYTE *)(a3 + 33);
  *(_BYTE *)(v5 + 2) = *(_BYTE *)(a3 + 34);
  *(_BYTE *)(v5 + 3) = v8 & 2 | *(_BYTE *)(a3 + 35);
  *(_QWORD *)(v5 + 8) = *(_QWORD *)(a3 + 40);
  *(_QWORD *)(v5 + 16) = *(_QWORD *)(a3 + 48);
  *(_QWORD *)(v5 + 24) = *(_QWORD *)(a3 + 56);
  *(_QWORD *)(v5 + 32) = *(_QWORD *)(a3 + 64);
  *(_QWORD *)(v5 + 48) = *(_QWORD *)(a3 + 80);
  *(_QWORD *)(v5 + 56) = *(_QWORD *)(a3 + 24);
  *(_QWORD *)(v5 + 64) = *(_QWORD *)(a3 + 8);
  v23 = *(_BYTE *)(a2 + 66) + 1;
  v22 = *(_BYTE *)(a2 + 67);
  IovpCompleteRequest2(a2, *(_QWORD *)(a3 + 16));
  if( *(_BYTE *)v5 != 22 )
  {
    v9 = *(_BYTE *)(v5 + 3) & 2;
    *(_WORD *)(v5 + 1) = 0;
    *(_QWORD *)(v5 + 8) = 0i64;
    *(_BYTE *)(v5 + 3) = v9 | 0x10;
    *(_QWORD *)(v5 + 16) = 0i64;
    *(_QWORD *)(v5 + 24) = 0i64;
    *(_QWORD *)(v5 + 48) = 0i64;
  }
  v10 = *(_QWORD *)(v5 + 56);
  if( v10 )
  {
    IovpCompleteRequest3(a2, v10, *(_QWORD *)(a3 + 16));
    if( (MmVerifierData & 0x10) != 0 && ViIoCallbacksInitialized )
      v13 = (void *)ViIoCallbackSnapState();
    else
      v13 = 0i64;
    v14 = *(INT64(__fastcall **)(INT64, UINT64, INT64, INT64, INT64))(v5 + 56);
    v15 = *(_QWORD *)(v5 + 64);
    if( (unsigned int)VfPendingMoreProcessingRequired(a1, a2, v5, (INT64)v14, v15) )
    {
      v12 = -1073741802;
      v14 = VfPendingMoreProcessingRequired;
    }
    else
    {
      v12 = ((__int64(__fastcall *)(UINT64, INT64, INT64))v14)(a1, a2, v15);
    }
    if( v13 )
      VfIoCompletionCheckState(v13);
    IovpCompleteRequest4(a2, v12, v14, *(_QWORD **)(a3 + 16));
  }
  else
  {
    if( *(_BYTE *)(a2 + 65) && *(_BYTE *)(a2 + 67) <= *(_BYTE *)(a2 + 66) )
      *(_BYTE *)(*(_QWORD *)(a2 + 184) + 3i64) |= 1u;
    v12 = (unsigned int)VfPendingMoreProcessingRequired(a1, a2, v5, 0i64, *(_QWORD *)(v5 + 64)) != 0 ? 0xC0000016 : 0;
  }
  v16 = *(_QWORD *)(a3 + 16);
  v17 = *(void **)v16;
  if( *(_QWORD *)v16 )
  {
    v18 = *(_QWORD *)(v16 + 8);
    KeAcquireSpinLockRaiseToDpc((UINT64 *)(v18 + 8), v11);
    *(_BYTE *)(v18 + 16) = v19;
    IovpSessionDataDereference(v17);
    _InterlockedDecrement((volatile signed __int32 *)(v18 + 20));
    VfIrpDatabaseEntryReleaseLock((_QWORD *)v18);
  }
  if( v12 != -1073741802 && v22 != v23 )
  {
    v20 = v5 + 72;
    *(_QWORD *)a3 = v20;
    *(_QWORD *)(a3 + 8) = *(_QWORD *)(v20 + 64);
    *(_OWORD *)(a3 + 32) = *(_OWORD *)v20;
    *(_OWORD *)(a3 + 48) = *(_OWORD *)(v20 + 16);
    *(_OWORD *)(a3 + 64) = *(_OWORD *)(v20 + 32);
    *(_OWORD *)(a3 + 80) = *(_OWORD *)(v20 + 48);
    *(_QWORD *)(a3 + 96) = *(_QWORD *)(v20 + 64);
    v21 = *(_BYTE *)(v20 + 3);
    if( *(int *)(a2 + 48) < 0 )
    {
      if( v21 < 0 )
        goto LABEL_24;
    }
    else if( (v21 & 0x40) != 0 )
    {
      goto LABEL_24;
    }
    if( !*(_BYTE *)(a2 + 68) || (v21 & 0x20) == 0 )
    {
      *(_QWORD *)(a3 + 24) = 0i64;
      *(_BYTE *)(v20 + 3) |= 0xE0u;
      goto LABEL_25;
    }
LABEL_24:
    *(_QWORD *)(a3 + 24) = *(_QWORD *)(v20 + 56);
LABEL_25:
    *(_QWORD *)(v20 + 64) = a3;
    *(_QWORD *)(v20 + 56) = IovpLocalCompletionRoutine;
  }
}

Referenced by:

No references.