diff --git a/reactos/drivers/hid/kbdhid/kbdhid.c b/reactos/drivers/hid/kbdhid/kbdhid.c index 8366d4682a8..778d625ba6e 100644 --- a/reactos/drivers/hid/kbdhid/kbdhid.c +++ b/reactos/drivers/hid/kbdhid/kbdhid.c @@ -771,6 +771,47 @@ KbdHid_StartDeviceCompletion( return STATUS_MORE_PROCESSING_REQUIRED; } +NTSTATUS +NTAPI +KbdHid_FreeResources( + IN PDEVICE_OBJECT DeviceObject) +{ + PKBDHID_DEVICE_EXTENSION DeviceExtension; + + /* get device extension */ + DeviceExtension = DeviceObject->DeviceExtension; + + /* free resources */ + if (DeviceExtension->PreparsedData) + { + ExFreePool(DeviceExtension->PreparsedData); + DeviceExtension->PreparsedData = NULL; + } + + if (DeviceExtension->CurrentUsageList) + { + ExFreePool(DeviceExtension->CurrentUsageList); + DeviceExtension->CurrentUsageList = NULL; + DeviceExtension->PreviousUsageList = NULL; + DeviceExtension->MakeUsageList = NULL; + DeviceExtension->BreakUsageList = NULL; + } + + if (DeviceExtension->ReportMDL) + { + IoFreeMdl(DeviceExtension->ReportMDL); + DeviceExtension->ReportMDL = NULL; + } + + if (DeviceExtension->Report) + { + ExFreePool(DeviceExtension->Report); + DeviceExtension->Report = NULL; + } + + return STATUS_SUCCESS; +} + NTSTATUS NTAPI KbdHid_Flush( @@ -818,6 +859,10 @@ KbdHid_Pnp( switch (IoStack->MinorFunction) { case IRP_MN_STOP_DEVICE: + case IRP_MN_SURPRISE_REMOVAL: + /* free resources */ + KbdHid_FreeResources(DeviceObject); + /* fall through */ case IRP_MN_CANCEL_REMOVE_DEVICE: case IRP_MN_QUERY_STOP_DEVICE: case IRP_MN_CANCEL_STOP_DEVICE: @@ -837,6 +882,9 @@ KbdHid_Pnp( /* cancel irp */ IoCancelIrp(DeviceExtension->Irp); + /* free resources */ + KbdHid_FreeResources(DeviceObject); + /* indicate success */ Irp->IoStatus.Status = STATUS_SUCCESS; diff --git a/reactos/drivers/hid/mouhid/mouhid.c b/reactos/drivers/hid/mouhid/mouhid.c index a4ecf9a1b8a..81b8050f9db 100644 --- a/reactos/drivers/hid/mouhid/mouhid.c +++ b/reactos/drivers/hid/mouhid/mouhid.c @@ -902,6 +902,47 @@ MouHid_StartDeviceCompletion( return STATUS_MORE_PROCESSING_REQUIRED; } +NTSTATUS +NTAPI +MouHid_FreeResources( + IN PDEVICE_OBJECT DeviceObject) +{ + PMOUHID_DEVICE_EXTENSION DeviceExtension; + + /* get device extension */ + DeviceExtension = DeviceObject->DeviceExtension; + + /* free resources */ + if (DeviceExtension->PreparsedData) + { + ExFreePool(DeviceExtension->PreparsedData); + DeviceExtension->PreparsedData = NULL; + } + + if (DeviceExtension->CurrentUsageList) + { + ExFreePool(DeviceExtension->CurrentUsageList); + DeviceExtension->CurrentUsageList = NULL; + DeviceExtension->PreviousUsageList = NULL; + DeviceExtension->MakeUsageList = NULL; + DeviceExtension->BreakUsageList = NULL; + } + + if (DeviceExtension->ReportMDL) + { + IoFreeMdl(DeviceExtension->ReportMDL); + DeviceExtension->ReportMDL = NULL; + } + + if (DeviceExtension->Report) + { + ExFreePool(DeviceExtension->Report); + DeviceExtension->Report = NULL; + } + + return STATUS_SUCCESS; +} + NTSTATUS NTAPI MouHid_Flush( @@ -949,6 +990,9 @@ MouHid_Pnp( switch (IoStack->MinorFunction) { case IRP_MN_STOP_DEVICE: + case IRP_MN_SURPRISE_REMOVAL: + /* free resources */ + MouHid_FreeResources(DeviceObject); case IRP_MN_CANCEL_REMOVE_DEVICE: case IRP_MN_QUERY_STOP_DEVICE: case IRP_MN_CANCEL_STOP_DEVICE: @@ -971,6 +1015,9 @@ MouHid_Pnp( /* cancel irp */ IoCancelIrp(DeviceExtension->Irp); + /* free resources */ + MouHid_FreeResources(DeviceObject); + /* indicate success */ Irp->IoStatus.Status = STATUS_SUCCESS;