Alex VillacÃs Lasso : MSACM: acmDriverAddW skeleton, implementation of ACM_DRIVERADDF_NAME.
Alexandre Julliard
julliard at wine.codeweavers.com
Wed Jan 18 05:28:40 CST 2006
Module: wine
Branch: refs/heads/master
Commit: 72f7170e06179a392b320e15f846dadc29f7ab9a
URL: http://source.winehq.org/git/?p=wine.git;a=commit;h=72f7170e06179a392b320e15f846dadc29f7ab9a
Author: Alex Villacís Lasso <a_villacis at palosanto.com>
Date: Wed Jan 18 12:07:42 2006 +0100
MSACM: acmDriverAddW skeleton, implementation of ACM_DRIVERADDF_NAME.
- Rework acmDriverAddA to call acmDriverAddW.
- Implement stub for acmDriverAddW with switch for the 3 known cases
of driver add.
- Implementation for case ACM_DRIVERADDF_NAME, which loads driver name
& alias from registry (similar to msacm32 load).
---
dlls/msacm/driver.c | 97 ++++++++++++++++++++++++++++++++++++++++++-------
dlls/msacm/internal.c | 37 +++++++++++++++++++
dlls/msacm/wineacm.h | 2 +
3 files changed, 122 insertions(+), 14 deletions(-)
diff --git a/dlls/msacm/driver.c b/dlls/msacm/driver.c
index 302cfee..4356273 100644
--- a/dlls/msacm/driver.c
+++ b/dlls/msacm/driver.c
@@ -49,6 +49,10 @@ WINE_DEFAULT_DEBUG_CHANNEL(msacm);
MMRESULT WINAPI acmDriverAddA(PHACMDRIVERID phadid, HINSTANCE hinstModule,
LPARAM lParam, DWORD dwPriority, DWORD fdwAdd)
{
+ MMRESULT resultW;
+ WCHAR * driverW = NULL;
+ LPARAM lParamW = lParam;
+
TRACE("(%p, %p, %08lx, %08lx, %08lx)\n",
phadid, hinstModule, lParam, dwPriority, fdwAdd);
@@ -72,30 +76,95 @@ MMRESULT WINAPI acmDriverAddA(PHACMDRIVE
return MMSYSERR_INVALFLAG;
}
- /* FIXME: in fact, should GetModuleFileName(hinstModule) and do a
- * LoadDriver on it, to be sure we can call SendDriverMessage on the
- * hDrvr handle.
- */
- *phadid = (HACMDRIVERID) MSACM_RegisterDriver(NULL, NULL, hinstModule);
-
- /* FIXME: lParam, dwPriority and fdwAdd ignored */
+ /* A->W translation of name */
+ if ((fdwAdd & ACM_DRIVERADDF_TYPEMASK) == ACM_DRIVERADDF_NAME) {
+ unsigned long len;
+
+ if (lParam == 0) return MMSYSERR_INVALPARAM;
+ len = MultiByteToWideChar(CP_ACP, 0, (LPSTR)lParam, -1, NULL, 0);
+ driverW = HeapAlloc(MSACM_hHeap, 0, len * sizeof(WCHAR));
+ if (!driverW) return MMSYSERR_NOMEM;
+ MultiByteToWideChar(CP_ACP, 0, (LPSTR)lParam, -1, driverW, len);
+ lParamW = (LPARAM)driverW;
+ }
- return MMSYSERR_NOERROR;
+ resultW = acmDriverAddW(phadid, hinstModule, lParamW, dwPriority, fdwAdd);
+ HeapFree(MSACM_hHeap, 0, driverW);
+ return resultW;
}
/***********************************************************************
* acmDriverAddW (MSACM32.@)
- * FIXME
- * Not implemented
+ *
*/
MMRESULT WINAPI acmDriverAddW(PHACMDRIVERID phadid, HINSTANCE hinstModule,
LPARAM lParam, DWORD dwPriority, DWORD fdwAdd)
{
- FIXME("(%p, %p, %ld, %ld, %ld): stub\n",
- phadid, hinstModule, lParam, dwPriority, fdwAdd);
+ TRACE("(%p, %p, %08lx, %08lx, %08lx)\n",
+ phadid, hinstModule, lParam, dwPriority, fdwAdd);
+
+ if (!phadid) {
+ WARN("invalid parameter\n");
+ return MMSYSERR_INVALPARAM;
+ }
+
+ /* Check if any unknown flags */
+ if (fdwAdd &
+ ~(ACM_DRIVERADDF_FUNCTION|ACM_DRIVERADDF_NOTIFYHWND|
+ ACM_DRIVERADDF_GLOBAL)) {
+ WARN("invalid flag\n");
+ return MMSYSERR_INVALFLAG;
+ }
+
+ /* Check if any incompatible flags */
+ if ((fdwAdd & ACM_DRIVERADDF_FUNCTION) &&
+ (fdwAdd & ACM_DRIVERADDF_NOTIFYHWND)) {
+ WARN("invalid flag\n");
+ return MMSYSERR_INVALFLAG;
+ }
+
+ switch (fdwAdd & ACM_DRIVERADDF_TYPEMASK) {
+ case ACM_DRIVERADDF_NAME:
+ /*
+ hInstModule (unused)
+ lParam name of value in HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Drivers32
+ dwPriority (unused, set to 0)
+ */
+ *phadid = (HACMDRIVERID) MSACM_RegisterDriverFromRegistry((LPCWSTR)lParam);
+ if (!*phadid) {
+ ERR("Unable to register driver via ACM_DRIVERADDF_NAME\n");
+ return MMSYSERR_INVALPARAM;
+ }
+ break;
+ case ACM_DRIVERADDF_FUNCTION:
+ /*
+ hInstModule Handle of module which contains driver entry proc
+ lParam Driver function address
+ dwPriority (unused, set to 0)
+ */
+ fdwAdd &= ~ACM_DRIVERADDF_TYPEMASK;
+
+ *phadid = 0;
+ FIXME("(%p, %p, %ld, %ld, %ld): ACM_DRIVERADDF_FUNCTION: stub\n", phadid, hinstModule, lParam, dwPriority, fdwAdd);
+ SetLastError(ERROR_CALL_NOT_IMPLEMENTED);
+ return MMSYSERR_ERROR;
+ case ACM_DRIVERADDF_NOTIFYHWND:
+ /*
+ hInstModule (unused)
+ lParam Handle of notification window
+ dwPriority Window message to send for notification broadcasts
+ */
+ *phadid = 0;
+ FIXME("(%p, %p, %ld, %ld, %ld): ACM_DRIVERADDF_NOTIFYHWND: stub\n", phadid, hinstModule, lParam, dwPriority, fdwAdd);
+ SetLastError(ERROR_CALL_NOT_IMPLEMENTED);
+ return MMSYSERR_ERROR;
+ default:
+ ERR("invalid flag value 0x%08lx for fdwAdd\n", fdwAdd & ACM_DRIVERADDF_TYPEMASK);
+ return MMSYSERR_INVALFLAG;
+ }
- SetLastError(ERROR_CALL_NOT_IMPLEMENTED);
- return MMSYSERR_ERROR;
+ MSACM_BroadcastNotification();
+ return MMSYSERR_NOERROR;
}
/***********************************************************************
diff --git a/dlls/msacm/internal.c b/dlls/msacm/internal.c
index a5eb350..b83f632 100644
--- a/dlls/msacm/internal.c
+++ b/dlls/msacm/internal.c
@@ -51,6 +51,43 @@ static BOOL MSACM_pendingBroadcast = FAL
static void MSACM_ReorderDriversByPriority(void);
+/***********************************************************************
+ * MSACM_RegisterDriverFromRegistry()
+ */
+PWINE_ACMDRIVERID MSACM_RegisterDriverFromRegistry(LPCWSTR pszRegEntry)
+{
+ static const WCHAR msacmW[] = {'M','S','A','C','M','.'};
+ static const WCHAR drvkey[] = {'S','o','f','t','w','a','r','e','\\',
+ 'M','i','c','r','o','s','o','f','t','\\',
+ 'W','i','n','d','o','w','s',' ','N','T','\\',
+ 'C','u','r','r','e','n','t','V','e','r','s','i','o','n','\\',
+ 'D','r','i','v','e','r','s','3','2','\0'};
+ WCHAR buf[2048];
+ DWORD bufLen, lRet;
+ HKEY hKey;
+ PWINE_ACMDRIVERID padid = NULL;
+
+ /* The requested registry entry must have the format msacm.XXXXX in order to
+ be recognized in any future sessions of msacm
+ */
+ if (0 == strncmpiW(buf, msacmW, sizeof(msacmW)/sizeof(WCHAR))) {
+ lRet = RegOpenKeyExW(HKEY_LOCAL_MACHINE, drvkey, 0, KEY_QUERY_VALUE, &hKey);
+ if (lRet != ERROR_SUCCESS) {
+ WARN("unable to open registry key - 0x%08lx\n", lRet);
+ } else {
+ bufLen = sizeof(buf);
+ lRet = RegQueryValueExW(hKey, pszRegEntry, NULL, NULL, (LPBYTE)buf, &bufLen);
+ if (lRet != ERROR_SUCCESS) {
+ WARN("unable to query requested subkey %s - 0x%08lx\n", debugstr_w(pszRegEntry), lRet);
+ } else {
+ MSACM_RegisterDriver(pszRegEntry, buf, 0);
+ }
+ RegCloseKey( hKey );
+ }
+ }
+ return padid;
+}
+
#if 0
/***********************************************************************
* MSACM_DumpCache
diff --git a/dlls/msacm/wineacm.h b/dlls/msacm/wineacm.h
index 0a3af41..e9b9247 100644
--- a/dlls/msacm/wineacm.h
+++ b/dlls/msacm/wineacm.h
@@ -354,6 +354,8 @@ extern void MSACM_BroadcastNotification(
extern void MSACM_DisableNotifications(void);
extern void MSACM_EnableNotifications(void);
+extern PWINE_ACMDRIVERID MSACM_RegisterDriverFromRegistry(LPCWSTR pszRegEntry);
+
/* From msacm32.c */
extern HINSTANCE MSACM_hInstance32;
More information about the wine-cvs
mailing list