VfIrpDatabaseEntryReleaseLock
__int64 __fastcall VfIrpDatabaseEntryReleaseLock(_QWORD *a1){
bool v1;
UINT8 *v3;
UINT64 v4;
_QWORD *v5;
__int64 v6;
_QWORD *v7;
_QWORD *v8;
unsigned __int64 v9;
_QWORD *v10;
__int64 result;
UINT8 OldIrql;
v1 = *((_DWORD *)a1 + 6) == 0;
OldIrql = 0;
if( v1 )
{
ViIrpDatabaseAcquireLockExclusive(&OldIrql);
v3 = (UINT8 *)*a1;
if( *a1 )
{
((void(__fastcall *)(_QWORD *, _QWORD, __int64))a1[6])(a1, *a1, 1i64);
*a1 = 0i64;
VfUtilAddressRangeRemoveCheckEmpty(
(_VF_ADDRESS_RANGE *)(ViIrpDatabaseAddressRanges + 16i64
* (unsigned __int8)(-125 * ((unsigned __int64)v3 >> 12))),
v3,
v4);
}
ViIrpDatabaseReleaseLockExclusive(OldIrql);
}
if( !*((_DWORD *)a1 + 5) )
{
ViIrpDatabaseAcquireLockExclusive(&OldIrql);
if( !*((_DWORD *)a1 + 5) )
{
v5 = a1 + 4;
v6 = a1[4];
v7 = (_QWORD *)a1[5];
if( *(_QWORD **)(v6 + 8) != a1 + 4 || (_QWORD *)*v7 != v5 )
__fastfail(3u);
*v7 = v6;
*(_QWORD *)(v6 + 8) = v7;
a1[5] = a1 + 4;
*v5 = v5;
if( *(_QWORD *)v6 == v6 )
{
v8 = (_QWORD *)(ViIrpDatabaseAddressRanges + 16i64 * (unsigned int)((v6 - ViIrpDatabase) >> 4));
*v8 = 0i64;
v8[1] = 0i64;
}
}
ViIrpDatabaseReleaseLockExclusive(OldIrql);
}
v9 = *((unsigned __int8 *)a1 + 16);
v10 = (_QWORD *)a1[4];
KxReleaseSpinLock(a1 + 1);
result = (unsigned int)KiIrqlFlags;
__writecr8(v9);
if( v10 == a1 + 4 )
{
*((_DWORD *)a1 + 7) |= 0x80000000;
return((__int64(__fastcall *)(_QWORD *, _QWORD, __int64))a1[6])(a1, *a1, 2i64);
}
return result;
}Referenced by:
IovAllocateIrp
IovCancelIrp
IovpCallDriver1
IovpCallDriver2
IovpCheckIrpForCriticalTracking
IovpCompleteRequest1
IovpCompleteRequest2
IovpCompleteRequest3
IovpCompleteRequest4
IovpLocalCompletionRoutine
VfIoAllocateIrp2
VfIoFreeIrp
VfIoInitializeIrp
VfIrpDatabaseEntryFindAndLock
VfIrpWatermark
VfPendingMoreProcessingRequired
VfSetIoBuildRequest
ViPendingCompleteAfterWait