PopFxUnregisterDevice
VOID __stdcall PopFxUnregisterDevice(_POP_FX_DEVICE *FxDevice){
unsigned int v2;
unsigned int i;
unsigned int v4;
INT64 v5;
REGHANDLE v6;
unsigned int j;
_XSTATE_CONFIGURATION *v8;
UINT64 v9;
__int64 v10;
UINT16 *v11;
int v12;
int v13;
INT64 v14;
unsigned int v15;
__int64 v16;
int v17;
unsigned __int64 k;
int v19;
unsigned int v20;
int v21;
unsigned int v22;
int v23;
unsigned int v24;
__int64 v25;
INT64 v26;
_EVENT_DATA_DESCRIPTOR UserData;
_EVENT_DATA_DESCRIPTOR v28;
int *v29;
__int64 v30;
int *v31;
__int64 v32;
__int64 v33;
int v34[2];
int *v35;
__int64 v36;
int *v37;
__int64 v38;
int *v39;
__int64 v40;
__int64 *v41;
__int64 v42;
if( (*((_DWORD *)FxDevice + 206) & 1) == 0 )
{
v2 = *((_DWORD *)FxDevice + 207);
for( i = 0; i < v2; ++i )
{
PoFxActivateComponent((POHANDLE *)FxDevice, i, 2ui64);
v2 = *((_DWORD *)FxDevice + 207);
}
v4 = 0;
if( v2 )
{
do
KeWaitForSingleObject(*(_QWORD *)(*((_QWORD *)FxDevice + 104) + 8i64 * v4++) + 104i64, 0, 0, 0, 0i64);
while( v4 < *((_DWORD *)FxDevice + 207) );
}
}
v5 = *((_QWORD *)FxDevice + 6);
if( v5 )
{
PopFxRemoveDevice((_EX_PUSH_LOCK *)FxDevice, FxDevice);
v26 = v5;
PopFxAddLogEntry(v5, 0, 2, 0i64);
if( PopDiagHandleRegistered )
{
v6 = PopDiagHandle;
if( EtwEventEnabled(PopDiagHandle, &POP_ETW_EVENT_DEVICE_UNREGISTRATION) )
{
*(_QWORD *)&UserData.Size = 8i64;
UserData.Ptr = (unsigned __int64)&v26;
EtwWrite(v6, &POP_ETW_EVENT_DEVICE_UNREGISTRATION, 0, 1u, &UserData);
}
}
PopFxAssignDeviceToDevNode((_DEVICE_NODE *)v5, 0i64);
}
for( j = 0; j < *((_DWORD *)FxDevice + 207); ++j )
{
if( *(int *)(*(_QWORD *)(*((_QWORD *)FxDevice + 104) + 8i64 * j) + 96i64) > 0 )
_InterlockedDecrement((_DWORD *)&stru_140C23628 + 990);
}
IoReleaseRemoveLockAndWaitEx((PIO_REMOVE_LOCK)((char *)FxDevice + 240), 0i64, 0x20u);
PopPepUnregisterDevice(*((PVOID *)FxDevice + 7));
v9 = *((_QWORD *)FxDevice + 8);
if( v9 )
PopPluginUnregisterDevice(v9, *((_QWORD *)FxDevice + 9));
v10 = *((_QWORD *)FxDevice + 148);
if( v10 )
{
v11 = *(UINT16 **)(v10 + 16);
PopPlLockPowerPlane((INT64)v11, v8);
v12 = *(_DWORD *)(v10 + 32);
v20 = 0;
v21 = 1;
v13 = PopPlCalculateDevicePowerDraw((__int64)FxDevice, &v21, &v20, 0i64);
*(_DWORD *)(v10 + 32) = v13;
v15 = v13 - v12;
if( *(&stru_140C00F40 + 1194) > 5u )
{
v23 = v13;
v30 = 2i64;
LOWORD(v19) = 1;
v32 = 2i64;
v29 = &v19;
v34[1] = 0;
v31 = v34;
v33 = *((_QWORD *)FxDevice + 28);
v34[0] = *((unsigned __int16 *)FxDevice + 108);
v35 = (int *)&v22;
v37 = &v23;
v39 = (int *)&v24;
v16 = *(_QWORD *)(v10 + 16);
v22 = v15;
v36 = 4i64;
v38 = 4i64;
v24 = v15;
v40 = 4i64;
v17 = *(_DWORD *)(v16 + 28);
v41 = &v25;
LODWORD(v25) = v15 + v17;
v42 = 4i64;
tlgWriteTransfer_EtwWriteTransfer(
(__int64)&stru_140C00F40 + 4776,
(unsigned __int8 *)byte_140029325,
0i64,
0i64,
9u,
&v28);
}
PopPlPublishSystemPowerChange(v11, v15, v14);
for( k = 0i64;
k < *((unsigned int *)FxDevice + 207);
PopPlUnregisterComponent(*(_QWORD *)(*((_QWORD *)FxDevice + 104) + 8 * k++)) )
{
;
}
*(_QWORD *)(v10 + 24) = 0i64;
*((_QWORD *)FxDevice + 148) = 0i64;
PopPlUnlockPowerPlane((INT64)v11);
}
if( v5 )
KeSetEvent((PRKEVENT)(v5 + 96), 0, 0);
if( (*((_DWORD *)FxDevice + 206) & 1) != 0 )
PopFxDestroyDeviceDpm((_DEVICE_NODE *)v5, FxDevice);
}Referenced by:
PoFxUnregisterDevice
PopFxUnregisterDeviceOrWait