winehid.sys: Implement handing internal ioctls. (v5)

Aric Stewart aric at codeweavers.com
Fri Oct 14 01:56:05 CDT 2016


Signed-off-by: Aric Stewart <aric at codeweavers.com>

On 10/14/16 8:12 AM, Sebastian Lackner wrote:
> From: Aric Stewart <aric at codeweavers.com>
> 
> Signed-off-by: Aric Stewart <aric at codeweavers.com>
> Signed-off-by: Sebastian Lackner <sebastian at fds-team.de>
> ---
> 
> Changes in v5:
> * Use NONAMELESSUNION to avoid possible compile issues on unusual platforms.
>   (Sorry if this was a misunderstanding, I was only removing it from patch 1
>   because it was not necessary for the stub driver yet.)
> * Minor style improvements (for example, put the comma in the FIXME on the
>   previous line, so that the style is the same as in winebus).
> 
>  dlls/winehid.sys/Makefile.in |    2 +-
>  dlls/winehid.sys/main.c      |   42 ++++++++++++++++++++++++++++++++++++++++++
>  2 files changed, 43 insertions(+), 1 deletion(-)
> 
> diff --git a/dlls/winehid.sys/Makefile.in b/dlls/winehid.sys/Makefile.in
> index ad7881e..8db0f0e 100644
> --- a/dlls/winehid.sys/Makefile.in
> +++ b/dlls/winehid.sys/Makefile.in
> @@ -1,5 +1,5 @@
>  MODULE    = winehid.sys
> -IMPORTS   = hidclass
> +IMPORTS   = hidclass ntoskrnl
>  EXTRADLLFLAGS = -Wb,--subsystem,native
>  
>  C_SRCS = \
> diff --git a/dlls/winehid.sys/main.c b/dlls/winehid.sys/main.c
> index cdef3c5..42e2e48 100644
> --- a/dlls/winehid.sys/main.c
> +++ b/dlls/winehid.sys/main.c
> @@ -20,17 +20,58 @@
>  
>  #include <stdarg.h>
>  
> +#define NONAMELESSUNION
> +
>  #include "ntstatus.h"
>  #define WIN32_NO_STATUS
>  #include "windef.h"
>  #include "winbase.h"
>  #include "winternl.h"
> +#include "winioctl.h"
>  #include "ddk/wdm.h"
>  #include "ddk/hidport.h"
>  #include "wine/debug.h"
>  
>  WINE_DEFAULT_DEBUG_CHANNEL(hid);
>  
> +static NTSTATUS WINAPI internal_ioctl(DEVICE_OBJECT *device, IRP *irp)
> +{
> +    NTSTATUS status = irp->IoStatus.u.Status;
> +    IO_STACK_LOCATION *irpsp = IoGetCurrentIrpStackLocation(irp);
> +
> +    switch (irpsp->Parameters.DeviceIoControl.IoControlCode)
> +    {
> +        case IOCTL_GET_PHYSICAL_DESCRIPTOR:
> +        case IOCTL_HID_ACTIVATE_DEVICE:
> +        case IOCTL_HID_DEACTIVATE_DEVICE:
> +        case IOCTL_HID_GET_INDEXED_STRING:
> +        case IOCTL_HID_GET_DEVICE_ATTRIBUTES:
> +        case IOCTL_HID_GET_DEVICE_DESCRIPTOR:
> +        case IOCTL_HID_GET_REPORT_DESCRIPTOR:
> +        case IOCTL_HID_GET_STRING:
> +        case IOCTL_HID_GET_INPUT_REPORT:
> +        case IOCTL_HID_READ_REPORT:
> +        case IOCTL_HID_SET_OUTPUT_REPORT:
> +        case IOCTL_HID_WRITE_REPORT:
> +        case IOCTL_HID_GET_FEATURE:
> +        case IOCTL_HID_SET_FEATURE:
> +        {
> +            /* All these are handled by the lower level driver */
> +            IoSkipCurrentIrpStackLocation(irp);
> +            return IoCallDriver(((HID_DEVICE_EXTENSION *)device->DeviceExtension)->NextDeviceObject, irp);
> +        }
> +        default:
> +        {
> +            ULONG code = irpsp->Parameters.DeviceIoControl.IoControlCode;
> +            FIXME("Unsupported ioctl %x (device=%x access=%x func=%x method=%x)\n",
> +                  code, code >> 16, (code >> 14) & 3, (code >> 2) & 0xfff, code & 3);
> +            break;
> +        }
> +    }
> +    IoCompleteRequest(irp, IO_NO_INCREMENT);
> +    return status;
> +}
> +
>  static NTSTATUS WINAPI add_device(DRIVER_OBJECT *driver, DEVICE_OBJECT *device)
>  {
>      TRACE("(%p, %p)\n", driver, device);
> @@ -43,6 +84,7 @@ NTSTATUS WINAPI DriverEntry(DRIVER_OBJECT *driver, UNICODE_STRING *path)
>  
>      TRACE("(%p, %s)\n", driver, debugstr_w(path->Buffer));
>  
> +    driver->MajorFunction[IRP_MJ_INTERNAL_DEVICE_CONTROL] = internal_ioctl;
>      driver->DriverExtension->AddDevice = add_device;
>  
>      memset(&registration, 0, sizeof(registration));
> 



More information about the wine-patches mailing list