PopFxRegisterDeviceWithPep
CHAR __fastcall PopFxRegisterDeviceWithPep(UINT64 a1, INT64 a2, INT64 *a3, INT64 a4){
UINT64 v7;
_ETHREAD *CurrentThread;
int v9;
ULONG_PTR *i;
CHAR v12;
INT64 a6;
a6 = 0i64;
v7 = a1;
if( a1 )
{
v9 = PopPluginRegisterDevice(a1, a2, (INT64)a3, a4, v12, (INT64)&a6);
}
else
{
CurrentThread = (_ETHREAD *)KeGetCurrentThread();
v9 = 0;
--*((_WORD *)CurrentThread + 242);
ExAcquirePushLockSharedEx((UINT64)&PopFxPluginLock, 0i64);
for( i = (ULONG_PTR *)PopFxPluginList; i != &PopFxPluginList; i = (ULONG_PTR *)*i )
{
v7 = (UINT64)i;
v9 = PopPluginRegisterDevice((UINT64)i, a2, (INT64)a3, a4, v12, (INT64)&a6);
if( v9 )
break;
}
if( _InterlockedCompareExchange64((volatile signed __int64 *)&PopFxPluginLock, 0i64, 17i64) != 17 )
ExfReleasePushLockShared((INT64 *)&PopFxPluginLock);
KeAbPostRelease(&PopFxPluginLock);
KeLeaveCriticalRegionThread((__int64)KeGetCurrentThread());
}
if( v9 )
{
v9 = 2;
a3[9] = a6;
a3[8] = v7;
}
return PopPepRegisterDevice(a2, (__int64)a3, a4, v9, a3 + 7);
}Referenced by:
PopFxRegisterDeviceWorker