[UMPNPMGR]
authorEric Kohl <eric.kohl@reactos.org>
Sat, 1 Apr 2017 08:07:39 +0000 (08:07 +0000)
committerEric Kohl <eric.kohl@reactos.org>
Sat, 1 Apr 2017 08:07:39 +0000 (08:07 +0000)
Broadcast a WM_DEVICECHANGE message on device arrrival and removal.
CORE-12977

svn path=/trunk/; revision=74259

reactos/base/services/umpnpmgr/CMakeLists.txt
reactos/base/services/umpnpmgr/umpnpmgr.c

index 14872c6..c361e5e 100644 (file)
@@ -12,5 +12,5 @@ add_library(umpnpmgr SHARED
 
 target_link_libraries(umpnpmgr wdmguid ${PSEH_LIB})
 set_module_type(umpnpmgr win32dll UNICODE)
-add_importlibs(umpnpmgr advapi32 rpcrt4 userenv shlwapi msvcrt kernel32 ntdll)
+add_importlibs(umpnpmgr advapi32 rpcrt4 userenv shlwapi msvcrt user32 kernel32 ntdll)
 add_cd_file(TARGET umpnpmgr DESTINATION reactos/system32 FOR all)
index c46e705..f2cc8b9 100644 (file)
@@ -37,6 +37,8 @@
 #include <winbase.h>
 #include <winreg.h>
 #include <winsvc.h>
+#include <winuser.h>
+#include <dbt.h>
 #include <stdio.h>
 #include <cmfuncs.h>
 #include <rtlfuncs.h>
@@ -3563,8 +3565,16 @@ PnpEventThread(LPVOID lpParameter)
         }
         else if (UuidEqual(&PnpEvent->EventGuid, (UUID*)&GUID_DEVICE_ARRIVAL, &RpcStatus))
         {
+            DWORD dwRecipient;
+
             DPRINT("Device arrival: %S\n", PnpEvent->TargetDevice.DeviceIds);
-            /* FIXME: ? */
+
+            dwRecipient = BSM_ALLDESKTOPS | BSM_APPLICATIONS;
+            BroadcastSystemMessageW(BSF_POSTMESSAGE,
+                                    &dwRecipient,
+                                    WM_DEVICECHANGE,
+                                    DBT_DEVNODES_CHANGED,
+                                    0);
         }
         else if (UuidEqual(&PnpEvent->EventGuid, (UUID*)&GUID_DEVICE_EJECT_VETOED, &RpcStatus))
         {
@@ -3576,11 +3586,29 @@ PnpEventThread(LPVOID lpParameter)
         }
         else if (UuidEqual(&PnpEvent->EventGuid, (UUID*)&GUID_DEVICE_SAFE_REMOVAL, &RpcStatus))
         {
+            DWORD dwRecipient;
+
             DPRINT1("Safe removal: %S\n", PnpEvent->TargetDevice.DeviceIds);
+
+            dwRecipient = BSM_ALLDESKTOPS | BSM_APPLICATIONS;
+            BroadcastSystemMessageW(BSF_POSTMESSAGE,
+                                    &dwRecipient,
+                                    WM_DEVICECHANGE,
+                                    DBT_DEVNODES_CHANGED,
+                                    0);
         }
         else if (UuidEqual(&PnpEvent->EventGuid, (UUID*)&GUID_DEVICE_SURPRISE_REMOVAL, &RpcStatus))
         {
+            DWORD dwRecipient;
+
             DPRINT1("Surprise removal: %S\n", PnpEvent->TargetDevice.DeviceIds);
+
+            dwRecipient = BSM_ALLDESKTOPS | BSM_APPLICATIONS;
+            BroadcastSystemMessageW(BSF_POSTMESSAGE,
+                                    &dwRecipient,
+                                    WM_DEVICECHANGE,
+                                    DBT_DEVNODES_CHANGED,
+                                    0);
         }
         else if (UuidEqual(&PnpEvent->EventGuid, (UUID*)&GUID_DEVICE_REMOVAL_VETOED, &RpcStatus))
         {