IoReleaseRemoveLockAndWaitEx
VOID __stdcall IoReleaseRemoveLockAndWaitEx(PVOID Tag, UINT32 RemlockSize){
int v2;
int v3;
ULONG_PTR v4;
ULONG_PTR v6;
*(_BYTE *)Tag = 1;
v3 = v2;
_InterlockedDecrement((volatile signed __int32 *)Tag + 1);
v4 = *(_QWORD *)&RemlockSize;
if( _InterlockedExchangeAdd((volatile signed __int32 *)Tag + 1, 0xFFFFFFFF) > 1 )
KeWaitForSingleObject((char *)Tag + 8, Executive, 0, 0, 0i64);
if( v3 == 120 && _InterlockedDecrement((volatile signed __int32 *)Tag + 20) < 0 )
{
v6 = *(_QWORD *)(*((_QWORD *)Tag + 14) + 8i64);
if( v4 != v6
&& ((MmVerifierData & 0x800) == 0 || !(unsigned int)VfRemLockReportBadReleaseAndWaitTag((ULONG_PTR)Tag, v4, v6)) )
{
_InterlockedIncrement((volatile signed __int32 *)Tag + 20);
}
ExFreePoolWithTag(*((PVOID *)Tag + 14), 0);
*((_QWORD *)Tag + 14) = MmBadPointer;
}
}Referenced by:
PopFxAcpiUnregisterDevice
PopFxUnregisterDevice
ViFilterDispatchPnp