Author: janderwald Date: Mon Feb 20 15:54:19 2012 New Revision: 55756
URL: http://svn.reactos.org/svn/reactos?rev=55756&view=rev Log: [USBHUB] - Check if the request is for a valid PDO
Modified: trunk/reactos/drivers/usb/usbhub/pdo.c
Modified: trunk/reactos/drivers/usb/usbhub/pdo.c URL: http://svn.reactos.org/svn/reactos/trunk/reactos/drivers/usb/usbhub/pdo.c?re... ============================================================================== --- trunk/reactos/drivers/usb/usbhub/pdo.c [iso-8859-1] (original) +++ trunk/reactos/drivers/usb/usbhub/pdo.c [iso-8859-1] Mon Feb 20 15:54:19 2012 @@ -123,6 +123,33 @@ return STATUS_PENDING; }
+BOOLEAN +IsValidPDO( + IN PDEVICE_OBJECT DeviceObject) +{ + ULONG Index; + PHUB_DEVICE_EXTENSION HubDeviceExtension; + PHUB_CHILDDEVICE_EXTENSION ChildDeviceExtension; + + + ChildDeviceExtension = (PHUB_CHILDDEVICE_EXTENSION)DeviceObject->DeviceExtension; + ASSERT(ChildDeviceExtension->Common.IsFDO == FALSE); + HubDeviceExtension = (PHUB_DEVICE_EXTENSION)ChildDeviceExtension->ParentDeviceObject->DeviceExtension; + + for(Index = 0; Index < USB_MAXCHILDREN; Index++) + { + if (HubDeviceExtension->ChildDeviceObject[Index] == DeviceObject) + { + /* PDO exists */ + return TRUE; + } + } + + /* invalid pdo */ + return FALSE; +} + + NTSTATUS USBHUB_PdoHandleInternalDeviceControl( IN PDEVICE_OBJECT DeviceObject, @@ -153,6 +180,15 @@ ASSERT(ChildDeviceExtension->Common.IsFDO == FALSE); HubDeviceExtension = (PHUB_DEVICE_EXTENSION)ChildDeviceExtension->ParentDeviceObject->DeviceExtension; RootHubDeviceObject = HubDeviceExtension->RootHubPhysicalDeviceObject; + + if(!IsValidPDO(DeviceObject)) + { + 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; + }
switch (Stack->Parameters.DeviceIoControl.IoControlCode) {