⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 ioctl.c

📁 好东东
💻 C
📖 第 1 页 / 共 2 页
字号:
				}
				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 + -