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)
14 SermouseInternalDeviceControl(
15 IN PDEVICE_OBJECT DeviceObject
,
18 PSERMOUSE_DEVICE_EXTENSION DeviceExtension
;
19 PIO_STACK_LOCATION Stack
;
22 DeviceExtension
= (PSERMOUSE_DEVICE_EXTENSION
)DeviceObject
->DeviceExtension
;
23 Stack
= IoGetCurrentIrpStackLocation(Irp
);
25 switch (Stack
->Parameters
.DeviceIoControl
.IoControlCode
)
27 case IOCTL_INTERNAL_MOUSE_CONNECT
:
29 TRACE_(SERMOUSE
, "IRP_MJ_INTERNAL_DEVICE_CONTROL / IOCTL_INTERNAL_MOUSE_CONNECT\n");
30 DeviceExtension
->ConnectData
=
31 *((PCONNECT_DATA
)Stack
->Parameters
.DeviceIoControl
.Type3InputBuffer
);
32 Status
= STATUS_SUCCESS
;
35 case IOCTL_INTERNAL_MOUSE_DISCONNECT
:
37 TRACE_(SERMOUSE
, "IRP_MJ_INTERNAL_DEVICE_CONTROL / IOCTL_INTERNAL_MOUSE_DISCONNECT\n");
39 /* Ask read loop to end */
40 KeSetEvent(&DeviceExtension
->StopWorkerThreadEvent
, (KPRIORITY
)0, FALSE
);
41 Status
= STATUS_SUCCESS
;
44 case IOCTL_MOUSE_QUERY_ATTRIBUTES
:
46 TRACE_(SERMOUSE
, "IRP_MJ_INTERNAL_DEVICE_CONTROL / IOCTL_MOUSE_QUERY_ATTRIBUTES\n");
47 if (Stack
->Parameters
.DeviceIoControl
.OutputBufferLength
>= sizeof(MOUSE_ATTRIBUTES
))
49 *(PMOUSE_ATTRIBUTES
)Irp
->AssociatedIrp
.SystemBuffer
=
50 DeviceExtension
->AttributesInformation
;
51 Irp
->IoStatus
.Information
= sizeof(MOUSE_ATTRIBUTES
);
52 Status
= STATUS_SUCCESS
;
56 Status
= STATUS_BUFFER_TOO_SMALL
;
62 WARN_(SERMOUSE
, "IRP_MJ_INTERNAL_DEVICE_CONTROL / unknown ioctl code 0x%lx\n",
63 Stack
->Parameters
.DeviceIoControl
.IoControlCode
);
65 Status
= STATUS_INVALID_DEVICE_REQUEST
;
70 Irp
->IoStatus
.Status
= Status
;
71 if (Status
== STATUS_PENDING
)
73 IoMarkIrpPending(Irp
);
74 IoStartPacket(DeviceObject
, Irp
, NULL
, NULL
);
78 IoCompleteRequest(Irp
, IO_NO_INCREMENT
);