From 270790a9df1501c1e71dae20ebaae942aee73855 Mon Sep 17 00:00:00 2001 From: Aric Stewart Date: Mon, 6 Jul 2015 13:09:14 -0500 Subject: [PATCH] hidclass.sys: Add hidclass.sys. --- configure | 2 + configure.ac | 1 + dlls/hidclass.sys/Makefile.in | 7 +++ dlls/hidclass.sys/hid.h | 35 ++++++++++++++ dlls/hidclass.sys/hidclass.sys.spec | 1 + dlls/hidclass.sys/main.c | 74 +++++++++++++++++++++++++++++ 6 files changed, 120 insertions(+) create mode 100644 dlls/hidclass.sys/Makefile.in create mode 100644 dlls/hidclass.sys/hid.h create mode 100644 dlls/hidclass.sys/hidclass.sys.spec create mode 100644 dlls/hidclass.sys/main.c diff --git a/configure b/configure index cb6afc13929..ebaa38c80e4 100755 --- a/configure +++ b/configure @@ -1078,6 +1078,7 @@ enable_gpkcsp enable_hal enable_hhctrl_ocx enable_hid +enable_hidclass_sys enable_hlink enable_hnetcfg enable_httpapi @@ -17289,6 +17290,7 @@ wine_fn_config_dll gpkcsp enable_gpkcsp wine_fn_config_dll hal enable_hal wine_fn_config_dll hhctrl.ocx enable_hhctrl_ocx clean,implib,po htmlhelp wine_fn_config_dll hid enable_hid implib +wine_fn_config_dll hidclass.sys enable_hidclass_sys implib hidclass wine_fn_config_dll hlink enable_hlink clean,implib wine_fn_config_test dlls/hlink/tests hlink_test wine_fn_config_dll hnetcfg enable_hnetcfg clean diff --git a/configure.ac b/configure.ac index cca4e0cea74..fa58592a865 100644 --- a/configure.ac +++ b/configure.ac @@ -2987,6 +2987,7 @@ WINE_CONFIG_DLL(gpkcsp) WINE_CONFIG_DLL(hal) WINE_CONFIG_DLL(hhctrl.ocx,,[clean,implib,po],[htmlhelp]) WINE_CONFIG_DLL(hid,,[implib]) +WINE_CONFIG_DLL(hidclass.sys,,[implib],[hidclass]) WINE_CONFIG_DLL(hlink,,[clean,implib]) WINE_CONFIG_TEST(dlls/hlink/tests) WINE_CONFIG_DLL(hnetcfg,,[clean]) diff --git a/dlls/hidclass.sys/Makefile.in b/dlls/hidclass.sys/Makefile.in new file mode 100644 index 00000000000..b3fdd1ca059 --- /dev/null +++ b/dlls/hidclass.sys/Makefile.in @@ -0,0 +1,7 @@ +MODULE = hidclass.sys +IMPORTLIB = hidclass +IMPORTS = ntoskrnl.exe +DELAYIMPORTS = setupapi hid + +C_SRCS = \ + main.c diff --git a/dlls/hidclass.sys/hid.h b/dlls/hidclass.sys/hid.h new file mode 100644 index 00000000000..f058e461ea0 --- /dev/null +++ b/dlls/hidclass.sys/hid.h @@ -0,0 +1,35 @@ +/* + * Copyright 2015 Aric Stewart + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA + */ + +#include "ntstatus.h" +#define WIN32_NO_STATUS +#include "windef.h" +#include "winbase.h" +#include "winternl.h" +#include "ddk/wdm.h" +#include "ddk/hidport.h" +#include "wine/list.h" + +typedef struct _minidriver +{ + struct list entry; + + HID_MINIDRIVER_REGISTRATION minidriver; + + PDRIVER_UNLOAD DriverUnload; +} minidriver; diff --git a/dlls/hidclass.sys/hidclass.sys.spec b/dlls/hidclass.sys/hidclass.sys.spec new file mode 100644 index 00000000000..3ec2525ac9f --- /dev/null +++ b/dlls/hidclass.sys/hidclass.sys.spec @@ -0,0 +1 @@ +@ stdcall HidRegisterMinidriver(ptr) diff --git a/dlls/hidclass.sys/main.c b/dlls/hidclass.sys/main.c new file mode 100644 index 00000000000..e4844862609 --- /dev/null +++ b/dlls/hidclass.sys/main.c @@ -0,0 +1,74 @@ +/* + * WINE Hid device services + * + * Copyright 2015 Aric Stewart + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA + */ + +#define NONAMELESSUNION +#include +#include +#include "hid.h" +#include "wine/debug.h" +#include "wine/unicode.h" +#include "wine/list.h" + +WINE_DEFAULT_DEBUG_CHANNEL(hid); + +static struct list minidriver_list = LIST_INIT(minidriver_list); + +static minidriver* find_minidriver(DRIVER_OBJECT *driver) +{ + minidriver *md; + LIST_FOR_EACH_ENTRY(md, &minidriver_list, minidriver, entry) + { + if (md->minidriver.DriverObject == driver) + return md; + } + return NULL; +} + +static VOID WINAPI UnloadDriver(DRIVER_OBJECT *driver) +{ + minidriver *md; + + TRACE("Driver Unload\n"); + md = find_minidriver(driver); + if (md) + { + if (md->DriverUnload) + md->DriverUnload(md->minidriver.DriverObject); + list_remove(&md->entry); + HeapFree( GetProcessHeap(), 0, md ); + } +} + +NTSTATUS WINAPI HidRegisterMinidriver(HID_MINIDRIVER_REGISTRATION *registration) +{ + minidriver *driver; + driver = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(*driver)); + + if (!driver) + return STATUS_NO_MEMORY; + + driver->DriverUnload = registration->DriverObject->DriverUnload; + registration->DriverObject->DriverUnload = UnloadDriver; + + driver->minidriver = *registration; + list_add_tail(&minidriver_list, &driver->entry); + + return STATUS_SUCCESS; +}