[PATCH v2 1/5] wineoss: Introduce a test_connect syscall.

Huw Davies huw at codeweavers.com
Thu Mar 31 02:21:46 CDT 2022


Signed-off-by: Huw Davies <huw at codeweavers.com>
---
 dlls/wineoss.drv/Makefile.in |  4 +-
 dlls/wineoss.drv/mmdevdrv.c  | 60 ++++++-----------------
 dlls/wineoss.drv/oss.c       | 94 ++++++++++++++++++++++++++++++++++++
 dlls/wineoss.drv/unixlib.h   | 40 +++++++++++++++
 4 files changed, 153 insertions(+), 45 deletions(-)
 create mode 100644 dlls/wineoss.drv/oss.c
 create mode 100644 dlls/wineoss.drv/unixlib.h

diff --git a/dlls/wineoss.drv/Makefile.in b/dlls/wineoss.drv/Makefile.in
index ce96ca73bf4..d48db94b929 100644
--- a/dlls/wineoss.drv/Makefile.in
+++ b/dlls/wineoss.drv/Makefile.in
@@ -1,5 +1,6 @@
 EXTRADEFS = -DWINE_NO_LONG_TYPES
 MODULE    = wineoss.drv
+UNIXLIB   = wineoss.so
 IMPORTS   = uuid ole32 user32 advapi32
 DELAYIMPORTS = winmm
 EXTRALIBS = $(OSS4_LIBS)
@@ -11,4 +12,5 @@ C_SRCS = \
 	midi.c \
 	midipatch.c \
 	mmaux.c \
