[PATCH 2/3] winepulse: Return offsets rather than ptrs to the strings.

Huw Davies huw at codeweavers.com
Thu Apr 14 04:03:10 CDT 2022


This will make the Wow64 syscall rather simpler.

Signed-off-by: Huw Davies <huw at codeweavers.com>
---
 dlls/winepulse.drv/mmdevdrv.c |  9 ++++++---
 dlls/winepulse.drv/pulse.c    | 17 ++++++++---------
 dlls/winepulse.drv/unixlib.h  |  4 ++--
 3 files changed, 16 insertions(+), 14 deletions(-)

diff --git a/dlls/winepulse.drv/mmdevdrv.c b/dlls/winepulse.drv/mmdevdrv.c
index 96b8b28d1b5..f1a1b36c9ef 100644
--- a/dlls/winepulse.drv/mmdevdrv.c
+++ b/dlls/winepulse.drv/mmdevdrv.c
@@ -457,13 +457,16 @@ HRESULT WINAPI AUDDRV_GetEndpointIDs(EDataFlow flow, WCHAR ***ids_out, GUID **ke
     }
 
     for (i = 0; i < params.num; i++) {
-        unsigned int size = (wcslen(params.endpoints[i].name) + 1) * sizeof(WCHAR);
+        WCHAR *name = (WCHAR *)((char *)params.endpoints + params.endpoints[i].name);
+        char *pulse_name = (char *)params.endpoints + params.endpoints[i].pulse_name;
+        unsigned int size = (wcslen(name) + 1) * sizeof(WCHAR);
+
         if (!(ids[i] = HeapAlloc(GetProcessHeap(), 0, size))) {
             params.result = E_OUTOFMEMORY;
             break;
         }
-        memcpy(ids[i], params.endpoints[i].name, size);
-        get_device_guid(drv_key, flow, params.endpoints[i].pulse_name, &guids[i]);
+        memcpy(ids[i], name, size);
+        get_device_guid(drv_key, flow, pulse_name, &guids[i]);
     }
     if (drv_key)
         RegCloseKey(drv_key);
diff --git a/dlls/winepulse.drv/pulse.c b/dlls/winepulse.drv/pulse.c
index 5e3ddcc9b6e..34955a5ee8d 100644
--- a/dlls/winepulse.drv/pulse.c
+++ b/dlls/winepulse.drv/pulse.c
@@ -327,12 +327,11 @@ static NTSTATUS pulse_get_endpoint_ids(void *args)
     struct list *list = (params->flow == eRender) ? &g_phys_speakers : &g_phys_sources;
     struct endpoint *endpoint = params->endpoints;
     DWORD len, name_len, needed;
+    unsigned int offset;
     PhysDevice *dev;
-    char *ptr;
 
     params->num = list_count(list);
-    needed = params->num * sizeof(*params->endpoints);
-    ptr = (char*)(endpoint + params->num);
+    offset = needed = params->num * sizeof(*params->endpoints);
 
     LIST_FOR_EACH_ENTRY(dev, list, PhysDevice, entry) {
         name_len = lstrlenW(dev->name) + 1;
@@ -340,12 +339,12 @@ static NTSTATUS pulse_get_endpoint_ids(void *args)
         needed += name_len * sizeof(WCHAR) + ((len + 1) & ~1);
 
         if (needed <= params->size) {
-            endpoint->name = (WCHAR*)ptr;
-            memcpy(endpoint->name, dev->name, name_len * sizeof(WCHAR));
-            ptr += name_len * sizeof(WCHAR);
-            endpoint->pulse_name = ptr;
-            memcpy(endpoint->pulse_name, dev->pulse_name, len);
-            ptr += (len + 1) & ~1;
+            endpoint->name = offset;
+            memcpy((char *)params->endpoints + offset, dev->name, name_len * sizeof(WCHAR));
+            offset += name_len * sizeof(WCHAR);
+            endpoint->pulse_name = offset;
+            memcpy((char *)params->endpoints + offset, dev->pulse_name, len);
+            offset += (len + 1) & ~1;
             endpoint++;
         }
     }
diff --git a/dlls/winepulse.drv/unixlib.h b/dlls/winepulse.drv/unixlib.h
index e09362f0751..8d48af7dedc 100644
--- a/dlls/winepulse.drv/unixlib.h
+++ b/dlls/winepulse.drv/unixlib.h
@@ -39,8 +39,8 @@ struct pulse_config
 
 struct endpoint
 {
-    WCHAR *name;
-    char *pulse_name;
+    unsigned int name;
+    unsigned int pulse_name;
 };
 
 struct main_loop_params
-- 
2.25.1




More information about the wine-devel mailing list