📄 ioctl.c
字号:
/*++
Copyright (c) 1991, 1992, 1993 Microsoft Corporation
Module Name:
ioctl.c
Abstract:
This module contains the ioctl dispatcher as well as a couple
of routines that are generally just called in response to
ioctl calls.
Author:
Anthony V. Ercolano 26-Sep-1991
Environment:
Kernel mode
--*/
#include "precomp.h"
BOOLEAN
SerialGetModemUpdate(
IN PVOID Context
);
BOOLEAN
SerialGetCommStatus(
IN PVOID Context
);
VOID
SerialGetProperties(
IN PSERIAL_DEVICE_EXTENSION Extension,
IN PSERIAL_COMMPROP Properties
);
BOOLEAN
SerialSetEscapeChar(
IN PVOID Context
);
#ifdef ALLOC_PRAGMA
//
// Locked during PnP operations and while open
//
#pragma alloc_text(PAGESER,SerialSetBaud)
#pragma alloc_text(PAGESER,SerialSetLineControl)
#pragma alloc_text(PAGESER,SerialIoControl)
#pragma alloc_text(PAGESER,SerialSetChars)
#pragma alloc_text(PAGESER,SerialGetModemUpdate)
#pragma alloc_text(PAGESER,SerialGetCommStatus)
#pragma alloc_text(PAGESER,SerialGetProperties)
#pragma alloc_text(PAGESER,SerialSetEscapeChar)
#pragma alloc_text(PAGESER,SerialGetStats)
#pragma alloc_text(PAGESER,SerialClearStats)
#pragma alloc_text(PAGESER, SerialSetMCRContents)
#pragma alloc_text(PAGESER, SerialGetMCRContents)
#pragma alloc_text(PAGESER, SerialSetFCRContents)
#pragma alloc_text(PAGESER, SerialInternalIoControl)
#endif
BOOLEAN
SerialGetStats(
IN PVOID Context
)
/*++
Routine Description:
In sync with the interrpt service routine (which sets the perf stats)
return the perf stats to the caller.
Arguments:
Context - Pointer to a the irp.
Return Value:
This routine always returns FALSE.
--*/
{
PIO_STACK_LOCATION irpSp = IoGetCurrentIrpStackLocation((PIRP)Context);
PSERIAL_DEVICE_EXTENSION extension = irpSp->DeviceObject->DeviceExtension;
PSERIALPERF_STATS sp = ((PIRP)Context)->AssociatedIrp.SystemBuffer;
SERIAL_LOCKED_PAGED_CODE();
*sp = extension->PerfStats;
return FALSE;
}
BOOLEAN
SerialClearStats(
IN PVOID Context
)
/*++
Routine Description:
In sync with the interrpt service routine (which sets the perf stats)
clear the perf stats.
Arguments:
Context - Pointer to a the extension.
Return Value:
This routine always returns FALSE.
--*/
{
SERIAL_LOCKED_PAGED_CODE();
RtlZeroMemory(
&((PSERIAL_DEVICE_EXTENSION)Context)->PerfStats,
sizeof(SERIALPERF_STATS)
);
RtlZeroMemory(&((PSERIAL_DEVICE_EXTENSION)Context)->WmiPerfData,
sizeof(SERIAL_WMI_PERF_DATA));
return FALSE;
}
BOOLEAN
SerialSetChars(
IN PVOID Context
)
/*++
Routine Description:
This routine is used to set the special characters for the
driver.
Arguments:
Context - Pointer to a structure that contains a pointer to
the device extension and a pointer to a special characters
structure.
Return Value:
This routine always returns FALSE.
--*/
{
((PSERIAL_IOCTL_SYNC)Context)->Extension->SpecialChars =
*((PSERIAL_CHARS)(((PSERIAL_IOCTL_SYNC)Context)->Data));
SERIAL_LOCKED_PAGED_CODE();
return FALSE;
}
BOOLEAN
SerialSetBaud(
IN PVOID Context
)
/*++
Routine Description:
This routine is used to set the baud rate of the device.
Arguments:
Context - Pointer to a structure that contains a pointer to
the device extension and what should be the current
baud rate.
Return Value:
This routine always returns FALSE.
--*/
{
PSERIAL_DEVICE_EXTENSION Extension = ((PSERIAL_IOCTL_SYNC)Context)->Extension;
USHORT Appropriate = PtrToUshort(((PSERIAL_IOCTL_SYNC)Context)->Data);
SERIAL_LOCKED_PAGED_CODE();
WRITE_DIVISOR_LATCH(
Extension->Controller,
Appropriate
);
return FALSE;
}
BOOLEAN
SerialSetLineControl(
IN PVOID Context
)
/*++
Routine Description:
This routine is used to set the buad rate of the device.
Arguments:
Context - Pointer to the device extension.
Return Value:
This routine always returns FALSE.
--*/
{
PSERIAL_DEVICE_EXTENSION Extension = Context;
SERIAL_LOCKED_PAGED_CODE();
WRITE_LINE_CONTROL(
Extension->Controller,
Extension->LineControl
);
return FALSE;
}
BOOLEAN
SerialGetModemUpdate(
IN PVOID Context
)
/*++
Routine Description:
This routine is simply used to call the interrupt level routine
that handles modem status update.
Arguments:
Context - Pointer to a structure that contains a pointer to
the device extension and a pointer to a ulong.
Return Value:
This routine always returns FALSE.
--*/
{
PSERIAL_DEVICE_EXTENSION Extension = ((PSERIAL_IOCTL_SYNC)Context)->Extension;
ULONG *Result = (ULONG *)(((PSERIAL_IOCTL_SYNC)Context)->Data);
SERIAL_LOCKED_PAGED_CODE();
*Result = SerialHandleModemUpdate(
Extension,
FALSE
);
return FALSE;
}
BOOLEAN
SerialSetMCRContents(IN PVOID Context)
/*++
Routine Description:
This routine is simply used to set the contents of the MCR
Arguments:
Context - Pointer to a structure that contains a pointer to
the device extension and a pointer to a ulong.
Return Value:
This routine always returns FALSE.
--*/
{
PSERIAL_DEVICE_EXTENSION Extension = ((PSERIAL_IOCTL_SYNC)Context)->Extension;
ULONG *Result = (ULONG *)(((PSERIAL_IOCTL_SYNC)Context)->Data);
SERIAL_LOCKED_PAGED_CODE();
//
// This is severe casting abuse!!!
//
WRITE_MODEM_CONTROL(Extension->Controller, (UCHAR)PtrToUlong(Result));
return FALSE;
}
BOOLEAN
SerialGetMCRContents(IN PVOID Context)
/*++
Routine Description:
This routine is simply used to get the contents of the MCR
Arguments:
Context - Pointer to a structure that contains a pointer to
the device extension and a pointer to a ulong.
Return Value:
This routine always returns FALSE.
--*/
{
PSERIAL_DEVICE_EXTENSION Extension = ((PSERIAL_IOCTL_SYNC)Context)->Extension;
ULONG *Result = (ULONG *)(((PSERIAL_IOCTL_SYNC)Context)->Data);
SERIAL_LOCKED_PAGED_CODE();
*Result = READ_MODEM_CONTROL(Extension->Controller);
return FALSE;
}
BOOLEAN
SerialSetFCRContents(IN PVOID Context)
/*++
Routine Description:
This routine is simply used to set the contents of the FCR
Arguments:
Context - Pointer to a structure that contains a pointer to
the device extension and a pointer to a ulong.
Return Value:
This routine always returns FALSE.
--*/
{
PSERIAL_DEVICE_EXTENSION Extension = ((PSERIAL_IOCTL_SYNC)Context)->Extension;
ULONG *Result = (ULONG *)(((PSERIAL_IOCTL_SYNC)Context)->Data);
SERIAL_LOCKED_PAGED_CODE();
//
// This is severe casting abuse!!!
//
WRITE_FIFO_CONTROL(Extension->Controller, (UCHAR)*Result);
return FALSE;
}
BOOLEAN
SerialGetCommStatus(
IN PVOID Context
)
/*++
Routine Description:
This is used to get the current state of the serial driver.
Arguments:
Context - Pointer to a structure that contains a pointer to
the device extension and a pointer to a serial status
record.
Return Value:
This routine always returns FALSE.
--*/
{
PSERIAL_DEVICE_EXTENSION Extension = ((PSERIAL_IOCTL_SYNC)Context)->Extension;
PSERIAL_STATUS Stat = ((PSERIAL_IOCTL_SYNC)Context)->Data;
SERIAL_LOCKED_PAGED_CODE();
Stat->Errors = Extension->ErrorWord;
Extension->ErrorWord = 0;
//
// Eof isn't supported in binary mode
//
Stat->EofReceived = FALSE;
Stat->AmountInInQueue = Extension->CharsInInterruptBuffer;
Stat->AmountInOutQueue = Extension->TotalCharsQueued;
if (Extension->WriteLength) {
//
// By definition if we have a writelength the we have
// a current write irp.
//
ASSERT(Extension->CurrentWriteIrp);
ASSERT(Stat->AmountInOutQueue >= Extension->WriteLength);
Stat->AmountInOutQueue -=
IoGetCurrentIrpStackLocation(Extension->CurrentWriteIrp)
->Parameters.Write.Length - (Extension->WriteLength);
}
Stat->WaitForImmediate = Extension->TransmitImmediate;
Stat->HoldReasons = 0;
if (Extension->TXHolding) {
if (Extension->TXHolding & SERIAL_TX_CTS) {
Stat->HoldReasons |= SERIAL_TX_WAITING_FOR_CTS;
}
if (Extension->TXHolding & SERIAL_TX_DSR) {
Stat->HoldReasons |= SERIAL_TX_WAITING_FOR_DSR;
}
if (Extension->TXHolding & SERIAL_TX_DCD) {
Stat->HoldReasons |= SERIAL_TX_WAITING_FOR_DCD;
}
if (Extension->TXHolding & SERIAL_TX_XOFF) {
Stat->HoldReasons |= SERIAL_TX_WAITING_FOR_XON;
}
if (Extension->TXHolding & SERIAL_TX_BREAK) {
Stat->HoldReasons |= SERIAL_TX_WAITING_ON_BREAK;
}
}
if (Extension->RXHolding & SERIAL_RX_DSR) {
Stat->HoldReasons |= SERIAL_RX_WAITING_FOR_DSR;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -