diff --git a/reactos/drivers/usb/usbehci/fdo.c b/reactos/drivers/usb/usbehci/fdo.c index c225b23274d..73feb442968 100644 --- a/reactos/drivers/usb/usbehci/fdo.c +++ b/reactos/drivers/usb/usbehci/fdo.c @@ -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 { diff --git a/reactos/drivers/usb/usbehci/irp.c b/reactos/drivers/usb/usbehci/irp.c index d099646af84..9be9e8b0f30 100644 --- a/reactos/drivers/usb/usbehci/irp.c +++ b/reactos/drivers/usb/usbehci/irp.c @@ -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); } diff --git a/reactos/drivers/usb/usbehci/usbehci.h b/reactos/drivers/usb/usbehci/usbehci.h index 1e0eecfc452..ca3765b5f95 100644 --- a/reactos/drivers/usb/usbehci/usbehci.h +++ b/reactos/drivers/usb/usbehci/usbehci.h @@ -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);