PpProfileCommitTransitioningDock
VOID __stdcall PpProfileCommitTransitioningDock(_DEVICE_NODE *DeviceNode, PROFILE_STATUS ChangeInPresence){
__int64 v3;
_QWORD *v5;
__int64 v6;
_QWORD *v7;
UINT8 ProfileChanged;
WCHAR *ID;
ID = 0i64;
v3 = *((_QWORD *)DeviceNode + 74);
if( ChangeInPresence == DOCK_DEPARTING )
{
if( v3 )
{
ExFreePoolWithTag(*((PVOID *)DeviceNode + 74), 0);
*((_QWORD *)DeviceNode + 74) = 0i64;
}
ExAcquireFastMutex(&PiProfileDeviceListLock);
v5 = (_QWORD *)((char *)DeviceNode + 576);
v6 = *((_QWORD *)DeviceNode + 72);
if( *(_DEVICE_NODE **)(v6 + 8) != (_DEVICE_NODE *)((char *)DeviceNode + 576)
|| (v7 = (_QWORD *)*((_QWORD *)DeviceNode + 73), (_QWORD *)*v7 != v5) )
{
__fastfail(3u);
}
*v7 = v6;
*(_QWORD *)(v6 + 8) = v7;
*((_QWORD *)DeviceNode + 73) = (char *)DeviceNode + 576;
*v5 = v5;
--PiProfileDeviceCount;
KeReleaseGuardedMutex(&PiProfileDeviceListLock);
}
else if( !v3 )
{
PnpIrpQueryID(*((DEVICE_OBJECT **)DeviceNode + 4), BusQueryDeviceSerialNumber, &ID);
*((_QWORD *)DeviceNode + 74) = ID;
}
*((_DWORD *)DeviceNode + 142) = 1;
if( _InterlockedExchangeAdd(&PiProfileDevicesInTransition, 0xFFFFFFFF) == 1 )
{
ProfileChanged = 0;
if( (ChangeInPresence != DOCK_ARRIVING || *((_QWORD *)DeviceNode + 74))
&& (int)PnpProfileUpdateHardwareProfile((UINT8)&ProfileChanged) >= 0
&& ProfileChanged )
{
PnpRequestHwProfileChangeNotification(&GUID_HWPROFILE_CHANGE_COMPLETE, 2, 0i64, 0i64);
PiProfileUpdateDeviceTree();
}
else if( PiProfileChangeCancelRequired )
{
PnpRequestHwProfileChangeNotification(&GUID_HWPROFILE_CHANGE_CANCELLED, 2, 0i64, 0i64);
}
KeReleaseSemaphore(&PiProfileChangeSemaphore, 0i64, 1i64, 0);
}
}Referenced by:
PipProcessStartPhase2
PnpRemoveLockedDeviceNode