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