IoReleaseRemoveLockAndWaitEx
VOID *__stdcall IoReleaseRemoveLockAndWaitEx(PIO_REMOVE_LOCK RemoveLock, PVOID Tag, UINT32 RemlockSize){
signed __int32 v6;
bool v7;
VOID *result;
void *v9;
*(_BYTE *)RemoveLock = 1;
_InterlockedDecrement((volatile signed __int32 *)RemoveLock + 1);
v6 = _InterlockedExchangeAdd((volatile signed __int32 *)RemoveLock + 1, 0xFFFFFFFF);
v7 = v6 <= 1;
result = (VOID *)(unsigned int)(v6 - 1);
if( !v7 )
LODWORD(result) = KeWaitForSingleObject((UINT64)RemoveLock + 8, 0, 0, 0, 0i64);
if( RemlockSize == 120 )
{
result = (VOID *)(unsigned int)_InterlockedExchangeAdd((volatile signed __int32 *)RemoveLock + 20, 0xFFFFFFFF);
if( (int)result - 1 < 0 )
{
v9 = *(void **)(*((_QWORD *)RemoveLock + 14) + 8i64);
if( Tag != v9
&& ((MmVerifierData & 0x800) == 0
|| !(unsigned int)VfRemLockReportBadReleaseAndWaitTag((ULONG_PTR)RemoveLock, Tag, v9)) )
{
_InterlockedIncrement((volatile signed __int32 *)RemoveLock + 20);
}
ExFreePoolWithTag(*((PVOID *)RemoveLock + 14), 0);
result = MmBadPointer;
*((_QWORD *)RemoveLock + 14) = MmBadPointer;
}
}
return result;
}Referenced by:
PopFxAcpiUnregisterDevice
PopFxUnregisterDevice
ViFilterDispatchPnp