Leaked source code of windows server 2003
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.
 
 
 
 
 
 

126 lines
3.5 KiB

/*************************************************************************
*
* mouse.c
*
* This module contains routines for managing the ICA mouse channel.
*
* Copyright 1998, Microsoft.
*
*
*************************************************************************/
/*
* Includes
*/
#include <precomp.h>
#pragma hdrstop
#include <ntddmou.h>
NTSTATUS
IcaDeviceControlMouse(
IN PICA_CHANNEL pChannel,
IN PIRP Irp,
IN PIO_STACK_LOCATION IrpSp
)
/*++
Routine Description:
This is the DeviceControl routine for the ICA mouse channel.
Arguments:
pChannel -- pointer to ICA_CHANNEL object
Irp - Pointer to I/O request packet
IrpSp - pointer to the stack location to use for this request.
Return Value:
NTSTATUS -- Indicates whether the request was successfully queued.
--*/
{
ULONG code;
SD_IOCTL SdIoctl;
PICA_STACK pStack;
NTSTATUS Status;
CLONG Method;
/*
* Extract the IOCTL control code and process the request.
*/
code = IrpSp->Parameters.DeviceIoControl.IoControlCode;
switch ( code ) {
#if 0 // no longer used
/*
* Special IOCTL to allow mouse input data to be fed
* into the mouse channel.
*/
case IOCTL_MOUSE_ICA_INPUT :
/*
* Make sure the input data is the correct size.
*/
if ( IrpSp->Parameters.DeviceIoControl.InputBufferLength %
sizeof(MOUSE_INPUT_DATA) )
return( STATUS_BUFFER_TOO_SMALL );
/*
* We need a stack object to pass to IcaChannelInputInternal.
* Any one will do so we grab the head of the stack list.
* (There MUST be one for this IOCTL to succeed.)
*/
IcaLockConnection( pChannel->pConnect );
if ( IsListEmpty( &pChannel->pConnect->StackHead ) ) {
IcaUnlockConnection( pChannel->pConnect );
return( STATUS_INVALID_DEVICE_REQUEST );
}
pStack = CONTAINING_RECORD( pChannel->pConnect->StackHead.Flink,
ICA_STACK, StackEntry );
IcaReferenceStack( pStack );
IcaUnlockConnection( pChannel->pConnect );
/*
* Send mouse input
*/
IcaChannelInputInternal( pStack, Channel_Mouse, 0, NULL,
(PCHAR)IrpSp->Parameters.DeviceIoControl.Type3InputBuffer,
IrpSp->Parameters.DeviceIoControl.InputBufferLength );
IcaDereferenceStack( pStack );
Status = STATUS_SUCCESS;
break;
#endif
default:
// Verify the buffer method.
Method = code & 0x03;
ASSERT( Method == METHOD_BUFFERED );
if ( Method != METHOD_BUFFERED ) {
Status = STATUS_INVALID_DEVICE_REQUEST;
}
else {
SdIoctl.IoControlCode = code;
SdIoctl.InputBuffer = Irp->AssociatedIrp.SystemBuffer;
SdIoctl.InputBufferLength = IrpSp->Parameters.DeviceIoControl.InputBufferLength;
SdIoctl.OutputBuffer = Irp->UserBuffer;
SdIoctl.OutputBufferLength = IrpSp->Parameters.DeviceIoControl.OutputBufferLength;
Status = IcaCallDriver( pChannel, SD$IOCTL, &SdIoctl );
}
break;
}
return( Status );
}