Source code of Windows XP (NT5)
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

/*++
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;
}