PpProfileCommitTransitioningDock
VOID __stdcall PpProfileCommitTransitioningDock(_DEVICE_NODE *DeviceNode, PROFILE_STATUS ChangeInPresence){
wchar_t *SerialNumber;
_LIST_ENTRY *p_ListEntry;
_LIST_ENTRY *Flink;
_LIST_ENTRY *Blink;
wchar_t *v8;
v8 = 0i64;
SerialNumber = DeviceNode->DockInfo.SerialNumber;
if( ChangeInPresence == DOCK_DEPARTING )
{
if( SerialNumber )
{
ExFreePoolWithTag(DeviceNode->DockInfo.SerialNumber, 0);
DeviceNode->DockInfo.SerialNumber = 0i64;
}
ExAcquireFastMutex((PFAST_MUTEX)((char *)&PnpReplaceEvent + 160));
p_ListEntry = &DeviceNode->DockInfo.ListEntry;
Flink = DeviceNode->DockInfo.ListEntry.Flink;
if( Flink->Blink != &DeviceNode->DockInfo.ListEntry
|| (Blink = DeviceNode->DockInfo.ListEntry.Blink, Blink->Flink != p_ListEntry) )
{
__fastfail(3u);
}
Blink->Flink = Flink;
Flink->Blink = Blink;
DeviceNode->DockInfo.ListEntry.Blink = &DeviceNode->DockInfo.ListEntry;
p_ListEntry->Flink = p_ListEntry;
--*(&PnpReplaceEvent + 33);
KeReleaseGuardedMutex((PKGUARDED_MUTEX)((char *)&PnpReplaceEvent + 160));
}
else if( !SerialNumber )
{
PnpIrpQueryID(DeviceNode->PhysicalDeviceObject, 4, (UINT64 *)&v8);
DeviceNode->DockInfo.SerialNumber = v8;
}
DeviceNode->DockInfo.DockStatus = DOCK_QUIESCENT;
if( _InterlockedExchangeAdd((_DWORD *)&PnpReplaceEvent + 60, 0xFFFFFFFF) == 1 )
{
if( ChangeInPresence != DOCK_ARRIVING || DeviceNode->DockInfo.SerialNumber )
PnpProfileUpdateHardwareProfile();
if( *(&PnpReplaceEvent + 288) )
PnpRequestHwProfileChangeNotification(&GUID_HWPROFILE_CHANGE_CANCELLED, 2, 0i64, 0i64);
KeReleaseSemaphore((_KSEMAPHORE *)&PnpReplaceEvent + 8, 0i64, 1i64, 0);
}
}Referenced by:
PipProcessStartPhase2
PnpRemoveLockedDeviceNode