IoUnregisterPriorityCallback
VOID __stdcall IoUnregisterPriorityCallback(_DRIVER_OBJECT *DriverObject){
_ETHREAD *CurrentThread;
__int64 v3;
signed __int64 *i;
_EX_RUNDOWN_REF *v5;
_EX_RUNDOWN_REF *v6;
signed __int64 v7;
signed __int64 v8;
signed __int64 v9;
signed __int64 v10;
if( (DriverObject->Flags & 0x200) == 0 )
return;
CurrentThread = (_ETHREAD *)KeGetCurrentThread();
--CurrentThread->Tcb.KernelApcDisable;
v3 = 0i64;
for( i = (signed __int64 *)((char *)&stru_140C452E0 + 1024); ; ++i )
{
v5 = ExReferenceCallBackBlock((INT64 *)&stru_140C452E0 + v3 + 128);
v6 = v5;
if( v5 )
{
if( (_DRIVER_OBJECT *)v5[4].Count != DriverObject )
{
_m_prefetchw(i);
v9 = *i;
while( ((unsigned __int64)v6 ^ v9) < 0xF )
{
v10 = v9;
v9 = _InterlockedCompareExchange64(i, v9 + 1, v9);
if( v10 == v9 )
goto LABEL_15;
}
ExReleaseRundownProtection(v6);
goto LABEL_15;
}
if( ExCompareExchangeCallBack(
(_EX_CALLBACK *)&stru_140C452E0 + 2 * v3 + 256,
0i64,
(_EX_CALLBACK_ROUTINE_BLOCK *)v5) )
{
break;
}
}
LABEL_15:
v3 = (unsigned int)(v3 + 1);
if( (unsigned int)v3 >= 8 )
{
KeLeaveCriticalRegionThread(&CurrentThread->Tcb);
return;
}
}
_InterlockedDecrement((_DWORD *)&stru_140CF2E80 + 1201);
_m_prefetchw((char *)&stru_140C452E0 + 8 * v3 + 1024);
v7 = *((_QWORD *)&stru_140C452E0 + v3 + 128);
if( ((unsigned __int64)v6 ^ v7) >= 0xF )
{
LABEL_9:
ExReleaseRundownProtection(v6);
}
else
{
while( 1 )
{
v8 = v7;
v7 = _InterlockedCompareExchange64((volatile signed __int64 *)&stru_140C452E0 + v3 + 128, v7 + 1, v7);
if( v8 == v7 )
break;
if( ((unsigned __int64)v6 ^ v7) >= 0xF )
goto LABEL_9;
}
}
KeLeaveCriticalRegionThread(&CurrentThread->Tcb);
ExWaitForCallBacks(v6);
SC_ENV::Free(v6);
DriverObject->Flags &= ~0x200u;
}Referenced by:
IopDeleteDriver