You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
656 lines
13 KiB
656 lines
13 KiB
/*++
|
|
|
|
|
|
Copyright (c) 1997-1998 Microsoft Corporation, All Rights Reserved
|
|
|
|
Module Name:
|
|
|
|
wrapper.c
|
|
|
|
Abstract:
|
|
|
|
Wraps all IOCTL based requests into nice self contained functions
|
|
|
|
Environment:
|
|
|
|
Kernel mode only.
|
|
|
|
Notes:
|
|
|
|
Revision History:
|
|
|
|
--*/
|
|
|
|
#include "mouser.h"
|
|
#include "debug.h"
|
|
|
|
#ifdef ALLOC_PRAGMA
|
|
#pragma alloc_text(PAGE,SerialMouseSetFifo)
|
|
#pragma alloc_text(PAGE,SerialMouseGetLineCtrl)
|
|
#pragma alloc_text(PAGE,SerialMouseSetLineCtrl)
|
|
#pragma alloc_text(PAGE,SerialMouseGetModemCtrl)
|
|
#pragma alloc_text(PAGE,SerialMouseSetModemCtrl)
|
|
#pragma alloc_text(PAGE,SerialMouseGetBaudRate)
|
|
#pragma alloc_text(PAGE,SerialMouseSetBaudRate)
|
|
#pragma alloc_text(PAGE,SerialMouseReadChar)
|
|
#pragma alloc_text(PAGE,SerialMouseWriteChar)
|
|
#pragma alloc_text(PAGE,SerialMouseWriteString)
|
|
#endif // ALLOC_PRAGMA
|
|
|
|
//
|
|
// Constants
|
|
//
|
|
|
|
//
|
|
// unknown
|
|
//
|
|
NTSTATUS
|
|
SerialMouseSetFifo(
|
|
PDEVICE_EXTENSION DeviceExtension,
|
|
UCHAR Value
|
|
)
|
|
/*++
|
|
|
|
Routine Description:
|
|
|
|
Set the FIFO register.
|
|
|
|
Arguments:
|
|
|
|
Port - Pointer to the serial port.
|
|
|
|
Value - The FIFO control mask.
|
|
|
|
Return Value:
|
|
|
|
None.
|
|
|
|
--*/
|
|
{
|
|
ULONG fifo = Value;
|
|
IO_STATUS_BLOCK iosb;
|
|
KEVENT event;
|
|
NTSTATUS status;
|
|
|
|
Print(DeviceExtension, DBG_UART_TRACE, ("Fifo, enter\n"));
|
|
|
|
KeInitializeEvent(&event,
|
|
NotificationEvent,
|
|
FALSE);
|
|
|
|
status = SerialMouseIoSyncIoctlEx(
|
|
IOCTL_SERIAL_SET_FIFO_CONTROL,
|
|
DeviceExtension->TopOfStack,
|
|
&event,
|
|
&iosb,
|
|
&fifo,
|
|
sizeof(ULONG),
|
|
NULL,
|
|
0);
|
|
|
|
if (!NT_SUCCESS(iosb.Status)) {
|
|
status = iosb.Status;
|
|
}
|
|
|
|
if (!NT_SUCCESS(status)) {
|
|
Print(DeviceExtension, DBG_UART_ERROR, ("Fifo failed (%x)\n", status));
|
|
}
|
|
|
|
return status;
|
|
}
|
|
|
|
NTSTATUS
|
|
SerialMouseGetLineCtrl(
|
|
PDEVICE_EXTENSION DeviceExtension,
|
|
PSERIAL_LINE_CONTROL SerialLineControl
|
|
)
|
|
/*++
|
|
|
|
Routine Description:
|
|
|
|
Get the serial port line control register.
|
|
|
|
Arguments:
|
|
|
|
Port - Pointer to the serial port.
|
|
|
|
Return Value:
|
|
|
|
Serial port line control value.
|
|
|
|
--*/
|
|
{
|
|
IO_STATUS_BLOCK iosb;
|
|
KEVENT event;
|
|
NTSTATUS status;
|
|
|
|
Print(DeviceExtension, DBG_UART_TRACE, ("GetLineCtrl enter\n"));
|
|
|
|
KeInitializeEvent(&event,
|
|
NotificationEvent,
|
|
FALSE);
|
|
|
|
status = SerialMouseIoSyncIoctlEx(
|
|
IOCTL_SERIAL_GET_LINE_CONTROL,
|
|
DeviceExtension->TopOfStack,
|
|
&event,
|
|
&iosb,
|
|
NULL,
|
|
0,
|
|
SerialLineControl,
|
|
sizeof(SERIAL_LINE_CONTROL));
|
|
|
|
if (!NT_SUCCESS(iosb.Status)) {
|
|
status = iosb.Status;
|
|
}
|
|
|
|
if (!NT_SUCCESS(status)) {
|
|
Print(DeviceExtension, DBG_UART_ERROR,
|
|
("GetLineCtrl failed! (%x)\n", status));
|
|
}
|
|
|
|
Print(DeviceExtension, DBG_UART_TRACE,
|
|
("GetLineCtrl exit (%x)\n", status));
|
|
|
|
return status;
|
|
}
|
|
|
|
NTSTATUS
|
|
SerialMouseSetLineCtrl(
|
|
PDEVICE_EXTENSION DeviceExtension,
|
|
PSERIAL_LINE_CONTROL SerialLineControl
|
|
)
|
|
/*++
|
|
|
|
Routine Description:
|
|
|
|
Set the serial port line control register.
|
|
|
|
Arguments:
|
|
|
|
Port - Pointer to the serial port.
|
|
|
|
Value - New line control value.
|
|
|
|
Return Value:
|
|
|
|
Previous serial line control register value.
|
|
|
|
--*/
|
|
{
|
|
IO_STATUS_BLOCK iosb;
|
|
KEVENT event;
|
|
NTSTATUS status;
|
|
|
|
KeInitializeEvent(&event,
|
|
NotificationEvent,
|
|
FALSE);
|
|
|
|
status = SerialMouseIoSyncIoctlEx(
|
|
IOCTL_SERIAL_SET_LINE_CONTROL,
|
|
DeviceExtension->TopOfStack,
|
|
&event,
|
|
&iosb,
|
|
SerialLineControl,
|
|
sizeof(SERIAL_LINE_CONTROL),
|
|
NULL,
|
|
0);
|
|
|
|
if (!NT_SUCCESS(iosb.Status)) {
|
|
status = iosb.Status;
|
|
}
|
|
|
|
if (!NT_SUCCESS(status)) {
|
|
Print(DeviceExtension, DBG_UART_ERROR,
|
|
("SetLineCtrl failed (%x)\n", status));
|
|
}
|
|
|
|
Print(DeviceExtension, DBG_UART_TRACE,
|
|
("SetLineCtrl exit (%x)\n", status));
|
|
|
|
return status;
|
|
}
|
|
|
|
NTSTATUS
|
|
SerialMouseGetModemCtrl(
|
|
PDEVICE_EXTENSION DeviceExtension,
|
|
PULONG ModemCtrl
|
|
)
|
|
/*++
|
|
|
|
Routine Description:
|
|
|
|
Get the serial port modem control register.
|
|
|
|
Arguments:
|
|
|
|
Port - Pointer to the serial port.
|
|
|
|
Return Value:
|
|
|
|
Serial port modem control register value.
|
|
|
|
--*/
|
|
{
|
|
IO_STATUS_BLOCK iosb;
|
|
KEVENT event;
|
|
NTSTATUS status;
|
|
|
|
KeInitializeEvent(&event,
|
|
NotificationEvent,
|
|
FALSE);
|
|
|
|
status = SerialMouseIoSyncIoctlEx(
|
|
IOCTL_SERIAL_GET_MODEM_CONTROL,
|
|
DeviceExtension->TopOfStack,
|
|
&event,
|
|
&iosb,
|
|
NULL,
|
|
0,
|
|
ModemCtrl,
|
|
sizeof(ULONG));
|
|
|
|
if (!NT_SUCCESS(iosb.Status)) {
|
|
status = iosb.Status;
|
|
}
|
|
|
|
if (!NT_SUCCESS(status)) {
|
|
Print(DeviceExtension, DBG_UART_ERROR,
|
|
("GetModemCtrl failed! (%x)\n", status));
|
|
}
|
|
|
|
Print(DeviceExtension, DBG_UART_TRACE,
|
|
("GetModemCtrl exit (%x)\n", status));
|
|
|
|
return status;
|
|
}
|
|
|
|
//
|
|
// unknown
|
|
//
|
|
NTSTATUS
|
|
SerialMouseSetModemCtrl(
|
|
PDEVICE_EXTENSION DeviceExtension,
|
|
ULONG Value,
|
|
PULONG OldValue OPTIONAL
|
|
)
|
|
/*++
|
|
|
|
Routine Description:
|
|
|
|
Set the serial port modem control register.
|
|
|
|
Arguments:
|
|
|
|
Port - Pointer to the serial port.
|
|
|
|
Return Value:
|
|
|
|
Previous modem control register value.
|
|
|
|
--*/
|
|
{
|
|
IO_STATUS_BLOCK iosb;
|
|
KEVENT event;
|
|
NTSTATUS status;
|
|
|
|
Print(DeviceExtension, DBG_UART_TRACE, ("SetModemCtrl enter\n"));
|
|
|
|
if (ARGUMENT_PRESENT(OldValue)) {
|
|
SerialMouseGetModemCtrl(DeviceExtension, OldValue);
|
|
}
|
|
|
|
KeInitializeEvent(&event,
|
|
NotificationEvent,
|
|
FALSE);
|
|
|
|
status = SerialMouseIoSyncIoctlEx(
|
|
IOCTL_SERIAL_SET_MODEM_CONTROL,
|
|
DeviceExtension->TopOfStack,
|
|
&event,
|
|
&iosb,
|
|
&Value,
|
|
sizeof(ULONG),
|
|
NULL,
|
|
0);
|
|
|
|
if (!NT_SUCCESS(iosb.Status)) {
|
|
status = iosb.Status;
|
|
}
|
|
|
|
if (!NT_SUCCESS(status)) {
|
|
Print(DeviceExtension, DBG_UART_ERROR,
|
|
("SetModemCtrl failed! (%x)\n", status));
|
|
}
|
|
|
|
Print(DeviceExtension, DBG_UART_TRACE,
|
|
("SetModemCtrl exit (%x)\n", status));
|
|
|
|
return status;
|
|
}
|
|
|
|
NTSTATUS
|
|
SerialMouseGetBaudRate(
|
|
PDEVICE_EXTENSION DeviceExtension,
|
|
PULONG BaudRate
|
|
)
|
|
/*++
|
|
|
|
Routine Description:
|
|
|
|
Get the serial port baud rate setting.
|
|
|
|
Arguments:
|
|
|
|
Port - Pointer to the serial port.
|
|
|
|
BaudClock - The external frequency driving the serial chip.
|
|
|
|
Return Value:
|
|
|
|
Serial port baud rate.
|
|
|
|
--*/
|
|
{
|
|
SERIAL_BAUD_RATE sbr;
|
|
IO_STATUS_BLOCK iosb;
|
|
KEVENT event;
|
|
NTSTATUS status;
|
|
|
|
Print(DeviceExtension, DBG_UART_TRACE, ("GetBaud enter\n"));
|
|
|
|
KeInitializeEvent(&event,
|
|
NotificationEvent,
|
|
FALSE);
|
|
|
|
status = SerialMouseIoSyncIoctlEx(
|
|
IOCTL_SERIAL_GET_BAUD_RATE,
|
|
DeviceExtension->TopOfStack,
|
|
&event,
|
|
&iosb,
|
|
NULL,
|
|
0,
|
|
&sbr,
|
|
sizeof(SERIAL_BAUD_RATE));
|
|
|
|
if (!NT_SUCCESS(iosb.Status)) {
|
|
status = iosb.Status;
|
|
}
|
|
|
|
if (!NT_SUCCESS(status)) {
|
|
Print(DeviceExtension, DBG_UART_ERROR,
|
|
("GetBaud failed (%x)\n", status));
|
|
}
|
|
else {
|
|
*BaudRate = sbr.BaudRate;
|
|
}
|
|
|
|
Print(DeviceExtension, DBG_UART_TRACE,
|
|
("GetBaud exit (%x)\n", status));
|
|
return status;
|
|
}
|
|
|
|
NTSTATUS
|
|
SerialMouseSetBaudRate(
|
|
PDEVICE_EXTENSION DeviceExtension,
|
|
ULONG BaudRate
|
|
)
|
|
/*++
|
|
|
|
Routine Description:
|
|
|
|
Set the serial port baud rate.
|
|
|
|
Arguments:
|
|
|
|
Port - Pointer to the serial port.
|
|
|
|
BaudRate - New serial port baud rate.
|
|
|
|
BaudClock - The external frequency driving the serial chip.
|
|
|
|
Return Value:
|
|
|
|
None.
|
|
|
|
--*/
|
|
{
|
|
SERIAL_BAUD_RATE sbr;
|
|
IO_STATUS_BLOCK iosb;
|
|
KEVENT event;
|
|
NTSTATUS status;
|
|
|
|
KeInitializeEvent(&event,
|
|
NotificationEvent,
|
|
FALSE);
|
|
|
|
sbr.BaudRate = BaudRate;
|
|
status = SerialMouseIoSyncIoctlEx(
|
|
IOCTL_SERIAL_SET_BAUD_RATE,
|
|
DeviceExtension->TopOfStack,
|
|
&event,
|
|
&iosb,
|
|
&sbr,
|
|
sizeof(SERIAL_BAUD_RATE),
|
|
NULL,
|
|
0);
|
|
|
|
if (!NT_SUCCESS(iosb.Status)) {
|
|
status = iosb.Status;
|
|
}
|
|
|
|
if (!NT_SUCCESS(status)) {
|
|
Print(DeviceExtension, DBG_UART_ERROR,
|
|
("SetBaud failed! (%x)\n", status));
|
|
}
|
|
else {
|
|
Print(DeviceExtension, DBG_UART_INFO, ("BaudRate: %d\n", BaudRate));
|
|
}
|
|
|
|
return status;
|
|
}
|
|
|
|
NTSTATUS
|
|
SerialMouseReadChar(
|
|
PDEVICE_EXTENSION DeviceExtension,
|
|
PUCHAR Value
|
|
)
|
|
/*++
|
|
|
|
Routine Description:
|
|
|
|
Read a character from the serial port. Waits until a character has
|
|
been read or the timeout value is reached.
|
|
|
|
Arguments:
|
|
|
|
Port - Pointer to the serial port.
|
|
|
|
Value - The character read from the serial port input buffer.
|
|
|
|
Timeout - The timeout value in milliseconds for the read.
|
|
|
|
Return Value:
|
|
|
|
TRUE if a character has been read, FALSE if a timeout occured.
|
|
|
|
--*/
|
|
{
|
|
NTSTATUS status;
|
|
USHORT actual;
|
|
|
|
Print(DeviceExtension, DBG_UART_TRACE, ("ReadChar enter\n"));
|
|
|
|
status =
|
|
SerialMouseReadSerialPort(DeviceExtension, Value, 1, &actual);
|
|
|
|
if (!NT_SUCCESS(status)) {
|
|
Print(DeviceExtension, DBG_UART_ERROR,
|
|
("ReadChar failed! (%x)\n", status));
|
|
}
|
|
else if (actual != 1) {
|
|
status = STATUS_UNSUCCESSFUL;
|
|
}
|
|
else {
|
|
Print(DeviceExtension, DBG_UART_NOISE,
|
|
("ReadChar read %x (actual = %d)\n", (ULONG) *Value, actual));
|
|
}
|
|
|
|
Print(DeviceExtension, DBG_UART_TRACE, ("ReadChar exit (%x)\n", status));
|
|
|
|
return status;
|
|
}
|
|
|
|
NTSTATUS
|
|
SerialMouseFlushReadBuffer(
|
|
PDEVICE_EXTENSION DeviceExtension
|
|
)
|
|
/*++
|
|
|
|
Routine Description:
|
|
|
|
Flush the serial port input buffer.
|
|
|
|
Arguments:
|
|
|
|
Port - Pointer to the serial port.
|
|
|
|
Return Value:
|
|
|
|
TRUE.
|
|
|
|
--*/
|
|
{
|
|
ULONG bits = SERIAL_PURGE_RXCLEAR;
|
|
NTSTATUS status;
|
|
KEVENT event;
|
|
IO_STATUS_BLOCK iosb;
|
|
|
|
Print(DeviceExtension, DBG_UART_TRACE, ("FlushReadBuffer enter\n"));
|
|
|
|
KeInitializeEvent(&event,
|
|
NotificationEvent,
|
|
FALSE);
|
|
|
|
status = SerialMouseIoSyncIoctlEx(
|
|
IOCTL_SERIAL_PURGE,
|
|
DeviceExtension->TopOfStack,
|
|
&event,
|
|
&iosb,
|
|
&bits,
|
|
sizeof(ULONG),
|
|
NULL,
|
|
0);
|
|
|
|
if (!NT_SUCCESS(iosb.Status)) {
|
|
status = iosb.Status;
|
|
}
|
|
|
|
if (!NT_SUCCESS(status)) {
|
|
Print(DeviceExtension, DBG_UART_ERROR,
|
|
("FlushReadBuffer failed! (%x)\n", status));
|
|
}
|
|
|
|
Print(DeviceExtension, DBG_UART_TRACE,
|
|
("FlushReadBuffer exit (%x)\n", status));
|
|
|
|
return status;
|
|
}
|
|
|
|
NTSTATUS
|
|
SerialMouseWriteChar(
|
|
PDEVICE_EXTENSION DeviceExtension,
|
|
UCHAR Value
|
|
)
|
|
/*++
|
|
|
|
Routine Description:
|
|
|
|
Write a character to a serial port. Make sure the transmit buffer
|
|
is empty before we write there.
|
|
|
|
Arguments:
|
|
|
|
Port - Pointer to the serial port.
|
|
|
|
Value - Value to write to the serial port.
|
|
|
|
Return Value:
|
|
|
|
TRUE.
|
|
|
|
--*/
|
|
{
|
|
IO_STATUS_BLOCK iosb;
|
|
NTSTATUS status;
|
|
|
|
Print(DeviceExtension, DBG_UART_TRACE, ("WriteChar enter\n"));
|
|
|
|
status = SerialMouseWriteSerialPort(
|
|
DeviceExtension,
|
|
&Value,
|
|
1,
|
|
&iosb);
|
|
|
|
if (!NT_SUCCESS(iosb.Status)) {
|
|
status = iosb.Status;
|
|
}
|
|
|
|
if (!NT_SUCCESS(status)) {
|
|
Print(DeviceExtension, DBG_UART_ERROR,
|
|
("WriteChar failed! (%x)\n", status));
|
|
}
|
|
|
|
Print(DeviceExtension, DBG_UART_TRACE, ("WriteChar exit\n"));
|
|
|
|
return status;
|
|
}
|
|
|
|
NTSTATUS
|
|
SerialMouseWriteString(
|
|
PDEVICE_EXTENSION DeviceExtension,
|
|
PSZ Buffer
|
|
)
|
|
/*++
|
|
|
|
Routine Description:
|
|
|
|
Write a zero-terminated string to the serial port.
|
|
|
|
Arguments:
|
|
|
|
Port - Pointer to the serial port.
|
|
|
|
Buffer - Pointer to a zero terminated string to write to
|
|
the serial port.
|
|
|
|
Return Value:
|
|
|
|
TRUE.
|
|
|
|
--*/
|
|
{
|
|
IO_STATUS_BLOCK iosb;
|
|
NTSTATUS status;
|
|
|
|
Print(DeviceExtension, DBG_UART_TRACE, ("WriteString enter\n"));
|
|
|
|
status = SerialMouseWriteSerialPort(
|
|
DeviceExtension,
|
|
Buffer,
|
|
strlen(Buffer),
|
|
&iosb);
|
|
if (!NT_SUCCESS(iosb.Status)) {
|
|
status = iosb.Status;
|
|
}
|
|
|
|
if (!NT_SUCCESS(status)) {
|
|
Print(DeviceExtension, DBG_UART_ERROR,
|
|
("WriteString failed! (%x)\n", status));
|
|
}
|
|
|
|
Print(DeviceExtension, DBG_UART_TRACE,
|
|
("WriteString exit (%x)\n", status));
|
|
|
|
return status;
|
|
}
|