Home | Info | Community | Development | myReactOS | Contact Us
Definition at line 395 of file driver.c.
Referenced by acmDriverMessage().
{ TRACE("(%p, %04x, %08lx, %08lx\n", had, uMsg, lParam1, lParam2); if ((uMsg >= ACMDM_USER && uMsg < ACMDM_RESERVED_LOW) || uMsg == ACMDM_DRIVER_ABOUT || uMsg == DRV_QUERYCONFIGURE || uMsg == DRV_CONFIGURE) { PWINE_ACMDRIVERID padid; LRESULT lResult; LPDRVCONFIGINFO pConfigInfo = NULL; LPWSTR section_name = NULL; LPWSTR alias_name = NULL; /* Check whether handle is an HACMDRIVERID */ padid = MSACM_GetDriverID((HACMDRIVERID)had); /* If the message is DRV_CONFIGURE, and the application provides no DRVCONFIGINFO structure, msacm must supply its own. */ if (uMsg == DRV_CONFIGURE && lParam2 == 0) { LPWSTR pAlias; /* Get the alias from the HACMDRIVERID */ if (padid) { pAlias = padid->pszDriverAlias; if (pAlias == NULL) { WARN("DRV_CONFIGURE: no alias for this driver, cannot self-supply alias\n"); } } else { FIXME("DRV_CONFIGURE: reverse lookup HACMDRIVER -> HACMDRIVERID not implemented\n"); pAlias = NULL; } if (pAlias != NULL) { /* DRVCONFIGINFO is only 12 bytes long, but native msacm * reports a 16-byte structure to codecs, so allocate 16 bytes, * just to be on the safe side. */ const unsigned int iStructSize = 16; pConfigInfo = HeapAlloc(MSACM_hHeap, 0, iStructSize); if (!pConfigInfo) { ERR("OOM while supplying DRVCONFIGINFO for DRV_CONFIGURE, using NULL\n"); } else { static const WCHAR drivers32[] = {'D','r','i','v','e','r','s','3','2','\0'}; pConfigInfo->dwDCISize = iStructSize; section_name = HeapAlloc(MSACM_hHeap, 0, (strlenW(drivers32) + 1) * sizeof(WCHAR)); if (section_name) strcpyW(section_name, drivers32); pConfigInfo->lpszDCISectionName = section_name; alias_name = HeapAlloc(MSACM_hHeap, 0, (strlenW(pAlias) + 1) * sizeof(WCHAR)); if (alias_name) strcpyW(alias_name, pAlias); pConfigInfo->lpszDCIAliasName = alias_name; if (pConfigInfo->lpszDCISectionName == NULL || pConfigInfo->lpszDCIAliasName == NULL) { HeapFree(MSACM_hHeap, 0, alias_name); HeapFree(MSACM_hHeap, 0, section_name); HeapFree(MSACM_hHeap, 0, pConfigInfo); pConfigInfo = NULL; ERR("OOM while supplying DRVCONFIGINFO for DRV_CONFIGURE, using NULL\n"); } } } lParam2 = (LPARAM)pConfigInfo; } if (padid) { /* Handle is really an HACMDRIVERID, must have an open session to get an HACMDRIVER */ if (padid->pACMDriverList != NULL) { lResult = MSACM_Message((HACMDRIVER)padid->pACMDriverList, uMsg, lParam1, lParam2); } else { MMRESULT mmr = acmDriverOpen(&had, (HACMDRIVERID)padid, 0); if (mmr != MMSYSERR_NOERROR) { lResult = MMSYSERR_INVALPARAM; } else { lResult = acmDriverMessage(had, uMsg, lParam1, lParam2); acmDriverClose(had, 0); } } } else { lResult = MSACM_Message(had, uMsg, lParam1, lParam2); } if (pConfigInfo) { HeapFree(MSACM_hHeap, 0, alias_name); HeapFree(MSACM_hHeap, 0, section_name); HeapFree(MSACM_hHeap, 0, pConfigInfo); } return lResult; } WARN("invalid parameter\n"); return MMSYSERR_INVALPARAM; }