PopFxAcpiPrepareDevice
NTSTATUS __stdcall PopFxAcpiPrepareDevice(
_UNICODE_STRING *AcpiDeviceName,
ULONG_PTR Data,
VOID ***AcpiPlugin,
_BYTE *DeviceAccepted){
_BYTE *v4;
int AcpiDeviceByUniqueId;
_ETHREAD *CurrentThread;
VOID **v9;
_POP_FX_PLUGIN *i;
v4 = *(_BYTE **)&Data;
AcpiDeviceByUniqueId = PopFxFindAcpiDeviceByUniqueId(AcpiDeviceName, 0i64);
if( AcpiDeviceByUniqueId >= 0 )
return -1073741823;
CurrentThread = (_ETHREAD *)KeGetCurrentThread();
v9 = 0i64;
--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 )
{
if( *((_DWORD *)i + 4) >= 3u && *((_QWORD *)i + 14) && PopPluginAcpiNotificationStrict(i, 1ui64, v4) && v4[12] )
{
v9 = (VOID **)i;
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 )
{
*AcpiPlugin = v9;
AcpiDeviceByUniqueId = 0;
*DeviceAccepted = 1;
}
return AcpiDeviceByUniqueId;
}Referenced by:
PopFxAcpiDispatchNotification