2 * PROJECT: ReactOS Serial mouse driver
3 * LICENSE: GPL - See COPYING in the top level directory
4 * FILE: drivers/input/sermouse/fdo.c
5 * PURPOSE: IRP_MJ_INTERNAL_DEVICE_CONTROL operations
6 * PROGRAMMERS: Copyright 2005-2006 Hervé Poussineau (hpoussin@reactos.org)
12 SermouseInternalDeviceControl(
13 IN PDEVICE_OBJECT DeviceObject
,
16 PSERMOUSE_DEVICE_EXTENSION DeviceExtension
;
17 PIO_STACK_LOCATION Stack
;
20 DeviceExtension
= (PSERMOUSE_DEVICE_EXTENSION
)DeviceObject
->DeviceExtension
;
21 Stack
= IoGetCurrentIrpStackLocation(Irp
);
23 switch (Stack
->Parameters
.DeviceIoControl
.IoControlCode
)
25 case IOCTL_INTERNAL_MOUSE_CONNECT
:
27 TRACE_(SERMOUSE
, "IRP_MJ_INTERNAL_DEVICE_CONTROL / IOCTL_INTERNAL_MOUSE_CONNECT\n");
28 DeviceExtension
->ConnectData
=
29 *((PCONNECT_DATA
)Stack
->Parameters
.DeviceIoControl
.Type3InputBuffer
);
30 Status
= STATUS_SUCCESS
;
33 case IOCTL_INTERNAL_MOUSE_DISCONNECT
:
35 TRACE_(SERMOUSE
, "IRP_MJ_INTERNAL_DEVICE_CONTROL / IOCTL_INTERNAL_MOUSE_DISCONNECT\n");
37 /* Ask read loop to end */
38 KeSetEvent(&DeviceExtension
->StopWorkerThreadEvent
, (KPRIORITY
)0, FALSE
);
39 Status
= STATUS_SUCCESS
;
42 case IOCTL_MOUSE_QUERY_ATTRIBUTES
:
44 TRACE_(SERMOUSE
, "IRP_MJ_INTERNAL_DEVICE_CONTROL / IOCTL_MOUSE_QUERY_ATTRIBUTES\n");
45 if (Stack
->Parameters
.DeviceIoControl
.OutputBufferLength
>= sizeof(MOUSE_ATTRIBUTES
))
47 *(PMOUSE_ATTRIBUTES
)Irp
->AssociatedIrp
.SystemBuffer
=
48 DeviceExtension
->AttributesInformation
;
49 Irp
->IoStatus
.Information
= sizeof(MOUSE_ATTRIBUTES
);
50 Status
= STATUS_SUCCESS
;
54 Status
= STATUS_BUFFER_TOO_SMALL
;
60 WARN_(SERMOUSE
, "IRP_MJ_INTERNAL_DEVICE_CONTROL / unknown ioctl code 0x%lx\n",
61 Stack
->Parameters
.DeviceIoControl
.IoControlCode
);
63 Status
= STATUS_INVALID_DEVICE_REQUEST
;
68 Irp
->IoStatus
.Status
= Status
;
69 if (Status
== STATUS_PENDING
)
71 IoMarkIrpPending(Irp
);
72 IoStartPacket(DeviceObject
, Irp
, NULL
, NULL
);
76 IoCompleteRequest(Irp
, IO_NO_INCREMENT
);