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