Home | Info | Community | Development | myReactOS | Contact Us
[static]
Definition at line 733 of file mouclass.c.
Referenced by ClassCallback(), ClassRead(), and ClassStartIo().
{ PCLASS_DEVICE_EXTENSION DeviceExtension = DeviceObject->DeviceExtension; NTSTATUS Status; KIRQL OldIrql; TRACE_(CLASS_NAME, "HandleReadIrp(DeviceObject %p, Irp %p)\n", DeviceObject, Irp); ASSERT(DeviceExtension->Common.IsClassDO); if (DeviceExtension->InputCount > 0) { SIZE_T NumberOfEntries; NumberOfEntries = MIN( DeviceExtension->InputCount, IoGetCurrentIrpStackLocation(Irp)->Parameters.Read.Length / sizeof(MOUSE_INPUT_DATA)); Status = FillEntries( DeviceObject, Irp, DeviceExtension->PortData, NumberOfEntries); if (NT_SUCCESS(Status)) { if (DeviceExtension->InputCount > NumberOfEntries) { RtlMoveMemory( &DeviceExtension->PortData[0], &DeviceExtension->PortData[NumberOfEntries], (DeviceExtension->InputCount - NumberOfEntries) * sizeof(MOUSE_INPUT_DATA)); } DeviceExtension->InputCount -= NumberOfEntries; Irp->IoStatus.Information = NumberOfEntries * sizeof(MOUSE_INPUT_DATA); } /* Go to next packet and complete this request */ Irp->IoStatus.Status = Status; (VOID)IoSetCancelRoutine(Irp, NULL); IoCompleteRequest(Irp, IO_MOUSE_INCREMENT); DeviceExtension->PendingIrp = NULL; } else { IoAcquireCancelSpinLock(&OldIrql); if (Irp->Cancel) { DeviceExtension->PendingIrp = NULL; Status = STATUS_CANCELLED; } else { IoMarkIrpPending(Irp); DeviceExtension->PendingIrp = Irp; (VOID)IoSetCancelRoutine(Irp, ClassCancelRoutine); Status = STATUS_PENDING; } IoReleaseCancelSpinLock(OldIrql); } return Status; }