From: Davide Beatrici git@davidebeatrici.dev
In preparation for calling the audio driver's UNIX functions directly. --- dlls/mmdevapi/main.c | 20 ++++++++++++++------ dlls/mmdevapi/mmdevapi.h | 2 ++ 2 files changed, 16 insertions(+), 6 deletions(-)
diff --git a/dlls/mmdevapi/main.c b/dlls/mmdevapi/main.c index c792661af33..43fc03f3aa3 100644 --- a/dlls/mmdevapi/main.c +++ b/dlls/mmdevapi/main.c @@ -65,23 +65,28 @@ static const char *get_priority_string(int prio)
static BOOL load_driver(const WCHAR *name, DriverFuncs *driver) { - WCHAR driver_module[264]; + NTSTATUS status;
+ WCHAR driver_module[264]; lstrcpyW(driver_module, L"wine"); lstrcatW(driver_module, name); lstrcatW(driver_module, L".drv");
TRACE("Attempting to load %s\n", wine_dbgstr_w(driver_module));
- driver->module = LoadLibraryW(driver_module); - if(!driver->module){ - TRACE("Unable to load %s: %lu\n", wine_dbgstr_w(driver_module), - GetLastError()); + if (!(driver->module = LoadLibraryW(driver_module))) { + ERR("Unable to load %s: %lu\n", wine_dbgstr_w(driver_module), GetLastError()); return FALSE; }
+ if ((status = NtQueryVirtualMemory(GetCurrentProcess(), driver->module, MemoryWineUnixFuncs, + &driver->module_unixlib, sizeof(driver->module_unixlib), NULL))) { + ERR("Unable to load UNIX functions: %lx\n", status); + goto fail; + } + #define LDFC(n) do { driver->p##n = (void*)GetProcAddress(driver->module, #n);\ - if(!driver->p##n) { FreeLibrary(driver->module); return FALSE; } } while(0) + if(!driver->p##n) { goto fail; } } while(0) LDFC(GetPriority); LDFC(GetEndpointIDs); LDFC(GetAudioEndpoint); @@ -98,6 +103,9 @@ static BOOL load_driver(const WCHAR *name, DriverFuncs *driver) wine_dbgstr_w(driver_module), get_priority_string(driver->priority));
return TRUE; +fail: + FreeLibrary(driver->module); + return FALSE; }
static BOOL WINAPI init_driver(INIT_ONCE *once, void *param, void **context) diff --git a/dlls/mmdevapi/mmdevapi.h b/dlls/mmdevapi/mmdevapi.h index d694a3930aa..410d958bf46 100644 --- a/dlls/mmdevapi/mmdevapi.h +++ b/dlls/mmdevapi/mmdevapi.h @@ -19,12 +19,14 @@ #include "unixlib.h"
#include <wine/list.h> +#include <wine/unixlib.h>
extern HRESULT MMDevEnum_Create(REFIID riid, void **ppv) DECLSPEC_HIDDEN; extern void MMDevEnum_Free(void) DECLSPEC_HIDDEN;
typedef struct _DriverFuncs { HMODULE module; + unixlib_handle_t module_unixlib; WCHAR module_name[64]; int priority;