[ros-diffs] [hpoussin] 18335: NtPlugPlayControl: Implement PlugPlayControlResetDevice case

hpoussin at svn.reactos.com hpoussin at svn.reactos.com
Sat Oct 8 16:47:47 CEST 2005


NtPlugPlayControl: Implement PlugPlayControlResetDevice case
Modified: trunk/reactos/include/ndk/cmtypes.h
Modified: trunk/reactos/ntoskrnl/include/internal/io.h
Modified: trunk/reactos/ntoskrnl/io/plugplay.c
  _____  

Modified: trunk/reactos/include/ndk/cmtypes.h
--- trunk/reactos/include/ndk/cmtypes.h	2005-10-08 13:57:36 UTC (rev
18334)
+++ trunk/reactos/include/ndk/cmtypes.h	2005-10-08 14:47:25 UTC (rev
18335)
@@ -65,7 +65,8 @@

     PlugPlayControlProperty = 0x0A,
     PlugPlayControlGetRelatedDevice = 0x0C,
     PlugPlayControlDeviceStatus = 0x0E,
-    PlugPlayControlGetDeviceDepth
+    PlugPlayControlGetDeviceDepth,
+    PlugPlayControlResetDevice = 0x14
 } PLUGPLAY_CONTROL_CLASS;
 
 typedef enum _PLUGPLAY_BUS_CLASS
@@ -362,12 +363,18 @@
 } PLUGPLAY_CONTROL_STATUS_DATA, *PPLUGPLAY_CONTROL_STATUS_DATA;
 
 /* Class 0x0F */
-typedef struct _PLUGPLAY_CONTOL_DEPTH_DATA
+typedef struct _PLUGPLAY_CONTROL_DEPTH_DATA
 {
     UNICODE_STRING DeviceInstance;
     ULONG Depth;
 } PLUGPLAY_CONTROL_DEPTH_DATA, *PPLUGPLAY_CONTROL_DEPTH_DATA;
 
+/* Class 0x14 */
+typedef struct _PLUGPLAY_CONTROL_RESET_DEVICE_DATA
+{
+   UNICODE_STRING DeviceInstance;
+} PLUGPLAY_CONTROL_RESET_DEVICE_DATA,
*PPLUGPLAY_CONTROL_RESET_DEVICE_DATA;
+
 typedef struct _PLUGPLAY_BUS_TYPE
 {
     PLUGPLAY_BUS_CLASS BusClass;
  _____  

Modified: trunk/reactos/ntoskrnl/include/internal/io.h
--- trunk/reactos/ntoskrnl/include/internal/io.h	2005-10-08
13:57:36 UTC (rev 18334)
+++ trunk/reactos/ntoskrnl/include/internal/io.h	2005-10-08
14:47:25 UTC (rev 18335)
@@ -304,6 +304,22 @@

                  PUNICODE_STRING RegistryPath);
 
 
+/* pnpmgr.c */
+
+PDEVICE_NODE
+FASTCALL
+IopGetDeviceNode(PDEVICE_OBJECT DeviceObject);
+
+NTSTATUS
+IopActionConfigureChildServices(PDEVICE_NODE DeviceNode,
+                                PVOID Context);
+
+NTSTATUS
+IopActionInitChildServices(PDEVICE_NODE DeviceNode,
+                           PVOID Context,
+                           BOOLEAN BootDrivers);
+
+
 /* pnproot.c */
 
 NTSTATUS
  _____  

Modified: trunk/reactos/ntoskrnl/io/plugplay.c
--- trunk/reactos/ntoskrnl/io/plugplay.c	2005-10-08 13:57:36 UTC
(rev 18334)
+++ trunk/reactos/ntoskrnl/io/plugplay.c	2005-10-08 14:47:25 UTC
(rev 18335)
@@ -562,7 +562,7 @@

     if (DeviceObject == NULL)
         return STATUS_NO_SUCH_DEVICE;
 
-    DeviceNode =
((PEXTENDED_DEVOBJ_EXTENSION)DeviceObject->DeviceObjectExtension)->Devic
eNode;
+    DeviceNode = IopGetDeviceNode(DeviceObject);
 
     DepthData->Depth = DeviceNode->Level;
 
@@ -572,6 +572,38 @@
 }
 
 
+static NTSTATUS
+IopResetDevice(PPLUGPLAY_CONTROL_RESET_DEVICE_DATA ResetDeviceData)
+{
+    PDEVICE_OBJECT DeviceObject;
+    PDEVICE_NODE DeviceNode;
+    NTSTATUS Status;
+
+    DPRINT("IopResetDevice() called\n");
+    DPRINT("Device name: %wZ\n", &ResetDeviceData->DeviceInstance);
+
+    /* Get the device object */
+    DeviceObject =
IopGetDeviceObjectFromDeviceInstance(&ResetDeviceData->DeviceInstance);
+    if (DeviceObject == NULL)
+        return STATUS_NO_SUCH_DEVICE;
+
+    DeviceNode = IopGetDeviceNode(DeviceObject);
+
+    /* FIXME: we should stop the device, before starting it again */
+
+    /* Start the device */
+    IopDeviceNodeClearFlag(DeviceNode, DNF_DISABLED);
+    Status = IopActionConfigureChildServices(DeviceNode,
DeviceNode->Parent);
+
+    if (NT_SUCCESS(Status))
+        Status = IopActionInitChildServices(DeviceNode,
DeviceNode->Parent, FALSE);
+
+    ObDereferenceObject(DeviceObject);
+
+    return Status;
+}
+
+
 /*
  * NtPlugPlayControl
  *
@@ -698,6 +730,11 @@
                 return STATUS_INVALID_PARAMETER;
             return
IopGetDeviceDepth((PPLUGPLAY_CONTROL_DEPTH_DATA)Buffer);
 
+        case PlugPlayControlResetDevice:
+            if (!Buffer || BufferLength <
sizeof(PLUGPLAY_CONTROL_RESET_DEVICE_DATA))
+                return STATUS_INVALID_PARAMETER;
+            return
IopResetDevice((PPLUGPLAY_CONTROL_RESET_DEVICE_DATA)Buffer);
+
         default:
             return STATUS_NOT_IMPLEMENTED;
     }
-------------- next part --------------
An HTML attachment was scrubbed...
URL: http://www.reactos.org/pipermail/ros-diffs/attachments/20051008/6e6f4e96/attachment.html


More information about the Ros-diffs mailing list