winebus.sys: Add initial udev stub driver.

Signed-off-by: Aric Stewart <aric@codeweavers.com>
Signed-off-by: Sebastian Lackner <sebastian@fds-team.de>
Signed-off-by: Alexandre Julliard <julliard@winehq.org>
This commit is contained in:
Aric Stewart 2016-09-08 10:12:50 +02:00 committed by Alexandre Julliard
parent 0c4c6d603b
commit 6d3e5f8441
7 changed files with 246 additions and 0 deletions

107
configure vendored
View File

@ -652,6 +652,8 @@ FONTCONFIG_CFLAGS
CUPS_CFLAGS CUPS_CFLAGS
CAPI20_LIBS CAPI20_LIBS
CAPI20_CFLAGS CAPI20_CFLAGS
UDEV_LIBS
UDEV_CFLAGS
OSS4_CFLAGS OSS4_CFLAGS
ALSA_LIBS ALSA_LIBS
GSTREAMER_LIBS GSTREAMER_LIBS
@ -846,6 +848,7 @@ with_pthread
with_pulse with_pulse
with_sane with_sane
with_tiff with_tiff
with_udev
with_v4l with_v4l
with_xcomposite with_xcomposite
with_xcursor with_xcursor
@ -1590,6 +1593,8 @@ PULSE_CFLAGS
PULSE_LIBS PULSE_LIBS
GSTREAMER_CFLAGS GSTREAMER_CFLAGS
GSTREAMER_LIBS GSTREAMER_LIBS
UDEV_CFLAGS
UDEV_LIBS
CAPI20_CFLAGS CAPI20_CFLAGS
CAPI20_LIBS CAPI20_LIBS
FONTCONFIG_CFLAGS FONTCONFIG_CFLAGS
@ -2275,6 +2280,7 @@ Optional Packages:
--without-pulse do not use PulseAudio sound support --without-pulse do not use PulseAudio sound support
--without-sane do not use SANE (scanner support) --without-sane do not use SANE (scanner support)
--without-tiff do not use TIFF --without-tiff do not use TIFF
--without-udev do not use udev (play and play support)
--without-v4l do not use v4l1 (v4l support) --without-v4l do not use v4l1 (v4l support)
--without-xcomposite do not use the Xcomposite extension --without-xcomposite do not use the Xcomposite extension
--without-xcursor do not use the Xcursor extension --without-xcursor do not use the Xcursor extension
@ -2342,6 +2348,8 @@ Some influential environment variables:
GSTREAMER_LIBS GSTREAMER_LIBS
Linker flags for gstreamer-1.0 gstreamer-video-1.0 Linker flags for gstreamer-1.0 gstreamer-video-1.0
gstreamer-audio-1.0, overriding pkg-config gstreamer-audio-1.0, overriding pkg-config
UDEV_CFLAGS C compiler flags for libudev, overriding pkg-config
UDEV_LIBS Linker flags for libudev, overriding pkg-config
CAPI20_CFLAGS CAPI20_CFLAGS
C compiler flags for capi20, overriding pkg-config C compiler flags for capi20, overriding pkg-config
CAPI20_LIBS Linker flags for capi20, overriding pkg-config CAPI20_LIBS Linker flags for capi20, overriding pkg-config
@ -3546,6 +3554,12 @@ if test "${with_tiff+set}" = set; then :
fi fi
# Check whether --with-udev was given.
if test "${with_udev+set}" = set; then :
withval=$with_udev;
fi
# Check whether --with-v4l was given. # Check whether --with-v4l was given.
if test "${with_v4l+set}" = set; then : if test "${with_v4l+set}" = set; then :
withval=$with_v4l; withval=$with_v4l;
@ -12902,6 +12916,97 @@ esac
enable_wineoss_drv=${enable_wineoss_drv:-no} enable_wineoss_drv=${enable_wineoss_drv:-no}
fi fi
if test "x$with_udev" != "xno"
then
if ${UDEV_CFLAGS:+false} :; then :
if ${PKG_CONFIG+:} false; then :
UDEV_CFLAGS=`$PKG_CONFIG --cflags libudev 2>/dev/null`
fi
fi
if ${UDEV_LIBS:+false} :; then :
if ${PKG_CONFIG+:} false; then :
UDEV_LIBS=`$PKG_CONFIG --libs libudev 2>/dev/null`
fi
fi
$as_echo "$as_me:${as_lineno-$LINENO}: libudev cflags: $UDEV_CFLAGS" >&5
$as_echo "$as_me:${as_lineno-$LINENO}: libudev libs: $UDEV_LIBS" >&5
ac_save_CPPFLAGS=$CPPFLAGS
CPPFLAGS="$CPPFLAGS $UDEV_CFLAGS"
for ac_header in libudev.h
do :
ac_fn_c_check_header_mongrel "$LINENO" "libudev.h" "ac_cv_header_libudev_h" "$ac_includes_default"
if test "x$ac_cv_header_libudev_h" = xyes; then :
cat >>confdefs.h <<_ACEOF
#define HAVE_LIBUDEV_H 1
_ACEOF
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for udev_new in -ludev" >&5
$as_echo_n "checking for udev_new in -ludev... " >&6; }
if ${ac_cv_lib_udev_udev_new+:} false; then :
$as_echo_n "(cached) " >&6
else
ac_check_lib_save_LIBS=$LIBS
LIBS="-ludev $UDEV_LIBS $LIBS"
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h. */
/* Override any GCC internal prototype to avoid an error.
Use char because int might match the return type of a GCC
builtin and then its argument prototype would still apply. */
#ifdef __cplusplus
extern "C"
#endif
char udev_new ();
int
main ()
{
return udev_new ();
;
return 0;
}
_ACEOF
if ac_fn_c_try_link "$LINENO"; then :
ac_cv_lib_udev_udev_new=yes
else
ac_cv_lib_udev_udev_new=no
fi
rm -f core conftest.err conftest.$ac_objext \
conftest$ac_exeext conftest.$ac_ext
LIBS=$ac_check_lib_save_LIBS
fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_udev_udev_new" >&5
$as_echo "$ac_cv_lib_udev_udev_new" >&6; }
if test "x$ac_cv_lib_udev_udev_new" = xyes; then :
$as_echo "#define HAVE_UDEV 1" >>confdefs.h
else
UDEV_LIBS=""
fi
else
UDEV_LIBS=""
fi
done
CPPFLAGS=$ac_save_CPPFLAGS
test -z "$UDEV_CFLAGS" || UDEV_CFLAGS=`echo " $UDEV_CFLAGS" | sed 's/ -I\([^/]\)/ -I\$(top_builddir)\/\1/g'`
test -z "$UDEV_LIBS" || UDEV_LIBS=`echo " $UDEV_LIBS" | sed 's/ -L\([^/]\)/ -L\$(top_builddir)\/\1/g'`
fi
if test "x$UDEV_LIBS" = "x"; then :
case "x$with_udev" in
x) as_fn_append wine_notices "|libudev ${notice_platform}development files not found, plug and play won't be supported." ;;
xno) ;;
*) as_fn_error $? "libudev ${notice_platform}development files not found, plug and play won't be supported.
This is an error since --with-udev was requested." "$LINENO" 5 ;;
esac
fi
if test "x$with_capi" != "xno" if test "x$with_capi" != "xno"
then then
if ${CAPI20_CFLAGS:+false} :; then : if ${CAPI20_CFLAGS:+false} :; then :
@ -17350,6 +17455,8 @@ GSTREAMER_CFLAGS = $GSTREAMER_CFLAGS
GSTREAMER_LIBS = $GSTREAMER_LIBS GSTREAMER_LIBS = $GSTREAMER_LIBS
ALSA_LIBS = $ALSA_LIBS ALSA_LIBS = $ALSA_LIBS
OSS4_CFLAGS = $OSS4_CFLAGS OSS4_CFLAGS = $OSS4_CFLAGS
UDEV_CFLAGS = $UDEV_CFLAGS
UDEV_LIBS = $UDEV_LIBS
CAPI20_CFLAGS = $CAPI20_CFLAGS CAPI20_CFLAGS = $CAPI20_CFLAGS
CAPI20_LIBS = $CAPI20_LIBS CAPI20_LIBS = $CAPI20_LIBS
CUPS_CFLAGS = $CUPS_CFLAGS CUPS_CFLAGS = $CUPS_CFLAGS

