Author: vmikayelyan
Date: Fri Aug 19 15:31:15 2016
New Revision: 72367
URL:
http://svn.reactos.org/svn/reactos?rev=72367&view=rev
Log:
usb: hub: PDO: Add IsRemovePending flag to HUB_CHILDDEVICE_EXTENSION
This flag is set in IRP_MN_QUERY_REMOVE_DEVICE and IRP_MN_SURPRISE_REMOVAL,
and then checked in PDO's IRP dispatch routines to prevent starting of
any operation which can prevent device removal.
Modified:
branches/GSoC_2016/USB/drivers/usb/usbhub/fdo.c
branches/GSoC_2016/USB/drivers/usb/usbhub/pdo.c
branches/GSoC_2016/USB/drivers/usb/usbhub/usbhub.h
Modified: branches/GSoC_2016/USB/drivers/usb/usbhub/fdo.c
URL:
http://svn.reactos.org/svn/reactos/branches/GSoC_2016/USB/drivers/usb/usbhu…
==============================================================================
--- branches/GSoC_2016/USB/drivers/usb/usbhub/fdo.c [iso-8859-1] (original)
+++ branches/GSoC_2016/USB/drivers/usb/usbhub/fdo.c [iso-8859-1] Fri Aug 19 15:31:15
2016
@@ -1339,6 +1339,8 @@
DPRINT1("Failed to create strings needed to describe device to
PNP.\n");
goto Cleanup;
}
+
+ UsbChildExtension->IsRemovePending = FALSE;
HubDeviceExtension->ChildDeviceObject[ChildDeviceCount] = NewChildDeviceObject;
HubDeviceExtension->InstanceCount++;
Modified: branches/GSoC_2016/USB/drivers/usb/usbhub/pdo.c
URL:
http://svn.reactos.org/svn/reactos/branches/GSoC_2016/USB/drivers/usb/usbhu…
==============================================================================
--- branches/GSoC_2016/USB/drivers/usb/usbhub/pdo.c [iso-8859-1] (original)
+++ branches/GSoC_2016/USB/drivers/usb/usbhub/pdo.c [iso-8859-1] Fri Aug 19 15:31:15
2016
@@ -190,17 +190,19 @@
ChildDeviceExtension = (PHUB_CHILDDEVICE_EXTENSION)DeviceObject->DeviceExtension;
ASSERT(ChildDeviceExtension->Common.IsFDO == FALSE);
- HubDeviceExtension =
(PHUB_DEVICE_EXTENSION)ChildDeviceExtension->ParentDeviceObject->DeviceExtension;
- RootHubDeviceObject = HubDeviceExtension->RootHubPhysicalDeviceObject;
-
- if(!IsValidPDO(DeviceObject))
- {
+
+ if (ChildDeviceExtension->IsRemovePending || !IsValidPDO(DeviceObject))
+ {
+ // Parent or child device was surprise removed.
DPRINT1("[USBHUB] Request for removed device object %p\n",
DeviceObject);
Irp->IoStatus.Status = STATUS_DEVICE_NOT_CONNECTED;
Irp->IoStatus.Information = 0;
IoCompleteRequest(Irp, IO_NO_INCREMENT);
return STATUS_DEVICE_NOT_CONNECTED;
}
+
+ HubDeviceExtension =
(PHUB_DEVICE_EXTENSION)ChildDeviceExtension->ParentDeviceObject->DeviceExtension;
+ RootHubDeviceObject = HubDeviceExtension->RootHubPhysicalDeviceObject;
switch (Stack->Parameters.DeviceIoControl.IoControlCode)
{
@@ -724,6 +726,11 @@
case IRP_MN_QUERY_STOP_DEVICE:
case IRP_MN_QUERY_REMOVE_DEVICE:
{
+ // HERE SHOULD BE CHECKED INTERFACE COUNT PROVIED TO UPPER LAYER TO BE ZERO,
AS WE ARE HANDLING
+ // IRP_MN_QUERY_INTERFACE IN WRONG WAY, THAT WILL BE DONE LATER. SEE MSDN
"IRP_MN_QUERY_INTERFACE"
+
+ UsbChildExtension->IsRemovePending = TRUE;
+
/* Sure, no problem */
Status = STATUS_SUCCESS;
Information = 0;
@@ -747,6 +754,14 @@
case IRP_MN_SURPRISE_REMOVAL:
{
DPRINT("[USBHUB] HandlePnp IRP_MN_SURPRISE_REMOVAL\n");
+
+ //
+ // Here we should free all resources and stop all access, lets just set
+ // the flag and do further clean-up in subsequent IRP_MN_REMOVE_DEVICE
+ // We can receive this IRP when device is physically connected (on stop/start
fail).
+ //
+ UsbChildExtension->IsRemovePending = TRUE;
+
Status = STATUS_SUCCESS;
break;
}
Modified: branches/GSoC_2016/USB/drivers/usb/usbhub/usbhub.h
URL:
http://svn.reactos.org/svn/reactos/branches/GSoC_2016/USB/drivers/usb/usbhu…
==============================================================================
--- branches/GSoC_2016/USB/drivers/usb/usbhub/usbhub.h [iso-8859-1] (original)
+++ branches/GSoC_2016/USB/drivers/usb/usbhub/usbhub.h [iso-8859-1] Fri Aug 19 15:31:15
2016
@@ -61,6 +61,7 @@
UNICODE_STRING SymbolicLinkName;
USB_BUS_INTERFACE_USBDI_V2 DeviceInterface;
USB_DEVICE_INFORMATION_0 DeviceInformation;
+ BOOLEAN IsRemovePending;
} HUB_CHILDDEVICE_EXTENSION, *PHUB_CHILDDEVICE_EXTENSION;
typedef struct _HUB_DEVICE_EXTENSION