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.