mirror of
https://github.com/reactos/reactos.git
synced 2025-02-24 09:25:10 +00:00
[PCI][HIDCLASS][HIDUSB][KBDHID][MOUHID][USBCCGP][USBOHCI][USBEHCI][USBHUB][USBSTOR]
- Handle query remove IRPs - Fix some other removal bugs svn path=/branches/usb-bringup-trunk/; revision=55399
This commit is contained in:
parent
9eed4afb3d
commit
e7484d185a
14 changed files with 162 additions and 17 deletions
|
@ -96,7 +96,6 @@ FdoEnumerateDevices(
|
||||||
{
|
{
|
||||||
PFDO_DEVICE_EXTENSION DeviceExtension;
|
PFDO_DEVICE_EXTENSION DeviceExtension;
|
||||||
PCI_COMMON_CONFIG PciConfig;
|
PCI_COMMON_CONFIG PciConfig;
|
||||||
PLIST_ENTRY CurrentEntry;
|
|
||||||
PPCI_DEVICE Device;
|
PPCI_DEVICE Device;
|
||||||
PCI_SLOT_NUMBER SlotNumber;
|
PCI_SLOT_NUMBER SlotNumber;
|
||||||
ULONG DeviceNumber;
|
ULONG DeviceNumber;
|
||||||
|
@ -108,15 +107,6 @@ FdoEnumerateDevices(
|
||||||
|
|
||||||
DeviceExtension = (PFDO_DEVICE_EXTENSION)DeviceObject->DeviceExtension;
|
DeviceExtension = (PFDO_DEVICE_EXTENSION)DeviceObject->DeviceExtension;
|
||||||
|
|
||||||
/* Mark all devices to be removed. If we don't discover them again during
|
|
||||||
enumeration, assume that they have been surprise removed */
|
|
||||||
CurrentEntry = DeviceExtension->DeviceListHead.Flink;
|
|
||||||
while (CurrentEntry != &DeviceExtension->DeviceListHead) {
|
|
||||||
Device = CONTAINING_RECORD(CurrentEntry, PCI_DEVICE, ListEntry);
|
|
||||||
Device->RemovePending = TRUE;
|
|
||||||
CurrentEntry = CurrentEntry->Flink;
|
|
||||||
}
|
|
||||||
|
|
||||||
DeviceExtension->DeviceListCount = 0;
|
DeviceExtension->DeviceListCount = 0;
|
||||||
|
|
||||||
/* Enumerate devices on the PCI bus */
|
/* Enumerate devices on the PCI bus */
|
||||||
|
@ -190,9 +180,6 @@ FdoEnumerateDevices(
|
||||||
&DeviceExtension->DeviceListLock);
|
&DeviceExtension->DeviceListLock);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Don't remove this device */
|
|
||||||
Device->RemovePending = FALSE;
|
|
||||||
|
|
||||||
DeviceExtension->DeviceListCount++;
|
DeviceExtension->DeviceListCount++;
|
||||||
|
|
||||||
/* Skip to next device if the current one is not a multifunction device */
|
/* Skip to next device if the current one is not a multifunction device */
|
||||||
|
|
|
@ -1443,11 +1443,34 @@ PdoPnpControl(
|
||||||
case IRP_MN_STOP_DEVICE:
|
case IRP_MN_STOP_DEVICE:
|
||||||
case IRP_MN_QUERY_REMOVE_DEVICE:
|
case IRP_MN_QUERY_REMOVE_DEVICE:
|
||||||
case IRP_MN_CANCEL_REMOVE_DEVICE:
|
case IRP_MN_CANCEL_REMOVE_DEVICE:
|
||||||
case IRP_MN_REMOVE_DEVICE:
|
|
||||||
case IRP_MN_SURPRISE_REMOVAL:
|
case IRP_MN_SURPRISE_REMOVAL:
|
||||||
Status = STATUS_SUCCESS;
|
Status = STATUS_SUCCESS;
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
case IRP_MN_REMOVE_DEVICE:
|
||||||
|
{
|
||||||
|
PPDO_DEVICE_EXTENSION DeviceExtension = DeviceObject->DeviceExtension;
|
||||||
|
PFDO_DEVICE_EXTENSION FdoDeviceExtension = DeviceExtension->Fdo->DeviceExtension;
|
||||||
|
KIRQL OldIrql;
|
||||||
|
|
||||||
|
/* Remove it from the device list */
|
||||||
|
KeAcquireSpinLock(&FdoDeviceExtension->DeviceListLock, &OldIrql);
|
||||||
|
RemoveEntryList(&DeviceExtension->PciDevice->ListEntry);
|
||||||
|
FdoDeviceExtension->DeviceListCount--;
|
||||||
|
KeReleaseSpinLock(&FdoDeviceExtension->DeviceListLock, OldIrql);
|
||||||
|
|
||||||
|
/* Free the device */
|
||||||
|
ExFreePool(DeviceExtension->PciDevice);
|
||||||
|
|
||||||
|
/* Complete the IRP */
|
||||||
|
Irp->IoStatus.Status = STATUS_SUCCESS;
|
||||||
|
IoCompleteRequest(Irp, IO_NO_INCREMENT);
|
||||||
|
|
||||||
|
/* Delete the DO */
|
||||||
|
IoDeleteDevice(DeviceObject);
|
||||||
|
return STATUS_SUCCESS;
|
||||||
|
}
|
||||||
|
|
||||||
case IRP_MN_QUERY_INTERFACE:
|
case IRP_MN_QUERY_INTERFACE:
|
||||||
DPRINT("IRP_MN_QUERY_INTERFACE received\n");
|
DPRINT("IRP_MN_QUERY_INTERFACE received\n");
|
||||||
Status = PdoQueryInterface(DeviceObject, Irp, IrpSp);
|
Status = PdoQueryInterface(DeviceObject, Irp, IrpSp);
|
||||||
|
|
|
@ -554,6 +554,7 @@ HidClassFDO_PnP(
|
||||||
{
|
{
|
||||||
return HidClassFDO_RemoveDevice(DeviceObject, Irp);
|
return HidClassFDO_RemoveDevice(DeviceObject, Irp);
|
||||||
}
|
}
|
||||||
|
case IRP_MN_QUERY_REMOVE_DEVICE:
|
||||||
case IRP_MN_QUERY_STOP_DEVICE:
|
case IRP_MN_QUERY_STOP_DEVICE:
|
||||||
{
|
{
|
||||||
//
|
//
|
||||||
|
@ -567,6 +568,7 @@ HidClassFDO_PnP(
|
||||||
IoSkipCurrentIrpStackLocation(Irp);
|
IoSkipCurrentIrpStackLocation(Irp);
|
||||||
return IoCallDriver(FDODeviceExtension->Common.HidDeviceExtension.NextDeviceObject, Irp);
|
return IoCallDriver(FDODeviceExtension->Common.HidDeviceExtension.NextDeviceObject, Irp);
|
||||||
}
|
}
|
||||||
|
case IRP_MN_CANCEL_REMOVE_DEVICE:
|
||||||
case IRP_MN_CANCEL_STOP_DEVICE:
|
case IRP_MN_CANCEL_STOP_DEVICE:
|
||||||
{
|
{
|
||||||
//
|
//
|
||||||
|
|
|
@ -1561,8 +1561,11 @@ HidPnp(
|
||||||
}
|
}
|
||||||
|
|
||||||
//
|
//
|
||||||
// done
|
// delete and detach device
|
||||||
//
|
//
|
||||||
|
IoDetachDevice(DeviceExtension->NextDeviceObject);
|
||||||
|
IoDeleteDevice(DeviceObject);
|
||||||
|
|
||||||
return Status;
|
return Status;
|
||||||
}
|
}
|
||||||
case IRP_MN_QUERY_PNP_DEVICE_STATE:
|
case IRP_MN_QUERY_PNP_DEVICE_STATE:
|
||||||
|
@ -1583,6 +1586,25 @@ HidPnp(
|
||||||
//
|
//
|
||||||
return Status;
|
return Status;
|
||||||
}
|
}
|
||||||
|
case IRP_MN_QUERY_STOP_DEVICE:
|
||||||
|
case IRP_MN_QUERY_REMOVE_DEVICE:
|
||||||
|
{
|
||||||
|
//
|
||||||
|
// we're fine with it
|
||||||
|
//
|
||||||
|
Irp->IoStatus.Status = STATUS_SUCCESS;
|
||||||
|
|
||||||
|
//
|
||||||
|
// pass request to next driver
|
||||||
|
//
|
||||||
|
IoSkipCurrentIrpStackLocation(Irp);
|
||||||
|
Status = IoCallDriver(DeviceExtension->NextDeviceObject, Irp);
|
||||||
|
|
||||||
|
//
|
||||||
|
// done
|
||||||
|
//
|
||||||
|
return Status;
|
||||||
|
}
|
||||||
case IRP_MN_STOP_DEVICE:
|
case IRP_MN_STOP_DEVICE:
|
||||||
{
|
{
|
||||||
//
|
//
|
||||||
|
|
|
@ -737,7 +737,11 @@ KbdHid_Pnp(
|
||||||
IoStack = IoGetCurrentIrpStackLocation(Irp);
|
IoStack = IoGetCurrentIrpStackLocation(Irp);
|
||||||
DPRINT1("[KBDHID] IRP_MJ_PNP Request: %x\n", IoStack->MinorFunction);
|
DPRINT1("[KBDHID] IRP_MJ_PNP Request: %x\n", IoStack->MinorFunction);
|
||||||
|
|
||||||
if (IoStack->MinorFunction == IRP_MN_STOP_DEVICE || IoStack->MinorFunction == IRP_MN_CANCEL_REMOVE_DEVICE || IoStack->MinorFunction == IRP_MN_QUERY_STOP_DEVICE || IoStack->MinorFunction == IRP_MN_CANCEL_STOP_DEVICE)
|
if (IoStack->MinorFunction == IRP_MN_STOP_DEVICE ||
|
||||||
|
IoStack->MinorFunction == IRP_MN_CANCEL_REMOVE_DEVICE ||
|
||||||
|
IoStack->MinorFunction == IRP_MN_QUERY_STOP_DEVICE ||
|
||||||
|
IoStack->MinorFunction == IRP_MN_CANCEL_STOP_DEVICE ||
|
||||||
|
IoStack->MinorFunction == IRP_MN_QUERY_REMOVE_DEVICE)
|
||||||
{
|
{
|
||||||
/* indicate success */
|
/* indicate success */
|
||||||
Irp->IoStatus.Status = STATUS_SUCCESS;
|
Irp->IoStatus.Status = STATUS_SUCCESS;
|
||||||
|
|
|
@ -788,7 +788,11 @@ MouHid_Pnp(
|
||||||
IoStack = IoGetCurrentIrpStackLocation(Irp);
|
IoStack = IoGetCurrentIrpStackLocation(Irp);
|
||||||
DPRINT1("[MOUHID] IRP_MJ_PNP Request: %x\n", IoStack->MinorFunction);
|
DPRINT1("[MOUHID] IRP_MJ_PNP Request: %x\n", IoStack->MinorFunction);
|
||||||
|
|
||||||
if (IoStack->MinorFunction == IRP_MN_STOP_DEVICE || IoStack->MinorFunction == IRP_MN_CANCEL_REMOVE_DEVICE || IoStack->MinorFunction == IRP_MN_QUERY_STOP_DEVICE || IoStack->MinorFunction == IRP_MN_CANCEL_STOP_DEVICE)
|
if (IoStack->MinorFunction == IRP_MN_STOP_DEVICE ||
|
||||||
|
IoStack->MinorFunction == IRP_MN_CANCEL_REMOVE_DEVICE ||
|
||||||
|
IoStack->MinorFunction == IRP_MN_QUERY_STOP_DEVICE ||
|
||||||
|
IoStack->MinorFunction == IRP_MN_CANCEL_STOP_DEVICE ||
|
||||||
|
IoStack->MinorFunction == IRP_MN_QUERY_REMOVE_DEVICE)
|
||||||
{
|
{
|
||||||
/* indicate success */
|
/* indicate success */
|
||||||
Irp->IoStatus.Status = STATUS_SUCCESS;
|
Irp->IoStatus.Status = STATUS_SUCCESS;
|
||||||
|
|
|
@ -481,6 +481,20 @@ FDO_HandlePnp(
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
case IRP_MN_QUERY_REMOVE_DEVICE:
|
||||||
|
case IRP_MN_QUERY_STOP_DEVICE:
|
||||||
|
{
|
||||||
|
//
|
||||||
|
// sure
|
||||||
|
//
|
||||||
|
Irp->IoStatus.Status = STATUS_SUCCESS;
|
||||||
|
|
||||||
|
//
|
||||||
|
// forward irp to next device object
|
||||||
|
//
|
||||||
|
IoSkipCurrentIrpStackLocation(Irp);
|
||||||
|
return IoCallDriver(FDODeviceExtension->NextDeviceObject, Irp);
|
||||||
|
}
|
||||||
default:
|
default:
|
||||||
{
|
{
|
||||||
//
|
//
|
||||||
|
|
|
@ -391,6 +391,15 @@ PDO_HandlePnp(
|
||||||
IoCompleteRequest(Irp, IO_NO_INCREMENT);
|
IoCompleteRequest(Irp, IO_NO_INCREMENT);
|
||||||
return STATUS_SUCCESS;
|
return STATUS_SUCCESS;
|
||||||
}
|
}
|
||||||
|
case IRP_MN_QUERY_REMOVE_DEVICE:
|
||||||
|
case IRP_MN_QUERY_STOP_DEVICE:
|
||||||
|
{
|
||||||
|
//
|
||||||
|
// sure
|
||||||
|
//
|
||||||
|
Status = STATUS_SUCCESS;
|
||||||
|
break;
|
||||||
|
}
|
||||||
case IRP_MN_START_DEVICE:
|
case IRP_MN_START_DEVICE:
|
||||||
{
|
{
|
||||||
//
|
//
|
||||||
|
@ -406,6 +415,7 @@ PDO_HandlePnp(
|
||||||
// do nothing
|
// do nothing
|
||||||
//
|
//
|
||||||
Status = Irp->IoStatus.Status;
|
Status = Irp->IoStatus.Status;
|
||||||
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -434,6 +434,15 @@ CHubController::HandlePnp(
|
||||||
Status = SetDeviceInterface(TRUE);
|
Status = SetDeviceInterface(TRUE);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
case IRP_MN_QUERY_STOP_DEVICE:
|
||||||
|
case IRP_MN_QUERY_REMOVE_DEVICE:
|
||||||
|
{
|
||||||
|
//
|
||||||
|
// sure
|
||||||
|
//
|
||||||
|
Status = STATUS_SUCCESS;
|
||||||
|
break;
|
||||||
|
}
|
||||||
case IRP_MN_QUERY_ID:
|
case IRP_MN_QUERY_ID:
|
||||||
{
|
{
|
||||||
DPRINT1("CHubController::HandlePnp IRP_MN_QUERY_ID Type %x\n", IoStack->Parameters.QueryId.IdType);
|
DPRINT1("CHubController::HandlePnp IRP_MN_QUERY_ID Type %x\n", IoStack->Parameters.QueryId.IdType);
|
||||||
|
|
|
@ -1883,6 +1883,22 @@ USBHUB_FdoHandlePnp(
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
case IRP_MN_QUERY_REMOVE_DEVICE:
|
||||||
|
case IRP_MN_QUERY_STOP_DEVICE:
|
||||||
|
{
|
||||||
|
Irp->IoStatus.Status = STATUS_SUCCESS;
|
||||||
|
return ForwardIrpAndForget(DeviceObject, Irp);
|
||||||
|
}
|
||||||
|
case IRP_MN_REMOVE_DEVICE:
|
||||||
|
{
|
||||||
|
Irp->IoStatus.Status = STATUS_SUCCESS;
|
||||||
|
IoCompleteRequest(Irp, IO_NO_INCREMENT);
|
||||||
|
|
||||||
|
IoDetachDevice(HubDeviceExtension->LowerDeviceObject);
|
||||||
|
IoDeleteDevice(DeviceObject);
|
||||||
|
|
||||||
|
return STATUS_SUCCESS;
|
||||||
|
}
|
||||||
case IRP_MN_QUERY_BUS_INFORMATION:
|
case IRP_MN_QUERY_BUS_INFORMATION:
|
||||||
{
|
{
|
||||||
DPRINT1("IRP_MN_QUERY_BUS_INFORMATION\n");
|
DPRINT1("IRP_MN_QUERY_BUS_INFORMATION\n");
|
||||||
|
|
|
@ -586,6 +586,14 @@ USBHUB_PdoHandlePnp(
|
||||||
IoDeleteDevice(DeviceObject);
|
IoDeleteDevice(DeviceObject);
|
||||||
return STATUS_SUCCESS;
|
return STATUS_SUCCESS;
|
||||||
}
|
}
|
||||||
|
case IRP_MN_QUERY_STOP_DEVICE:
|
||||||
|
case IRP_MN_QUERY_REMOVE_DEVICE:
|
||||||
|
{
|
||||||
|
/* Sure, no problem */
|
||||||
|
Status = STATUS_SUCCESS;
|
||||||
|
Information = 0;
|
||||||
|
break;
|
||||||
|
}
|
||||||
default:
|
default:
|
||||||
{
|
{
|
||||||
DPRINT1("PDO IRP_MJ_PNP / unknown minor function 0x%lx\n", MinorFunction);
|
DPRINT1("PDO IRP_MJ_PNP / unknown minor function 0x%lx\n", MinorFunction);
|
||||||
|
|
|
@ -437,6 +437,15 @@ CHubController::HandlePnp(
|
||||||
Status = SetDeviceInterface(TRUE);
|
Status = SetDeviceInterface(TRUE);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
case IRP_MN_QUERY_STOP_DEVICE:
|
||||||
|
case IRP_MN_QUERY_REMOVE_DEVICE:
|
||||||
|
{
|
||||||
|
//
|
||||||
|
// sure
|
||||||
|
//
|
||||||
|
Status = STATUS_SUCCESS;
|
||||||
|
break;
|
||||||
|
}
|
||||||
case IRP_MN_QUERY_ID:
|
case IRP_MN_QUERY_ID:
|
||||||
{
|
{
|
||||||
DPRINT1("CHubController::HandlePnp IRP_MN_QUERY_ID Type %x\n", IoStack->Parameters.QueryId.IdType);
|
DPRINT1("CHubController::HandlePnp IRP_MN_QUERY_ID Type %x\n", IoStack->Parameters.QueryId.IdType);
|
||||||
|
|
|
@ -339,9 +339,11 @@ USBSTOR_FdoHandlePnp(
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case IRP_MN_STOP_DEVICE:
|
case IRP_MN_STOP_DEVICE:
|
||||||
|
{
|
||||||
DPRINT1("USBSTOR_FdoHandlePnp: IRP_MN_STOP_DEVICE unimplemented\n");
|
DPRINT1("USBSTOR_FdoHandlePnp: IRP_MN_STOP_DEVICE unimplemented\n");
|
||||||
Status = STATUS_NOT_SUPPORTED;
|
Status = STATUS_NOT_SUPPORTED;
|
||||||
break;
|
break;
|
||||||
|
}
|
||||||
case IRP_MN_REMOVE_DEVICE:
|
case IRP_MN_REMOVE_DEVICE:
|
||||||
{
|
{
|
||||||
DPRINT1("IRP_MN_REMOVE_DEVICE\n");
|
DPRINT1("IRP_MN_REMOVE_DEVICE\n");
|
||||||
|
@ -356,6 +358,29 @@ USBSTOR_FdoHandlePnp(
|
||||||
IoSkipCurrentIrpStackLocation(Irp);
|
IoSkipCurrentIrpStackLocation(Irp);
|
||||||
return IoCallDriver(DeviceExtension->LowerDeviceObject, Irp);
|
return IoCallDriver(DeviceExtension->LowerDeviceObject, Irp);
|
||||||
}
|
}
|
||||||
|
case IRP_MN_QUERY_STOP_DEVICE:
|
||||||
|
case IRP_MN_QUERY_REMOVE_DEVICE:
|
||||||
|
{
|
||||||
|
//
|
||||||
|
// we can if nothing is pending
|
||||||
|
//
|
||||||
|
if (DeviceExtension->IrpPendingCount != 0 ||
|
||||||
|
DeviceExtension->ActiveSrb != NULL)
|
||||||
|
{
|
||||||
|
/* We have pending requests */
|
||||||
|
DPRINT1("Failing removal/stop request due to pending requests present\n");
|
||||||
|
Status = STATUS_UNSUCCESSFUL;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
/* We're all clear */
|
||||||
|
Irp->IoStatus.Status = STATUS_SUCCESS;
|
||||||
|
|
||||||
|
IoSkipCurrentIrpStackLocation(Irp);
|
||||||
|
return IoCallDriver(DeviceExtension->LowerDeviceObject, Irp);
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
}
|
||||||
case IRP_MN_START_DEVICE:
|
case IRP_MN_START_DEVICE:
|
||||||
{
|
{
|
||||||
Status = USBSTOR_FdoHandleStartDevice(DeviceObject, DeviceExtension, Irp);
|
Status = USBSTOR_FdoHandleStartDevice(DeviceObject, DeviceExtension, Irp);
|
||||||
|
|
|
@ -873,6 +873,18 @@ USBSTOR_PdoHandlePnp(
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
case IRP_MN_QUERY_REMOVE_DEVICE:
|
||||||
|
case IRP_MN_QUERY_STOP_DEVICE:
|
||||||
|
{
|
||||||
|
//
|
||||||
|
// if we're not claimed it's ok
|
||||||
|
//
|
||||||
|
if (DeviceExtension->Claimed)
|
||||||
|
Status = STATUS_UNSUCCESSFUL;
|
||||||
|
else
|
||||||
|
Status = STATUS_SUCCESS;
|
||||||
|
break;
|
||||||
|
}
|
||||||
case IRP_MN_START_DEVICE:
|
case IRP_MN_START_DEVICE:
|
||||||
{
|
{
|
||||||
//
|
//
|
||||||
|
|
Loading…
Reference in a new issue