PopFxRegisterDeviceWithPep

UINT8 __stdcall PopFxRegisterDeviceWithPep(
        _POP_FX_PLUGIN *Plugin,
        _UNICODE_STRING *DeviceId,
        _POP_FX_DEVICE *FxDevice,
        _PEP_DEVICE_REGISTER_V2 *PepDeviceV2){
  _POP_FX_PLUGIN *v7; 
  _ETHREAD *CurrentThread; 
  NTSTATUS v9; 
  POP_FX_PLUGIN *i; 
  PEPHANDLE__ **DpmContext; 
  PEPHANDLE **v13; 
  INT64 Acceptance; 

  Acceptance = 0i64;
  v7 = Plugin;
  if( Plugin )
  {
    v9 = PopPluginRegisterDevice(
           (POP_FX_PLUGIN *)Plugin,
           (const INT64)DeviceId,
           (_UNICODE_STRING *)FxDevice,
           (POHANDLE *)PepDeviceV2,
           (PEP_DEVICE_REGISTER_V2 *)DpmContext,
           (INT64)&Acceptance,
           v13);
  }
  else
  {
    CurrentThread = (_ETHREAD *)KeGetCurrentThread();
    v9 = 0;
    --CurrentThread->Tcb.KernelApcDisable;
    ExAcquirePushLockSharedEx((_EX_PUSH_LOCK *)&stru_140C23628 + 497, 0i64);
    for( i = (POP_FX_PLUGIN *)*(&stru_140C23628 + 493);
          i != (POP_FX_PLUGIN *)((char *)&stru_140C23628 + 3944);
          i = *(POP_FX_PLUGIN **)i )
    {
      v7 = (_POP_FX_PLUGIN *)i;
      v9 = PopPluginRegisterDevice(
             i,
             (const INT64)DeviceId,
             (_UNICODE_STRING *)FxDevice,
             (POHANDLE *)PepDeviceV2,
             (PEP_DEVICE_REGISTER_V2 *)DpmContext,
             (INT64)&Acceptance,
             v13);
      if( v9 )
        break;
    }
    if( _InterlockedCompareExchange64((_QWORD *)&stru_140C23628 + 497, 0i64, 17i64) != 17 )
      ExfReleasePushLockShared((_EX_PUSH_LOCK *)&stru_140C23628 + 497);
    KeAbPostRelease((char *)&stru_140C23628 + 3976);
    KeLeaveCriticalRegionThread(KeGetCurrentThread());
  }
  if( v9 )
  {
    v9 = 2;
    *((_QWORD *)FxDevice + 9) = Acceptance;
    *((_QWORD *)FxDevice + 8) = v7;
  }
  return PopPepRegisterDevice(
           DeviceId,
           (POP_FX_DEVICE *)FxDevice,
           PepDeviceV2,
           (PEP_DEVICE_ACCEPTANCE_TYPE)v9,
           (PEPHANDLE **)FxDevice + 7);
}

Referenced by:

PopFxRegisterDeviceWorker