IoReleaseRemoveLockEx
VOID *__stdcall IoReleaseRemoveLockEx(PIO_REMOVE_LOCK RemoveLock, PVOID Tag, UINT32 RemlockSize){
VOID *result;
char v6;
PVOID **v7;
unsigned __int64 v8;
PVOID *v9;
PVOID *v10;
PVOID *v11;
PVOID **v12;
if( RemlockSize == 120 )
{
v6 = 0;
v7 = (PVOID **)((char *)RemoveLock + 112);
v8 = (unsigned __int8)KeAcquireSpinLockRaiseToDpc((UINT64 *)RemoveLock + 9);
v9 = (PVOID *)*((_QWORD *)RemoveLock + 14);
v10 = v9;
while( v10 )
{
if( v6 || v10[1] != Tag )
{
v9 = v10;
v10 = (PVOID *)*v10;
}
else
{
v11 = (PVOID *)*v10;
v6 = 1;
if( v10 == *v7 )
{
*v7 = v11;
v12 = (PVOID **)((char *)RemoveLock + 112);
}
else
{
*v9 = v11;
v12 = (PVOID **)v9;
}
ExFreePoolWithTag(v10, 0);
v10 = *v12;
}
}
KxReleaseSpinLock((UINT64 *)RemoveLock + 9);
__writecr8(v8);
if( !v6
&& _InterlockedDecrement((volatile signed __int32 *)RemoveLock + 20) < 0
&& ((MmVerifierData & 0x800) == 0 || !(unsigned int)VfRemLockReportBadReleaseTag((ULONG_PTR)RemoveLock, Tag)) )
{
_InterlockedIncrement((volatile signed __int32 *)RemoveLock + 20);
}
}
result = (VOID *)(unsigned int)_InterlockedExchangeAdd((volatile signed __int32 *)RemoveLock + 1, 0xFFFFFFFF);
if( (_DWORD)result == 1 )
LODWORD(result) = KeSetEvent((PRKEVENT)((char *)RemoveLock + 8), 0, 0);
return result;
}Referenced by:
ViFilterDeviceUsageNotificationCompletion
ViFilterGenericCompletionRoutine
ViFilterStartCompletionRoutine