IoReleaseRemoveLockEx
VOID __stdcall IoReleaseRemoveLockEx(IO_REMOVE_LOCK *PublicLock, PVOID Tag, UINT64 RemlockSize){
char v5;
_LIST_ENTRY *p_WaitListHead;
unsigned __int8 v7;
unsigned __int64 v8;
_LIST_ENTRY *Flink;
PVOID *p_Flink;
_LIST_ENTRY *v11;
PVOID **v12;
if( (_DWORD)RemlockSize == 120 )
{
v5 = 0;
KeAcquireSpinLockRaiseToDpc((UINT64 *)&PublicLock[2].Common.RemoveEvent, (UINT64)Tag);
p_WaitListHead = &PublicLock[3].Common.RemoveEvent.Header.WaitListHead;
v8 = v7;
Flink = PublicLock[3].Common.RemoveEvent.Header.WaitListHead.Flink;
p_Flink = (PVOID *)&Flink->Flink;
if( Flink )
{
do
{
if( v5 || p_Flink[1] != Tag )
{
Flink = (_LIST_ENTRY *)p_Flink;
p_Flink = (PVOID *)*p_Flink;
}
else
{
v11 = (_LIST_ENTRY *)*p_Flink;
v5 = 1;
if( p_Flink == (PVOID *)p_WaitListHead->Flink )
{
p_WaitListHead->Flink = v11;
v12 = (PVOID **)&PublicLock[3].Common.RemoveEvent.Header.WaitListHead;
}
else
{
Flink->Flink = v11;
v12 = (PVOID **)Flink;
}
ExFreePoolWithTag(p_Flink, 0);
p_Flink = *v12;
}
}
while( p_Flink );
}
KxReleaseSpinLock((UINT64 *)&PublicLock[2].Common.RemoveEvent);
__writecr8(v8);
if( !v5
&& _InterlockedDecrement((volatile signed __int32 *)&PublicLock[2].Common.RemoveEvent.Header.WaitListHead) < 0
&& ((MmVerifierData & 0x800) == 0
|| !(unsigned int)VfRemLockReportBadReleaseTag((ULONG_PTR)PublicLock, (ULONG_PTR)Tag)) )
{
_InterlockedIncrement((volatile signed __int32 *)&PublicLock[2].Common.RemoveEvent.Header.WaitListHead);
}
}
if( _InterlockedExchangeAdd(&PublicLock->Common.IoCount, 0xFFFFFFFF) == 1 )
KeSetEvent(&PublicLock->Common.RemoveEvent, 0);
}Referenced by:
ViFilterDeviceUsageNotificationCompletion
ViFilterGenericCompletionRoutine
ViFilterStartCompletionRoutine