mirror of
https://github.com/reactos/reactos.git
synced 2025-01-01 03:54:02 +00:00
[HIDCLASS]
- Implement HidClass_Power [USBCCGP] - Remove superflous spaces - Implement IRP_MJ_SYSTEM_CONTROL - Fix bug in IRP_MJ_POWER handler - Add driver unload routine [USBEHCI,USBOHCI, USBUHCI] - Support Win2k3 usbhub.sys, which uses null device handle for the root usb hub - Based on a patch by Thomas Faber svn path=/trunk/; revision=59080
This commit is contained in:
parent
e29102f914
commit
a2085a332c
7 changed files with 65 additions and 14 deletions
|
@ -971,8 +971,21 @@ HidClass_Power(
|
||||||
IN PDEVICE_OBJECT DeviceObject,
|
IN PDEVICE_OBJECT DeviceObject,
|
||||||
IN PIRP Irp)
|
IN PIRP Irp)
|
||||||
{
|
{
|
||||||
UNIMPLEMENTED
|
PHIDCLASS_COMMON_DEVICE_EXTENSION CommonDeviceExtension;
|
||||||
return STATUS_NOT_IMPLEMENTED;
|
CommonDeviceExtension = DeviceObject->DeviceExtension;
|
||||||
|
|
||||||
|
if (CommonDeviceExtension->IsFDO)
|
||||||
|
{
|
||||||
|
IoCopyCurrentIrpStackLocationToNext(Irp);
|
||||||
|
return HidClassFDO_DispatchRequest(DeviceObject, Irp);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
Irp->IoStatus.Status = STATUS_SUCCESS;
|
||||||
|
PoStartNextPowerIrp(Irp);
|
||||||
|
IoCompleteRequest(Irp, IO_NO_INCREMENT);
|
||||||
|
return STATUS_SUCCESS;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
NTSTATUS
|
NTSTATUS
|
||||||
|
|
|
@ -185,6 +185,11 @@ HidClassFDO_PnP(
|
||||||
IN PDEVICE_OBJECT DeviceObject,
|
IN PDEVICE_OBJECT DeviceObject,
|
||||||
IN PIRP Irp);
|
IN PIRP Irp);
|
||||||
|
|
||||||
|
NTSTATUS
|
||||||
|
HidClassFDO_DispatchRequest(
|
||||||
|
IN PDEVICE_OBJECT DeviceObject,
|
||||||
|
IN PIRP Irp);
|
||||||
|
|
||||||
NTSTATUS
|
NTSTATUS
|
||||||
HidClassFDO_DispatchRequestSynchronous(
|
HidClassFDO_DispatchRequestSynchronous(
|
||||||
IN PDEVICE_OBJECT DeviceObject,
|
IN PDEVICE_OBJECT DeviceObject,
|
||||||
|
|
|
@ -585,6 +585,22 @@ FDO_HandleInternalDeviceControl(
|
||||||
return IoCallDriver(FDODeviceExtension->NextDeviceObject, Irp);
|
return IoCallDriver(FDODeviceExtension->NextDeviceObject, Irp);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
NTSTATUS
|
||||||
|
FDO_HandleSystemControl(
|
||||||
|
PDEVICE_OBJECT DeviceObject,
|
||||||
|
PIRP Irp)
|
||||||
|
{
|
||||||
|
PFDO_DEVICE_EXTENSION FDODeviceExtension;
|
||||||
|
|
||||||
|
/* Get device extension */
|
||||||
|
FDODeviceExtension = (PFDO_DEVICE_EXTENSION)DeviceObject->DeviceExtension;
|
||||||
|
ASSERT(FDODeviceExtension->Common.IsFDO);
|
||||||
|
|
||||||
|
/* Forward and forget request */
|
||||||
|
IoSkipCurrentIrpStackLocation(Irp);
|
||||||
|
return IoCallDriver(FDODeviceExtension->NextDeviceObject, Irp);
|
||||||
|
}
|
||||||
|
|
||||||
NTSTATUS
|
NTSTATUS
|
||||||
FDO_Dispatch(
|
FDO_Dispatch(
|
||||||
PDEVICE_OBJECT DeviceObject,
|
PDEVICE_OBJECT DeviceObject,
|
||||||
|
@ -592,6 +608,11 @@ FDO_Dispatch(
|
||||||
{
|
{
|
||||||
PIO_STACK_LOCATION IoStack;
|
PIO_STACK_LOCATION IoStack;
|
||||||
NTSTATUS Status;
|
NTSTATUS Status;
|
||||||
|
PFDO_DEVICE_EXTENSION FDODeviceExtension;
|
||||||
|
|
||||||
|
/* Get device extension */
|
||||||
|
FDODeviceExtension = DeviceObject->DeviceExtension;
|
||||||
|
ASSERT(FDODeviceExtension->Common.IsFDO);
|
||||||
|
|
||||||
/* Get stack location */
|
/* Get stack location */
|
||||||
IoStack = IoGetCurrentIrpStackLocation(Irp);
|
IoStack = IoGetCurrentIrpStackLocation(Irp);
|
||||||
|
@ -600,8 +621,14 @@ FDO_Dispatch(
|
||||||
{
|
{
|
||||||
case IRP_MJ_PNP:
|
case IRP_MJ_PNP:
|
||||||
return FDO_HandlePnp(DeviceObject, Irp);
|
return FDO_HandlePnp(DeviceObject, Irp);
|
||||||
case IRP_MJ_INTERNAL_DEVICE_CONTROL:
|
case IRP_MJ_INTERNAL_DEVICE_CONTROL:
|
||||||
return FDO_HandleInternalDeviceControl(DeviceObject, Irp);
|
return FDO_HandleInternalDeviceControl(DeviceObject, Irp);
|
||||||
|
case IRP_MJ_POWER:
|
||||||
|
PoStartNextPowerIrp(Irp);
|
||||||
|
IoSkipCurrentIrpStackLocation(Irp);
|
||||||
|
return PoCallDriver(FDODeviceExtension->NextDeviceObject, Irp);
|
||||||
|
case IRP_MJ_SYSTEM_CONTROL:
|
||||||
|
return FDO_HandleSystemControl(DeviceObject, Irp);
|
||||||
default:
|
default:
|
||||||
DPRINT1("FDO_Dispatch Function %x not implemented\n", IoStack->MajorFunction);
|
DPRINT1("FDO_Dispatch Function %x not implemented\n", IoStack->MajorFunction);
|
||||||
ASSERT(FALSE);
|
ASSERT(FALSE);
|
||||||
|
|
|
@ -1076,6 +1076,11 @@ PDO_Dispatch(
|
||||||
return PDO_HandlePnp(DeviceObject, Irp);
|
return PDO_HandlePnp(DeviceObject, Irp);
|
||||||
case IRP_MJ_INTERNAL_DEVICE_CONTROL:
|
case IRP_MJ_INTERNAL_DEVICE_CONTROL:
|
||||||
return PDO_HandleInternalDeviceControl(DeviceObject, Irp);
|
return PDO_HandleInternalDeviceControl(DeviceObject, Irp);
|
||||||
|
case IRP_MJ_POWER:
|
||||||
|
PoStartNextPowerIrp(Irp);
|
||||||
|
Irp->IoStatus.Status = STATUS_SUCCESS;
|
||||||
|
IoCompleteRequest(Irp, IO_NO_INCREMENT);
|
||||||
|
return STATUS_SUCCESS;
|
||||||
default:
|
default:
|
||||||
DPRINT1("PDO_Dispatch Function %x not implemented\n", IoStack->MajorFunction);
|
DPRINT1("PDO_Dispatch Function %x not implemented\n", IoStack->MajorFunction);
|
||||||
Status = Irp->IoStatus.Status;
|
Status = Irp->IoStatus.Status;
|
||||||
|
|
|
@ -160,7 +160,8 @@ DriverEntry(
|
||||||
DriverObject->MajorFunction[IRP_MJ_INTERNAL_DEVICE_CONTROL] = USBCCGP_Dispatch;
|
DriverObject->MajorFunction[IRP_MJ_INTERNAL_DEVICE_CONTROL] = USBCCGP_Dispatch;
|
||||||
DriverObject->MajorFunction[IRP_MJ_POWER] = USBCCGP_Dispatch;
|
DriverObject->MajorFunction[IRP_MJ_POWER] = USBCCGP_Dispatch;
|
||||||
DriverObject->MajorFunction[IRP_MJ_PNP] = USBCCGP_Dispatch;
|
DriverObject->MajorFunction[IRP_MJ_PNP] = USBCCGP_Dispatch;
|
||||||
DriverObject->DriverUnload = USBCCGP_Unload;
|
DriverObject->MajorFunction[IRP_MJ_SYSTEM_CONTROL] = USBCCGP_Dispatch;
|
||||||
|
DriverObject->DriverUnload = USBCCGP_Unload;
|
||||||
|
|
||||||
/* FIMXE query GenericCompositeUSBDeviceString */
|
/* FIMXE query GenericCompositeUSBDeviceString */
|
||||||
|
|
||||||
|
|
|
@ -757,7 +757,7 @@ HidParser_GetScaledUsageValueWithReport(
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
// HACK: logical boundaries are absolute values
|
// logical boundaries are absolute values
|
||||||
return HIDPARSER_STATUS_BAD_LOG_PHY_VALUES;
|
return HIDPARSER_STATUS_BAD_LOG_PHY_VALUES;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -839,7 +839,7 @@ CHubController::HandleBulkOrInterruptTransfer(
|
||||||
//
|
//
|
||||||
// Is the Request for the root hub
|
// Is the Request for the root hub
|
||||||
//
|
//
|
||||||
if (Urb->UrbHeader.UsbdDeviceHandle == PVOID(this))
|
if (Urb->UrbHeader.UsbdDeviceHandle == PVOID(this) || Urb->UrbHeader.UsbdDeviceHandle == NULL)
|
||||||
{
|
{
|
||||||
ASSERT(m_PendingSCEIrp == NULL);
|
ASSERT(m_PendingSCEIrp == NULL);
|
||||||
if (QueryStatusChageEndpoint(Irp))
|
if (QueryStatusChageEndpoint(Irp))
|
||||||
|
@ -1189,7 +1189,7 @@ CHubController::HandleGetStatusFromDevice(
|
||||||
DeviceStatus = (PUSHORT)Urb->UrbControlGetStatusRequest.TransferBuffer;
|
DeviceStatus = (PUSHORT)Urb->UrbControlGetStatusRequest.TransferBuffer;
|
||||||
|
|
||||||
|
|
||||||
if (Urb->UrbHeader.UsbdDeviceHandle == PVOID(this))
|
if (Urb->UrbHeader.UsbdDeviceHandle == PVOID(this) || Urb->UrbHeader.UsbdDeviceHandle == NULL)
|
||||||
{
|
{
|
||||||
//
|
//
|
||||||
// FIXME need more flags ?
|
// FIXME need more flags ?
|
||||||
|
@ -1319,7 +1319,7 @@ CHubController::HandleClassDevice(
|
||||||
case USB_DEVICE_CLASS_RESERVED: // FALL THROUGH
|
case USB_DEVICE_CLASS_RESERVED: // FALL THROUGH
|
||||||
case USB_DEVICE_CLASS_HUB:
|
case USB_DEVICE_CLASS_HUB:
|
||||||
{
|
{
|
||||||
if (Urb->UrbHeader.UsbdDeviceHandle == PVOID(this))
|
if (Urb->UrbHeader.UsbdDeviceHandle == PVOID(this) || Urb->UrbHeader.UsbdDeviceHandle == NULL)
|
||||||
{
|
{
|
||||||
//
|
//
|
||||||
// sanity checks
|
// sanity checks
|
||||||
|
@ -1525,7 +1525,7 @@ CHubController::HandleGetDescriptor(
|
||||||
PC_ASSERT(Urb->UrbControlDescriptorRequest.TransferBufferLength >= sizeof(USB_DEVICE_DESCRIPTOR));
|
PC_ASSERT(Urb->UrbControlDescriptorRequest.TransferBufferLength >= sizeof(USB_DEVICE_DESCRIPTOR));
|
||||||
PC_ASSERT(Urb->UrbControlDescriptorRequest.TransferBuffer);
|
PC_ASSERT(Urb->UrbControlDescriptorRequest.TransferBuffer);
|
||||||
|
|
||||||
if (Urb->UrbHeader.UsbdDeviceHandle == PVOID(this))
|
if (Urb->UrbHeader.UsbdDeviceHandle == PVOID(this) || Urb->UrbHeader.UsbdDeviceHandle == NULL)
|
||||||
{
|
{
|
||||||
//
|
//
|
||||||
// copy root hub device descriptor
|
// copy root hub device descriptor
|
||||||
|
@ -1578,7 +1578,7 @@ CHubController::HandleGetDescriptor(
|
||||||
BufferLength = Urb->UrbControlDescriptorRequest.TransferBufferLength;
|
BufferLength = Urb->UrbControlDescriptorRequest.TransferBufferLength;
|
||||||
Buffer = (PUCHAR) Urb->UrbControlDescriptorRequest.TransferBuffer;
|
Buffer = (PUCHAR) Urb->UrbControlDescriptorRequest.TransferBuffer;
|
||||||
|
|
||||||
if (Urb->UrbHeader.UsbdDeviceHandle == PVOID(this))
|
if (Urb->UrbHeader.UsbdDeviceHandle == PVOID(this) || Urb->UrbHeader.UsbdDeviceHandle == NULL)
|
||||||
{
|
{
|
||||||
//
|
//
|
||||||
// request is for the root bus controller
|
// request is for the root bus controller
|
||||||
|
|
Loading…
Reference in a new issue