-	mmdevdrv.c
+	mmdevdrv.c \
+	oss.c
diff --git a/dlls/wineoss.drv/mmdevdrv.c b/dlls/wineoss.drv/mmdevdrv.c
index b340db00c3c..0269f0fa536 100644
--- a/dlls/wineoss.drv/mmdevdrv.c
+++ b/dlls/wineoss.drv/mmdevdrv.c
@@ -1,5 +1,6 @@
 /*
  * Copyright 2011 Andrew Eikum for CodeWeavers
+ *           2022 Huw Davies
  *
  * This library is free software; you can redistribute it and/or
  * modify it under the terms of the GNU Lesser General Public
@@ -35,10 +36,9 @@
 
 #include "windef.h"
 #include "winbase.h"
+#include "winternl.h"
 #include "winnls.h"
 #include "winreg.h"
-#include "wine/debug.h"
-#include "wine/list.h"
 
 #include "ole2.h"
 #include "mmdeviceapi.h"
@@ -51,10 +51,18 @@
 #include "audiopolicy.h"
 #include "audioclient.h"
 
+#include "wine/debug.h"
+#include "wine/list.h"
+#include "wine/unixlib.h"
+
+#include "unixlib.h"
+
 WINE_DEFAULT_DEBUG_CHANNEL(oss);
 
 #define NULL_PTR_ERR MAKE_HRESULT(SEVERITY_ERROR, FACILITY_WIN32, RPC_X_NULL_REF_POINTER)
 
+unixlib_handle_t oss_handle = 0;
+
 static const REFERENCE_TIME DefaultPeriod = 100000;
 static const REFERENCE_TIME MinimumPeriod = 50000;
 
@@ -233,6 +241,9 @@ BOOL WINAPI DllMain(HINSTANCE dll, DWORD reason, void *reserved)
     switch (reason)
     {
     case DLL_PROCESS_ATTACH:
+        if(NtQueryVirtualMemory(GetCurrentProcess(), dll, MemoryWineUnixFuncs,
+                                &oss_handle, sizeof(oss_handle), NULL))
+            return FALSE;
         g_timer_q = CreateTimerQueue();
         if(!g_timer_q)
             return FALSE;
@@ -254,52 +265,13 @@ BOOL WINAPI DllMain(HINSTANCE dll, DWORD reason, void *reserved)
     return TRUE;
 }
 
-/* From <dlls/mmdevapi/mmdevapi.h> */
-enum DriverPriority {
-    Priority_Unavailable = 0,
-    Priority_Low,
-    Priority_Neutral,
-    Priority_Preferred
-};
-
 int WINAPI AUDDRV_GetPriority(void)
 {
-    int mixer_fd;
-    oss_sysinfo sysinfo;
-
-    /* Attempt to determine if we are running on OSS or ALSA's OSS
-     * compatibility layer. There is no official way to do that, so just check
-     * for validity as best as possible, without rejecting valid OSS
-     * implementations. */
-
-    mixer_fd = open("/dev/mixer", O_RDONLY, 0);
-    if(mixer_fd < 0){
-        TRACE("Priority_Unavailable: open failed\n");
-        return Priority_Unavailable;
-    }
-
-    sysinfo.version[0] = 0xFF;
-    sysinfo.versionnum = ~0;
-    if(ioctl(mixer_fd, SNDCTL_SYSINFO, &sysinfo) < 0){
-        TRACE("Priority_Unavailable: ioctl failed\n");
-        close(mixer_fd);
-        return Priority_Unavailable;
-    }
-
-    close(mixer_fd);
-
-    if(sysinfo.version[0] < '4' || sysinfo.version[0] > '9'){
-        TRACE("Priority_Low: sysinfo.version[0]: %x\n", sysinfo.version[0]);
-        return Priority_Low;
-    }
-    if(sysinfo.versionnum & 0x80000000){
-        TRACE("Priority_Low: sysinfo.versionnum: %x\n", sysinfo.versionnum);
-        return Priority_Low;
-    }
+    struct test_connect_params params;
 
-    TRACE("Priority_Preferred: Seems like valid OSS!\n");
+    OSS_CALL(test_connect, &params);
 
-    return Priority_Preferred;
+    return params.priority;
 }
 
 static void set_device_guid(EDataFlow flow, HKEY drv_key, const WCHAR *key_name,
diff --git a/dlls/wineoss.drv/oss.c b/dlls/wineoss.drv/oss.c
new file mode 100644
index 00000000000..9c1de25acb5
--- /dev/null
+++ b/dlls/wineoss.drv/oss.c
@@ -0,0 +1,94 @@
+/*
+ * OSS driver (unixlib)
+ *
+ * Copyright 2011 Andrew Eikum for CodeWeavers
+ *           2022 Huw Davies
+ *
+ * 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
+ */
+
+#if 0
+#pragma makedep unix
+#endif
+
+#include <stdarg.h>
+#include <sys/types.h>
+#include <sys/stat.h>
+#include <sys/ioctl.h>
+#include <fcntl.h>
+#include <unistd.h>
+#include <sys/soundcard.h>
+
+#include "ntstatus.h"
+#define WIN32_NO_STATUS
+#include "winternl.h"
+
+#include "wine/debug.h"
+#include "wine/unixlib.h"
+
+#include "unixlib.h"
+
+WINE_DEFAULT_DEBUG_CHANNEL(oss);
+
+static NTSTATUS test_connect(void *args)
+{
+    struct test_connect_params *params = args;
+    int mixer_fd;
+    oss_sysinfo sysinfo;
+
+    /* Attempt to determine if we are running on OSS or ALSA's OSS
+     * compatibility layer. There is no official way to do that, so just check
+     * for validity as best as possible, without rejecting valid OSS
+     * implementations. */
+
+    mixer_fd = open("/dev/mixer", O_RDONLY, 0);
+    if(mixer_fd < 0){
+        TRACE("Priority_Unavailable: open failed\n");
+        params->priority = Priority_Unavailable;
+        return STATUS_SUCCESS;
+    }
+
+    sysinfo.version[0] = 0xFF;
+    sysinfo.versionnum = ~0;
+    if(ioctl(mixer_fd, SNDCTL_SYSINFO, &sysinfo) < 0){
+        TRACE("Priority_Unavailable: ioctl failed\n");
+        close(mixer_fd);
+        params->priority = Priority_Unavailable;
+        return STATUS_SUCCESS;
+    }
+
+    close(mixer_fd);
+
+    if(sysinfo.version[0] < '4' || sysinfo.version[0] > '9'){
+        TRACE("Priority_Low: sysinfo.version[0]: %x\n", sysinfo.version[0]);
+        params->priority = Priority_Low;
+        return STATUS_SUCCESS;
+    }
+    if(sysinfo.versionnum & 0x80000000){
+        TRACE("Priority_Low: sysinfo.versionnum: %x\n", sysinfo.versionnum);
+        params->priority = Priority_Low;
+        return STATUS_SUCCESS;
+    }
+
+    TRACE("Priority_Preferred: Seems like valid OSS!\n");
+
+    params->priority = Priority_Preferred;
+    return STATUS_SUCCESS;
+}
+
+unixlib_entry_t __wine_unix_call_funcs[] =
+{
+    test_connect,
+};
diff --git a/dlls/wineoss.drv/unixlib.h b/dlls/wineoss.drv/unixlib.h
new file mode 100644
index 00000000000..d4fb5db3102
--- /dev/null
+++ b/dlls/wineoss.drv/unixlib.h
@@ -0,0 +1,40 @@
+/*
+ * Copyright 2022 Huw Davies
+ *
+ * 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
+ */
+
+/* From <dlls/mmdevapi/mmdevapi.h> */
+enum DriverPriority
+{
+    Priority_Unavailable = 0,
+    Priority_Low,
+    Priority_Neutral,
+    Priority_Preferred
+};
+
+struct test_connect_params
+{
+    enum DriverPriority priority;
+};
+
+enum oss_funcs
+{
+    oss_test_connect,
+};
+
+extern unixlib_handle_t oss_handle;
+
+#define OSS_CALL(func, params) __wine_unix_call(oss_handle, oss_ ## func, params)
-- 
2.25.1




More information about the wine-devel mailing list