181 lines
4 KiB
C
181 lines
4 KiB
C
|
/*++
|
||
|
|
||
|
Copyright (c) 1996 Microsoft Corporation
|
||
|
|
||
|
Module Name:
|
||
|
|
||
|
ioctl.c
|
||
|
|
||
|
Abstract: Human Input Device (HID) minidriver for Infrared (IR) devices
|
||
|
|
||
|
The HID IR Minidriver (HidIr) provides an abstraction layer for the
|
||
|
HID Class to talk to HID IR devices.
|
||
|
|
||
|
Author:
|
||
|
jsenior
|
||
|
|
||
|
Environment:
|
||
|
|
||
|
Kernel mode
|
||
|
|
||
|
Revision History:
|
||
|
|
||
|
|
||
|
--*/
|
||
|
#include "pch.h"
|
||
|
|
||
|
|
||
|
NTSTATUS
|
||
|
HidIrIoctl(
|
||
|
IN PDEVICE_OBJECT DeviceObject,
|
||
|
IN PIRP Irp
|
||
|
)
|
||
|
/*++
|
||
|
|
||
|
Routine Description:
|
||
|
|
||
|
Process the Control IRPs sent to this device.
|
||
|
|
||
|
Arguments:
|
||
|
|
||
|
DeviceObject - pointer to a device object.
|
||
|
|
||
|
Irp - pointer to an I/O Request Packet.
|
||
|
|
||
|
Return Value:
|
||
|
|
||
|
NT status code
|
||
|
|
||
|
--*/
|
||
|
{
|
||
|
NTSTATUS ntStatus = STATUS_SUCCESS;
|
||
|
PIO_STACK_LOCATION irpStack;
|
||
|
BOOLEAN needsCompletion = TRUE;
|
||
|
|
||
|
HidIrKdPrint((3, "HidIrIoctl Enter"));
|
||
|
|
||
|
//
|
||
|
// Get a pointer to the current location in the Irp
|
||
|
//
|
||
|
|
||
|
irpStack = IoGetCurrentIrpStackLocation(Irp);
|
||
|
|
||
|
//
|
||
|
// Get a pointer to the device extension
|
||
|
//
|
||
|
|
||
|
switch(irpStack->Parameters.DeviceIoControl.IoControlCode)
|
||
|
{
|
||
|
|
||
|
case IOCTL_HID_GET_DEVICE_DESCRIPTOR:
|
||
|
//
|
||
|
// Return the HID descriptor
|
||
|
//
|
||
|
|
||
|
HidIrKdPrint((3, "IOCTL_HID_GET_DEVICE_DESCRIPTOR"));
|
||
|
ntStatus = HidIrGetHidDescriptor (DeviceObject, Irp, HID_HID_DESCRIPTOR_TYPE);
|
||
|
break;
|
||
|
|
||
|
case IOCTL_HID_GET_REPORT_DESCRIPTOR:
|
||
|
//
|
||
|
// Return the Report descriptor
|
||
|
//
|
||
|
|
||
|
HidIrKdPrint((3, "IOCTL_HID_GET_REPORT_DESCRIPTOR"));
|
||
|
ntStatus = HidIrGetHidDescriptor (DeviceObject, Irp, HID_REPORT_DESCRIPTOR_TYPE);
|
||
|
break;
|
||
|
|
||
|
case IOCTL_GET_PHYSICAL_DESCRIPTOR:
|
||
|
//
|
||
|
// Return the Report descriptor
|
||
|
//
|
||
|
|
||
|
HidIrKdPrint((3, "IOCTL_HID_GET_REPORT_DESCRIPTOR"));
|
||
|
ntStatus = HidIrGetHidDescriptor (DeviceObject, Irp, HID_PHYSICAL_DESCRIPTOR_TYPE);
|
||
|
break;
|
||
|
|
||
|
case IOCTL_HID_READ_REPORT:
|
||
|
//
|
||
|
// Perform a read
|
||
|
//
|
||
|
|
||
|
HidIrKdPrint((3, "IOCTL_HID_READ_REPORT"));
|
||
|
ntStatus = HidIrReadReport (DeviceObject, Irp, &needsCompletion);
|
||
|
break;
|
||
|
|
||
|
case IOCTL_HID_WRITE_REPORT:
|
||
|
//
|
||
|
// Perform a write
|
||
|
//
|
||
|
|
||
|
HidIrKdPrint((3, "IOCTL_HID_WRITE_REPORT not supported for IR"));
|
||
|
ntStatus = STATUS_UNSUCCESSFUL;
|
||
|
break;
|
||
|
|
||
|
case IOCTL_HID_ACTIVATE_DEVICE:
|
||
|
case IOCTL_HID_DEACTIVATE_DEVICE:
|
||
|
/*
|
||
|
* We don't do anything for these IOCTLs but some minidrivers might.
|
||
|
*/
|
||
|
ntStatus = STATUS_SUCCESS;
|
||
|
break;
|
||
|
|
||
|
case IOCTL_HID_GET_DEVICE_ATTRIBUTES:
|
||
|
HidIrKdPrint((3, "IOCTL_GET_DEVICE_ATTRIBUTES"));
|
||
|
ntStatus = HidIrGetDeviceAttributes(DeviceObject, Irp);
|
||
|
break;
|
||
|
|
||
|
case IOCTL_HID_GET_FEATURE:
|
||
|
case IOCTL_HID_GET_INPUT_REPORT:
|
||
|
case IOCTL_HID_SET_FEATURE:
|
||
|
case IOCTL_HID_SET_OUTPUT_REPORT:
|
||
|
case IOCTL_HID_GET_MS_GENRE_DESCRIPTOR:
|
||
|
/*
|
||
|
* This IOCTL uses buffering method METHOD_NEITHER,
|
||
|
* so the buffer is Irp->UserBuffer.
|
||
|
* If the IRP is coming to us from user space,
|
||
|
* we must validate the buffer.
|
||
|
*/
|
||
|
|
||
|
case IOCTL_HID_GET_STRING:
|
||
|
case IOCTL_HID_GET_INDEXED_STRING:
|
||
|
// Strings.
|
||
|
case IOCTL_HID_SEND_IDLE_NOTIFICATION_REQUEST:
|
||
|
// ntStatus = HidIrSendIdleNotificationRequest(DeviceObject, Irp, &needsCompletion);
|
||
|
// break;
|
||
|
|
||
|
default:
|
||
|
HidIrKdPrint((3, "Unknown or unsupported IOCTL (%x)", irpStack->Parameters.DeviceIoControl.IoControlCode));
|
||
|
/*
|
||
|
* Note: do not return STATUS_NOT_SUPPORTED;
|
||
|
* Just keep the default status (this allows filter drivers to work).
|
||
|
*/
|
||
|
ntStatus = Irp->IoStatus.Status;
|
||
|
break;
|
||
|
|
||
|
}
|
||
|
|
||
|
|
||
|
//
|
||
|
// Complete Irp
|
||
|
//
|
||
|
|
||
|
if (needsCompletion) {
|
||
|
ASSERT(ntStatus != STATUS_PENDING);
|
||
|
|
||
|
//
|
||
|
// Set real return status in Irp
|
||
|
//
|
||
|
|
||
|
Irp->IoStatus.Status = ntStatus;
|
||
|
|
||
|
IoCompleteRequest(Irp, IO_NO_INCREMENT);
|
||
|
}
|
||
|
|
||
|
HidIrKdPrint((3, "HidIrIoctl Exit = %x", ntStatus));
|
||
|
|
||
|
return ntStatus;
|
||
|
}
|
||
|
|
||
|
|