View File

@ -75,6 +75,7 @@ AC_ARG_WITH(pthread, AS_HELP_STRING([--without-pthread],[do not use the pthrea
AC_ARG_WITH(pulse, AS_HELP_STRING([--without-pulse],[do not use PulseAudio sound support])) AC_ARG_WITH(pulse, AS_HELP_STRING([--without-pulse],[do not use PulseAudio sound support]))
AC_ARG_WITH(sane, AS_HELP_STRING([--without-sane],[do not use SANE (scanner support)])) AC_ARG_WITH(sane, AS_HELP_STRING([--without-sane],[do not use SANE (scanner support)]))
AC_ARG_WITH(tiff, AS_HELP_STRING([--without-tiff],[do not use TIFF])) AC_ARG_WITH(tiff, AS_HELP_STRING([--without-tiff],[do not use TIFF]))
AC_ARG_WITH(udev, AS_HELP_STRING([--without-udev],[do not use udev (play and play support)]))
AC_ARG_WITH(v4l, AS_HELP_STRING([--without-v4l],[do not use v4l1 (v4l support)])) AC_ARG_WITH(v4l, AS_HELP_STRING([--without-v4l],[do not use v4l1 (v4l support)]))
AC_ARG_WITH(xcomposite,AS_HELP_STRING([--without-xcomposite],[do not use the Xcomposite extension]), AC_ARG_WITH(xcomposite,AS_HELP_STRING([--without-xcomposite],[do not use the Xcomposite extension]),
[if test "x$withval" = "xno"; then ac_cv_header_X11_extensions_Xcomposite_h=no; fi]) [if test "x$withval" = "xno"; then ac_cv_header_X11_extensions_Xcomposite_h=no; fi])
@ -1519,6 +1520,19 @@ WINE_NOTICE_WITH(oss,[test "x$ac_cv_member_oss_sysinfo_numaudioengines" != xyes]
[OSS sound system found but too old (OSSv4 needed), OSS won't be supported.], [OSS sound system found but too old (OSSv4 needed), OSS won't be supported.],
[enable_wineoss_drv]) [enable_wineoss_drv])
dnl **** Check for libudev ****
if test "x$with_udev" != "xno"
then
WINE_PACKAGE_FLAGS(UDEV,[libudev],,,,
[AC_CHECK_HEADERS(libudev.h,
[AC_CHECK_LIB(udev,udev_new,
AC_DEFINE(HAVE_UDEV,1,[Define to 1 if you have the `udev' library (-ludev).]),
[UDEV_LIBS=""],[$UDEV_LIBS])],
[UDEV_LIBS=""])])
fi
WINE_NOTICE_WITH(udev,[test "x$UDEV_LIBS" = "x"],
[libudev ${notice_platform}development files not found, plug and play won't be supported.])
dnl **** Check for capi4linux **** dnl **** Check for capi4linux ****
if test "x$with_capi" != "xno" if test "x$with_capi" != "xno"
then then

View File

@ -1,5 +1,7 @@
MODULE = winebus.sys MODULE = winebus.sys
IMPORTS = ntoskrnl
EXTRADLLFLAGS = -Wb,--subsystem,native EXTRADLLFLAGS = -Wb,--subsystem,native
C_SRCS = \ C_SRCS = \
bus_udev.c \
main.c main.c

23
dlls/winebus.sys/bus.h Normal file
View File

@ -0,0 +1,23 @@
/*
* Copyright 2016 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
*/
/* Busses */
NTSTATUS WINAPI udev_driver_init(DRIVER_OBJECT *driver, UNICODE_STRING *registry_path) DECLSPEC_HIDDEN;
/* HID Plug and Play Bus */
NTSTATUS WINAPI common_pnp_dispatch(DEVICE_OBJECT *device, IRP *irp) DECLSPEC_HIDDEN;

View File

@ -0,0 +1,60 @@
/*
* Plug and Play support for hid devices found through udev
*
* Copyright 2016 CodeWeavers, 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 "config.h"
#include <stdarg.h>
#define NONAMELESSUNION
#include "ntstatus.h"
#define WIN32_NO_STATUS
#include "windef.h"
#include "winbase.h"
#include "winternl.h"
#include "ddk/wdm.h"
#include "wine/debug.h"
#include "bus.h"
WINE_DEFAULT_DEBUG_CHANNEL(plugplay);
#ifdef HAVE_UDEV
static DRIVER_OBJECT *udev_driver_obj = NULL;
NTSTATUS WINAPI udev_driver_init(DRIVER_OBJECT *driver, UNICODE_STRING *registry_path)
{
TRACE("(%p, %s)\n", driver, debugstr_w(registry_path->Buffer));
udev_driver_obj = driver;
driver->MajorFunction[IRP_MJ_PNP] = common_pnp_dispatch;
return STATUS_SUCCESS;
}
#else
NTSTATUS WINAPI udev_driver_init(DRIVER_OBJECT *driver, UNICODE_STRING *registry_path)
{
WARN("Wine was compiled without UDEV support\n");
return STATUS_NOT_IMPLEMENTED;
}
#endif /* HAVE_UDEV */

View File

@ -20,6 +20,8 @@
#include <stdarg.h> #include <stdarg.h>
#define NONAMELESSUNION
#include "ntstatus.h" #include "ntstatus.h"
#define WIN32_NO_STATUS #define WIN32_NO_STATUS
#include "windef.h" #include "windef.h"
@ -28,11 +30,43 @@
#include "ddk/wdm.h" #include "ddk/wdm.h"
#include "wine/debug.h" #include "wine/debug.h"
#include "bus.h"
WINE_DEFAULT_DEBUG_CHANNEL(plugplay); WINE_DEFAULT_DEBUG_CHANNEL(plugplay);
NTSTATUS WINAPI common_pnp_dispatch(DEVICE_OBJECT *device, IRP *irp)
{
NTSTATUS status = irp->IoStatus.u.Status;
IO_STACK_LOCATION *irpsp = IoGetCurrentIrpStackLocation(irp);
switch (irpsp->MinorFunction)
{
case IRP_MN_QUERY_DEVICE_RELATIONS:
TRACE("IRP_MN_QUERY_DEVICE_RELATIONS\n");
break;
case IRP_MN_QUERY_ID:
TRACE("IRP_MN_QUERY_ID\n");
break;
case IRP_MN_QUERY_CAPABILITIES:
TRACE("IRP_MN_QUERY_CAPABILITIES\n");
break;
default:
FIXME("Unhandled function %08x\n", irpsp->MinorFunction);
break;
}
IoCompleteRequest(irp, IO_NO_INCREMENT);
return status;
}
NTSTATUS WINAPI DriverEntry( DRIVER_OBJECT *driver, UNICODE_STRING *path ) NTSTATUS WINAPI DriverEntry( DRIVER_OBJECT *driver, UNICODE_STRING *path )
{ {
static const WCHAR udevW[] = {'\\','D','r','i','v','e','r','\\','U','D','E','V',0};
static UNICODE_STRING udev = {sizeof(udevW) - sizeof(WCHAR), sizeof(udevW), (WCHAR *)udevW};
TRACE( "(%p, %s)\n", driver, debugstr_w(path->Buffer) ); TRACE( "(%p, %s)\n", driver, debugstr_w(path->Buffer) );
IoCreateDriver(&udev, udev_driver_init);
return STATUS_SUCCESS; return STATUS_SUCCESS;
} }

View File

@ -378,6 +378,9 @@
/* Define to 1 if you have the <libproc.h> header file. */ /* Define to 1 if you have the <libproc.h> header file. */
#undef HAVE_LIBPROC_H #undef HAVE_LIBPROC_H
/* Define to 1 if you have the <libudev.h> header file. */
#undef HAVE_LIBUDEV_H
/* Define to 1 if you have the <libunwind.h> header file. */ /* Define to 1 if you have the <libunwind.h> header file. */
#undef HAVE_LIBUNWIND_H #undef HAVE_LIBUNWIND_H
@ -1200,6 +1203,9 @@
/* Define to 1 if you have the `truncf' function. */ /* Define to 1 if you have the `truncf' function. */
#undef HAVE_TRUNCF #undef HAVE_TRUNCF
/* Define to 1 if you have the `udev' library (-ludev). */
#undef HAVE_UDEV
/* Define to 1 if you have the <unistd.h> header file. */ /* Define to 1 if you have the <unistd.h> header file. */
#undef HAVE_UNISTD_H #undef HAVE_UNISTD_H