[HIDCLASS]

- Fix double irp completion bug in hidclass
- Hidclass now properly initializes and works in WinServer2003
- Tested excessively by Vic (Blame him ;))

svn path=/trunk/; revision=59049
This commit is contained in:
Johannes Anderwald 2013-05-19 21:33:08 +00:00
parent d0b02e62c0
commit 1b78db23f2

View file

@ -182,9 +182,13 @@ HidClassFDO_DispatchRequestSynchronous(
IoStack->DeviceObject = DeviceObject;
//
// call driver
// sanity check
//
ASSERT(CommonDeviceExtension->DriverExtension->MajorFunction[IoStack->MajorFunction] != NULL);
//
// call minidriver (hidusb)
//
DPRINT("IoStack MajorFunction %x MinorFunction %x\n", IoStack->MajorFunction, IoStack->MinorFunction);
Status = CommonDeviceExtension->DriverExtension->MajorFunction[IoStack->MajorFunction](DeviceObject, Irp);
//
@ -206,6 +210,53 @@ HidClassFDO_DispatchRequestSynchronous(
return Status;
}
NTSTATUS
HidClassFDO_DispatchRequest(
IN PDEVICE_OBJECT DeviceObject,
IN PIRP Irp)
{
PHIDCLASS_COMMON_DEVICE_EXTENSION CommonDeviceExtension;
NTSTATUS Status;
PIO_STACK_LOCATION IoStack;
//
// get device extension
//
CommonDeviceExtension = DeviceObject->DeviceExtension;
ASSERT(Irp->CurrentLocation > 0);
//
// create stack location
//
IoSetNextIrpStackLocation(Irp);
//
// get next stack location
//
IoStack = IoGetCurrentIrpStackLocation(Irp);
//
// store device object
//
IoStack->DeviceObject = DeviceObject;
//
// sanity check
//
ASSERT(CommonDeviceExtension->DriverExtension->MajorFunction[IoStack->MajorFunction] != NULL);
//
// call driver
//
Status = CommonDeviceExtension->DriverExtension->MajorFunction[IoStack->MajorFunction](DeviceObject, Irp);
//
// done
//
return Status;
}
NTSTATUS
HidClassFDO_GetDescriptors(
IN PDEVICE_OBJECT DeviceObject)
@ -620,14 +671,8 @@ HidClassFDO_PnP(
//
// dispatch to mini driver
//
IoSkipCurrentIrpStackLocation(Irp);
Status = HidClassFDO_DispatchRequestSynchronous(DeviceObject, Irp);
//
// complete request
//
Irp->IoStatus.Status = Status;
IoCompleteRequest(Irp, IO_NO_INCREMENT);
IoCopyCurrentIrpStackLocationToNext(Irp);
Status = HidClassFDO_DispatchRequest(DeviceObject, Irp);
return Status;
}
}