📄 ioctl.c
字号:
}
if ((NewTimeouts->ReadIntervalTimeout == MAXULONG) &&
(NewTimeouts->ReadTotalTimeoutMultiplier == MAXULONG) &&
(NewTimeouts->ReadTotalTimeoutConstant == MAXULONG)) {
status = STATUS_INVALID_PARAMETER;
break;
}
deviceExtension->Timeouts.ReadIntervalTimeout = NewTimeouts->ReadIntervalTimeout;
deviceExtension->Timeouts.ReadTotalTimeoutMultiplier =NewTimeouts->ReadTotalTimeoutMultiplier;
deviceExtension->Timeouts.ReadTotalTimeoutConstant = NewTimeouts->ReadTotalTimeoutConstant;
deviceExtension->Timeouts.WriteTotalTimeoutMultiplier = NewTimeouts->WriteTotalTimeoutMultiplier;
deviceExtension->Timeouts.WriteTotalTimeoutConstant = NewTimeouts->WriteTotalTimeoutConstant;
DebugPrint(("Set_Timeouts\n"));
status = STATUS_SUCCESS;
break;
}
case IOCTL_SERIAL_GET_TIMEOUTS:
{
if ( IrpStack->Parameters.DeviceIoControl.OutputBufferLength <
sizeof(SERIAL_TIMEOUTS)) {
status = STATUS_BUFFER_TOO_SMALL;
break;
}
DebugPrint(("-- IOCTL_SERIAL_GET_TIMEOUTS --\n"));
*((PSERIAL_TIMEOUTS)Irp->AssociatedIrp.SystemBuffer) = deviceExtension->Timeouts;
info = sizeof( SERIAL_TIMEOUTS );
status = STATUS_SUCCESS;
break;
}
case IOCTL_SERIAL_SET_CHARS:
{
PSERIAL_CHARS NewChars =
((PSERIAL_CHARS)(Irp->AssociatedIrp.SystemBuffer));
DebugPrint(("-- IOCTL_SERIAL_SET_CHARS --\n"));
if ( IrpStack->Parameters.DeviceIoControl.InputBufferLength <
( sizeof( UCHAR ) * 6 ) ) {
status = STATUS_BUFFER_TOO_SMALL;
break;
}else /*if( NewChars->XonChar == NewChars->XoffChar ){
status = STATUS_INVALID_PARAMETER;
break;
}else */{
deviceExtension->SpecialChars.EofChar = NewChars->EofChar;
deviceExtension->SpecialChars.ErrorChar = NewChars->ErrorChar;
deviceExtension->SpecialChars.BreakChar = NewChars->BreakChar;
deviceExtension->SpecialChars.EventChar = NewChars->EventChar;
deviceExtension->SpecialChars.XonChar = NewChars->XonChar;
deviceExtension->SpecialChars.XoffChar = NewChars->XoffChar;
DebugPrint(("SetChars: %2x %2x %2x %2x %2x %2x\n", NewChars->EofChar, NewChars->ErrorChar, NewChars->BreakChar, NewChars->EventChar, NewChars->XonChar, NewChars->XoffChar ));
status = STATUS_SUCCESS;
}
break;
}
case IOCTL_SERIAL_GET_CHARS:
{
PSERIAL_CHARS NewChars = ((PSERIAL_CHARS)(Irp->AssociatedIrp.SystemBuffer));
DebugPrint(("-- IOCTL_SERIAL_GET_CHARS --\n"));
if( IrpStack->Parameters.DeviceIoControl.OutputBufferLength <
sizeof(SERIAL_CHARS)) {
status = STATUS_BUFFER_TOO_SMALL;
break;
}
((PSERIAL_CHARS)Irp->AssociatedIrp.SystemBuffer)->XonChar = deviceExtension->SpecialChars.XonChar;
((PSERIAL_CHARS)Irp->AssociatedIrp.SystemBuffer)->XoffChar = deviceExtension->SpecialChars.XoffChar;
((PSERIAL_CHARS)Irp->AssociatedIrp.SystemBuffer)->EofChar = deviceExtension->SpecialChars.EofChar;
((PSERIAL_CHARS)Irp->AssociatedIrp.SystemBuffer)->ErrorChar = deviceExtension->SpecialChars.ErrorChar;
((PSERIAL_CHARS)Irp->AssociatedIrp.SystemBuffer)->BreakChar = deviceExtension->SpecialChars.BreakChar;
((PSERIAL_CHARS)Irp->AssociatedIrp.SystemBuffer)->EventChar = deviceExtension->SpecialChars.EventChar;
DebugPrint(("GetChars: %2x %2x %2x %2x %2x %2x\n", NewChars->EofChar, NewChars->ErrorChar, NewChars->BreakChar, NewChars->EventChar, NewChars->XonChar, NewChars->XoffChar ));
info = sizeof( SERIAL_CHARS );
status = STATUS_SUCCESS;
break;
}
case IOCTL_SERIAL_SET_DTR:
{
DebugPrint(("-- IOCTL_SERIAL_SET_DTR --\n"));
if (( deviceExtension->HandFlow.ControlHandShake & SERIAL_DTR_MASK) == SERIAL_DTR_HANDSHAKE){
DebugPrint(("IOCTL_SERIAL_SET_DTR error: Current ControlHandShake 0x%x\n", deviceExtension->HandFlow.ControlHandShake ));
status = STATUS_INVALID_PARAMETER;
}
info = 0;
//*(PULONG)Irp->AssociatedIrp.SystemBuffer = 0;
status = STATUS_SUCCESS;
break;
}
case IOCTL_SERIAL_CLR_DTR:
{
DebugPrint(("-- IOCTL_SERIAL_CLR_DTR --\n"));
if (( deviceExtension->HandFlow.ControlHandShake & SERIAL_DTR_MASK) == SERIAL_DTR_HANDSHAKE){
DebugPrint(("IOCTL_SERIAL_CLR_DTR error\n"));
status = STATUS_INVALID_PARAMETER;
}
//*(PULONG)Irp->AssociatedIrp.SystemBuffer = 0;
status = STATUS_SUCCESS;
break;
}
case IOCTL_SERIAL_SET_RTS:
{
DebugPrint(("-- IOCTL_SERIAL_SET_RTS --\n"));
if (( deviceExtension->HandFlow.FlowReplace & SERIAL_RTS_MASK) == SERIAL_RTS_HANDSHAKE ){
DebugPrint(("IOCTL_SERIAL_SET_RTS error\n"));
status = STATUS_INVALID_PARAMETER;
}
status = STATUS_SUCCESS;
break;
}
case IOCTL_SERIAL_SET_QUEUE_SIZE:
{
PSERIAL_QUEUE_SIZE Rs = ( PSERIAL_QUEUE_SIZE )Irp->AssociatedIrp.SystemBuffer;
DebugPrint(("-- IOCTL_SERIAL_SET_QUEUE_SIZE --\n"));
if( IrpStack->Parameters.DeviceIoControl.InputBufferLength < sizeof(SERIAL_QUEUE_SIZE)) {
status = STATUS_BUFFER_TOO_SMALL;
break;
}
if( Rs->InSize > deviceExtension->BufferSize ){
deviceExtension->BufferSize = Rs->InSize;
}
DebugPrint(("Buffersize : %d\n", deviceExtension->BufferSize ));
status = STATUS_SUCCESS;
break;
}
case IOCTL_SERIAL_GET_HANDFLOW:
{
PSERIAL_HANDFLOW HandFlow;
DebugPrint(("-- IOCTL_SERIAL_GET_HANDFLOW --\n"));
if ( IrpStack->Parameters.DeviceIoControl.OutputBufferLength <
sizeof(SERIAL_HANDFLOW)) {
status = STATUS_BUFFER_TOO_SMALL;
break;
}
HandFlow = (PSERIAL_HANDFLOW)Irp->AssociatedIrp.SystemBuffer;
HandFlow->ControlHandShake = deviceExtension->HandFlow.ControlHandShake;
HandFlow->FlowReplace = deviceExtension->HandFlow.FlowReplace;
HandFlow->XonLimit = deviceExtension->HandFlow.XonLimit;
HandFlow->XoffLimit = deviceExtension->HandFlow.XoffLimit;
DebugPrint(("ControlHandShake: %d FlowReplace: %d XonLimit: %d XoffLimit: %d\n", HandFlow->ControlHandShake, HandFlow->FlowReplace, HandFlow->XonLimit, HandFlow->XoffLimit));
info = sizeof(SERIAL_HANDFLOW);
status = STATUS_SUCCESS;
break;
}
case IOCTL_SERIAL_SET_HANDFLOW:
{
PSERIAL_HANDFLOW HandFlow = Irp->AssociatedIrp.SystemBuffer;
if ( IrpStack->Parameters.DeviceIoControl.InputBufferLength <
sizeof(SERIAL_HANDFLOW)) {
status = STATUS_BUFFER_TOO_SMALL;
break;
}
DebugPrint(("-- IOCTL_SERIAL_SET_HANDFLOW --\n"));
if (HandFlow->ControlHandShake & SERIAL_CONTROL_INVALID) {
status = STATUS_INVALID_PARAMETER;
break;
}
if (HandFlow->FlowReplace & SERIAL_FLOW_INVALID) {
status = STATUS_INVALID_PARAMETER;
break;
}
if ((HandFlow->ControlHandShake & SERIAL_DTR_MASK) ==
SERIAL_DTR_MASK) {
status = STATUS_INVALID_PARAMETER;
break;
}
if ((HandFlow->XonLimit < 0) ||
((ULONG)HandFlow->XonLimit > deviceExtension->BufferSize)) {
DebugPrint(("XonLimit( %d ) > BufferSize\n", ((ULONG)HandFlow->XonLimit )));
status = STATUS_INVALID_PARAMETER;
break;
}
if ((HandFlow->XoffLimit < 0) ||
((ULONG)HandFlow->XoffLimit > deviceExtension->BufferSize)) {
DebugPrint(("XoffLimit( %d ) > BufferSize\n", ((ULONG)HandFlow->XoffLimit )));
status = STATUS_INVALID_PARAMETER;
break;
}
deviceExtension->HandFlow.ControlHandShake = HandFlow->ControlHandShake;
deviceExtension->HandFlow.FlowReplace = HandFlow->FlowReplace;
deviceExtension->HandFlow.XonLimit = HandFlow->XonLimit;
deviceExtension->HandFlow.XoffLimit = HandFlow->XoffLimit;
DebugPrint(("Set_HandFlow OK\n"));
status = STATUS_SUCCESS;
break;
}
case IOCTL_SERIAL_CONFIG_SIZE:
{
DebugPrint(("-- IOCTL_SERIAL_CONFIG_SIZE --\n"));
if( IrpStack->Parameters.DeviceIoControl.OutputBufferLength < sizeof( ULONG ) ){
status = STATUS_BUFFER_TOO_SMALL;
break;
}
info = sizeof( ULONG );
*(PULONG)Irp->AssociatedIrp.SystemBuffer = 0;
status = STATUS_SUCCESS;
break;
}
case IOCTL_SERIAL_IMMEDIATE_CHAR:
DebugPrint(("-- IOCTL_SERIAL_IMMEDIATE_CHAR --\n"));
break;
case IOCTL_SERIAL_GET_STATS:
DebugPrint(("-- IOCTL_SERIAL_GET_STATS --\n"));
break;
case IOCTL_SERIAL_CLEAR_STATS:
DebugPrint(("-- IOCTL_SERIAL_CLEAR_STATS --\n"));
break;
case IOCTL_SERIAL_GET_PROPERTIES:
DebugPrint(("-- IOCTL_SERIAL_GET_PROPERTIES --\n"));
break;
case IOCTL_SERIAL_XOFF_COUNTER:
DebugPrint(("-- IOCTL_SERIAL_XOFF_COUNTER --\n"));
break;
case IOCTL_SERIAL_LSRMST_INSERT:
DebugPrint(("-- IOCTL_SERIAL_LSRMST_INSERT --\n"));
break;
case IOCTL_SERIAL_GET_MODEMSTATUS:
DebugPrint(("-- IOCTL_SERIAL_GET_MODEMSTATUS --\n"));
break;
case IOCTL_SERIAL_GET_DTRRTS:
DebugPrint(("-- IOCTL_SERIAL_GET_DTRRTS --\n"));
break;
case IOCTL_SERIAL_CLR_RTS:
DebugPrint(("-- IOCTL_SERIAL_CLR_RTS --\n"));
break;
case IOCTL_SERIAL_SET_XOFF:
DebugPrint(("-- IOCTL_SERIAL_SET_XOFF --\n"));
break;
case IOCTL_SERIAL_SET_XON:
DebugPrint(("-- IOCTL_SERIAL_SET_XON --\n"));
break;
case IOCTL_SERIAL_SET_BREAK_ON:
DebugPrint(("-- IOCTL_SERIAL_SET_BREAK_ON --\n"));
break;
case IOCTL_SERIAL_SET_BREAK_OFF:
DebugPrint(("-- IOCTL_SERIAL_SET_BREAK_OFF --\n"));
break;
case IOCTL_SERIAL_RESET_DEVICE:
DebugPrint(("-- IOCTL_SERIAL_RESET_DEVICE --\n"));
break;
case IOCTL_SERIAL_GET_MODEM_CONTROL:
DebugPrint(("-- IOCTL_SERIAL_GET_MODEM_CONTROL --\n"));
break;
case IOCTL_SERIAL_SET_MODEM_CONTROL:
DebugPrint(("-- IOCTL_SERIAL_SET_MODEM_CONTROL --\n"));
break;
case IOCTL_SERIAL_SET_FIFO_CONTROL:
DebugPrint(("-- IOCTL_SERIAL_SET_FIFO_CONTROL --\n"));
break;
default:
status=STATUS_INVALID_DEVICE_REQUEST;
break;
}
status = CompleteRequest( Irp, status, info );
SampleIoDecrement( deviceExtension );
return status;
}
NTSTATUS CreateDosName( IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp)
/*++
Routine Description:
Create Dosname.
Arguments:
DeviceObject - pointer to a device object.
Irp - pointer to an I/O Request Packet.
Return Value:
NT status code
--*/
{
LONG ComX;
PIO_STACK_LOCATION IrpStack;
NTSTATUS status;
PDEVICE_EXTENSION deviceExtension;
deviceExtension = DeviceObject->DeviceExtension;
DebugPrint(("----- IOCTL_INIT_SETTING ----\n"));
IrpStack = IoGetCurrentIrpStackLocation(Irp);
if( IrpStack->Parameters.DeviceIoControl.InputBufferLength < sizeof( LONG ) ){
status = STATUS_BUFFER_TOO_SMALL;
return status;
}
ComX = *((PLONG)Irp->AssociatedIrp.SystemBuffer);
// 此处注意Dos名不要重复
if( ( ComX > 255 ) || ( ComX < 1 ) ){
status = STATUS_INVALID_PARAMETER;
return status;
}
if( !deviceExtension->CreatedSymbolicLink ){
status = SerialDoExternalNaming( deviceExtension, ComX);
}
return status;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -