PoFxPrepareDevice
VOID __stdcall PoFxPrepareDevice(_DEVICE_NODE *DevNode, UINT8 StartDevice){
signed __int32 PowerFlags;
signed __int32 v5;
_ETHREAD *CurrentThread;
_POP_FX_PLUGIN *v7;
_POP_FX_PLUGIN *v8;
_POP_FX_DEVICE *v9;
_POP_FX_DEVICE *FoundFxDevice;
FoundFxDevice = 0i64;
_m_prefetchw((const void *)&DevNode->PowerFlags);
if( (_InterlockedOr(&DevNode->PowerFlags, 0) & 1) != 0 )
return;
_m_prefetchw((const void *)&DevNode->PowerFlags);
PowerFlags = DevNode->PowerFlags;
do
{
v5 = PowerFlags;
PowerFlags = _InterlockedCompareExchange(&DevNode->PowerFlags, PowerFlags, PowerFlags);
}
while( v5 != PowerFlags );
if( (PowerFlags & 2) != 0 )
goto LABEL_7;
if( PopFxFindDeviceAndAllocateUniqueId(DevNode, (VOID ***)&FoundFxDevice) != -1073741738 )
{
_InterlockedOr(&DevNode->PowerFlags, 2u);
LABEL_7:
CurrentThread = (_ETHREAD *)KeGetCurrentThread();
--CurrentThread->Tcb.KernelApcDisable;
ExAcquirePushLockSharedEx((_EX_PUSH_LOCK *)&stru_140C23628 + 497, 0i64);
v7 = (_POP_FX_PLUGIN *)*(&stru_140C23628 + 493);
v8 = 0i64;
while( v7 != (_POP_FX_PLUGIN *)((char *)&stru_140C23628 + 3944) )
{
if( PopPluginPrepareDevice(v7, (_UNICODE_STRING *)DevNode) )
{
PopDiagTraceFxDevicePreparation(DevNode, v7, &DevNode->UniqueId, 1u);
v8 = v7;
if( v7 )
goto LABEL_14;
break;
}
v7 = *(_POP_FX_PLUGIN **)v7;
}
if( !StartDevice )
goto LABEL_15;
LABEL_14:
DevNode->Plugin = v8;
_InterlockedOr(&DevNode->PowerFlags, 1u);
*(_WORD *)&DevNode->gap5C[4] = 0;
*(_QWORD *)&DevNode->gap5C[20] = &DevNode->gap5C[12];
*(_QWORD *)&DevNode->gap5C[12] = &DevNode->gap5C[12];
DevNode->gap5C[6] = 6;
*(_DWORD *)&DevNode->gap5C[8] = 0;
LABEL_15:
if( _InterlockedCompareExchange64((_QWORD *)&stru_140C23628 + 497, 0i64, 17i64) != 17 )
ExfReleasePushLockShared((_EX_PUSH_LOCK *)&stru_140C23628 + 497);
KeAbPostRelease((char *)&stru_140C23628 + 3976);
KeLeaveCriticalRegionThread(KeGetCurrentThread());
}
v9 = FoundFxDevice;
if( FoundFxDevice )
{
if( _InterlockedExchangeAdd((volatile signed __int32 *)FoundFxDevice + 69, 0xFFFFFFFF) == 1 )
KeSetEvent((PRKEVENT)((char *)v9 + 280), 0, 0);
}
}Referenced by:
PiProcessAddBootDevices
PipProcessDevNodeTree
PnpStartDevice