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