[usb/usbehci]

- Fix WorkItem Context to pass in Device Extension and the IoWorkItem so it may be freed.

svn path=/trunk/; revision=45024
This commit is contained in:
Michael Martin 2010-01-10 12:24:01 +00:00
parent 72ed9b6854
commit 433baa7b5e
3 changed files with 25 additions and 6 deletions

View file

@ -40,6 +40,7 @@ EhciDefferedRoutine(PKDPC Dpc, PVOID DeferredContext, PVOID SystemArgument1, PVO
if (tmp & 0x02)
{
PIO_WORKITEM WorkItem = NULL;
PWORKITEM_DATA WorkItemData = NULL;
/* Connect or Disconnect? */
if (tmp & 0x01)
@ -86,16 +87,23 @@ EhciDefferedRoutine(PKDPC Dpc, PVOID DeferredContext, PVOID SystemArgument1, PVO
CompletePendingRequest(FdoDeviceExtension);
WorkItem = IoAllocateWorkItem(FdoDeviceExtension->Pdo);
if (!WorkItem)
{
DPRINT1("WorkItem allocation failed!\n");
break;
}
WorkItemData = ExAllocatePool(NonPagedPool, sizeof(WORKITEM_DATA));
if (!WorkItemData)
{
DPRINT1("No memory\n");
break;
}
IoQueueWorkItem(WorkItem,
(PIO_WORKITEM_ROUTINE)DeviceArrivalWorkItem,
DelayedWorkQueue,
FdoDeviceExtension);
WorkItemData);
}
else
{

View file

@ -107,25 +107,26 @@ ArrivalNotificationCompletion(PDEVICE_OBJECT DeviceObject, PIRP Irp, PVOID PCont
VOID
DeviceArrivalWorkItem(PDEVICE_OBJECT DeviceObject, PVOID Context)
{
PFDO_DEVICE_EXTENSION FdoDeviceExtension;
PWORKITEM_DATA WorkItemData;
PIO_STACK_LOCATION IrpStack = NULL;
PDEVICE_OBJECT PortDeviceObject = NULL;
PIRP Irp = NULL;
FdoDeviceExtension = (PFDO_DEVICE_EXTENSION)Context;
WorkItemData = (PWORKITEM_DATA)Context;
PortDeviceObject = IoGetAttachedDeviceReference(FdoDeviceExtension->Pdo);
PortDeviceObject = IoGetAttachedDeviceReference(WorkItemData->FdoDeviceExtension->Pdo);
if (!PortDeviceObject)
{
DPRINT1("Unable to notify Pdos parent of device arrival.\n");
return;
goto Cleanup;
}
if (PortDeviceObject == DeviceObject)
{
/* Piontless to send query relations to ourself */
ObDereferenceObject(PortDeviceObject);
goto Cleanup;
}
Irp = IoAllocateIrp(PortDeviceObject->StackSize, FALSE);
@ -148,5 +149,9 @@ DeviceArrivalWorkItem(PDEVICE_OBJECT DeviceObject, PVOID Context)
IrpStack->MinorFunction = IRP_MN_QUERY_DEVICE_RELATIONS;
IoCallDriver(PortDeviceObject, Irp);
Cleanup:
IoFreeWorkItem(WorkItemData->IoWorkItem);
ExFreePool(WorkItemData);
}

View file

@ -366,6 +366,12 @@ typedef struct _PDO_DEVICE_EXTENSION
} PDO_DEVICE_EXTENSION, *PPDO_DEVICE_EXTENSION;
typedef struct _WORKITEM_DATA
{
PIO_WORKITEM IoWorkItem;
PFDO_DEVICE_EXTENSION FdoDeviceExtension;
} WORKITEM_DATA, *PWORKITEM_DATA;
NTSTATUS NTAPI
GetBusInterface(PDEVICE_OBJECT pcifido, PBUS_INTERFACE_STANDARD busInterface);