Author: hpoussin
Date: Mon Apr 20 01:36:59 2009
New Revision: 40594

URL: http://svn.reactos.org/svn/reactos?rev=40594&view=rev
Log:
Don't directly call NtPlugPlayControl from setupapi, and replace it by RPC
As a bonus, setupapi is now (theorically) able to restart devices on remote 
machines
See issue #4400 for more details.

Modified:
    trunk/reactos/base/services/umpnpmgr/umpnpmgr.c
    trunk/reactos/dll/win32/setupapi/devinst.c

Modified: trunk/reactos/base/services/umpnpmgr/umpnpmgr.c
URL: 
http://svn.reactos.org/svn/reactos/trunk/reactos/base/services/umpnpmgr/umpnpmgr.c?rev=40594&r1=40593&r2=40594&view=diff
==============================================================================
--- trunk/reactos/base/services/umpnpmgr/umpnpmgr.c [iso-8859-1] (original)
+++ trunk/reactos/base/services/umpnpmgr/umpnpmgr.c [iso-8859-1] Mon Apr 20 
01:36:59 2009
@@ -1097,10 +1097,10 @@
     LPWSTR pszDeviceInstance2)
 {
     CONFIGRET ret = CR_SUCCESS;
+    NTSTATUS Status;
 
     UNREFERENCED_PARAMETER(hBinding);
     UNREFERENCED_PARAMETER(ulMinorAction);
-    UNREFERENCED_PARAMETER(pszDeviceInstance1);
     UNREFERENCED_PARAMETER(pszDeviceInstance2);
 
     DPRINT("PNP_DeviceInstanceAction() called\n");
@@ -1114,10 +1114,15 @@
             break;
 
         case PNP_DEVINST_ENABLE:
+        {
+            PLUGPLAY_CONTROL_RESET_DEVICE_DATA ResetDeviceData;
             DPRINT("Enable device instance\n");
-            /* FIXME */
-            ret = CR_CALL_NOT_IMPLEMENTED;
-            break;
+            RtlInitUnicodeString(&ResetDeviceData.DeviceInstance, 
pszDeviceInstance1);
+            Status = NtPlugPlayControl(PlugPlayControlResetDevice, 
&ResetDeviceData, sizeof(PLUGPLAY_CONTROL_RESET_DEVICE_DATA));
+            if (!NT_SUCCESS(Status))
+                ret = NtStatusToCrError(Status);
+            break;
+        }
 
         case PNP_DEVINST_REENUMERATE:
             DPRINT("Reenumerate device instance\n");

Modified: trunk/reactos/dll/win32/setupapi/devinst.c
URL: 
http://svn.reactos.org/svn/reactos/trunk/reactos/dll/win32/setupapi/devinst.c?rev=40594&r1=40593&r2=40594&view=diff
==============================================================================
--- trunk/reactos/dll/win32/setupapi/devinst.c [iso-8859-1] (original)
+++ trunk/reactos/dll/win32/setupapi/devinst.c [iso-8859-1] Mon Apr 20 01:36:59 
2009
@@ -4642,21 +4642,18 @@
     IN PSP_DEVINFO_DATA DeviceInfoData)
 {
 #ifndef __WINESRC__
-    PLUGPLAY_CONTROL_RESET_DEVICE_DATA ResetDeviceData;
+    struct DeviceInfoSet *set = (struct DeviceInfoSet *)DeviceInfoSet;
     struct DeviceInfo *deviceInfo = (struct DeviceInfo 
*)DeviceInfoData->Reserved;
-    NTSTATUS Status;
-
-    if (((struct DeviceInfoSet *)DeviceInfoSet)->HKLM != HKEY_LOCAL_MACHINE)
-    {
-        /* At the moment, I only know how to start local devices */
-        SetLastError(ERROR_INVALID_COMPUTERNAME);
-        return FALSE;
-    }
-
-    RtlInitUnicodeString(&ResetDeviceData.DeviceInstance, 
deviceInfo->instanceId);
-    Status = NtPlugPlayControl(PlugPlayControlResetDevice, &ResetDeviceData, 
sizeof(PLUGPLAY_CONTROL_RESET_DEVICE_DATA));
-    SetLastError(RtlNtStatusToDosError(Status));
-    return NT_SUCCESS(Status);
+    CONFIGRET cr;
+
+    cr = CM_Enable_DevNode_Ex(deviceInfo->dnDevInst, 0, set->hMachine);
+    if (cr != CR_SUCCESS)
+    {
+        SetLastError(GetErrorCodeFromCrCode(cr));
+        return FALSE;
+    }
+
+    return TRUE;
 #else
     FIXME("Stub: ResetDevice(%p %p)\n", DeviceInfoSet, DeviceInfoData);
     return TRUE;

Reply via email to