PWINE_ACMLOCALDRIVERINST MSACM_OpenLocalDriver(PWINE_ACMLOCALDRIVER paldrv, LPARAM lParam2) { PWINE_ACMLOCALDRIVERINST pDrvInst; pDrvInst = HeapAlloc(MSACM_hHeap, 0, sizeof(WINE_ACMLOCALDRIVERINST)); if (!pDrvInst) return NULL; pDrvInst->pLocalDriver = paldrv; pDrvInst->dwDriverID = 0; pDrvInst->pNextACMInst = NULL; pDrvInst->bSession = FALSE; /* Win32 installable drivers must support a two phase opening scheme: * + first open with NULL as lParam2 (session instance), * + then do a second open with the real non null lParam2) */ if (MSACM_GetNumberOfModuleRefs(paldrv->hModule, paldrv->lpDrvProc, NULL) == 0 && lParam2) { PWINE_ACMLOCALDRIVERINST ret; if (!MSACM_AddToList(pDrvInst, 0L)) { ERR("load0 failed\n"); goto exit; } ret = MSACM_OpenLocalDriver(paldrv, lParam2); if (!ret) { ERR("load1 failed\n"); /* If MSACM_CloseLocalDriver returns TRUE, * then pDrvInst has been freed */ if (!MSACM_CloseLocalDriver(pDrvInst)) goto exit; return NULL; } pDrvInst->bSession = TRUE; return ret; } if (!MSACM_AddToList(pDrvInst, lParam2)) { ERR("load failed\n"); goto exit; } TRACE("=> %p\n", pDrvInst); return pDrvInst; exit: HeapFree(MSACM_hHeap, 0, pDrvInst); return NULL; }
/*********************************************************************** * acmDriverClose (MSACM32.@) */ MMRESULT WINAPI acmDriverClose(HACMDRIVER had, DWORD fdwClose) { PWINE_ACMDRIVER pad; PWINE_ACMDRIVERID padid; PWINE_ACMDRIVER* tpad; TRACE("(%p, %08x)\n", had, fdwClose); if (fdwClose) { WARN("invalid flag\n"); return MMSYSERR_INVALFLAG; } pad = MSACM_GetDriver(had); if (!pad) { WARN("invalid handle\n"); return MMSYSERR_INVALHANDLE; } padid = pad->obj.pACMDriverID; /* remove driver from list */ for (tpad = &(padid->pACMDriverList); *tpad; tpad = &((*tpad)->pNextACMDriver)) { if (*tpad == pad) { *tpad = (*tpad)->pNextACMDriver; break; } } /* close driver if it has been opened */ if (pad->hDrvr && !pad->pLocalDrvrInst) CloseDriver(pad->hDrvr, 0, 0); else if (pad->pLocalDrvrInst) MSACM_CloseLocalDriver(pad->pLocalDrvrInst); pad->obj.dwType = 0; HeapFree(MSACM_hHeap, 0, pad); return MMSYSERR_NOERROR; }