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