diff --git a/dlls/msacm32/internal.c b/dlls/msacm32/internal.c
index e1ad05f..8b2c7e5 100644
--- a/dlls/msacm32/internal.c
+++ b/dlls/msacm32/internal.c
@@ -1,7 +1,10 @@
+/* -*- tab-width: 8; c-basic-offset: 4 -*- */
+
 /*
  *      MSACM32 library
  *
  *      Copyright 1998  Patrik Stridvall
+ *		  1999	Eric Pouech
  */
 
 #include <string.h>
@@ -14,8 +17,11 @@
 #include "mmsystem.h"
 #include "msacm.h"
 #include "msacmdrv.h"
+#include "wineacm.h"
 #include "debugtools.h"
 
+DEFAULT_DEBUG_CHANNEL(msacm)	
+
 /**********************************************************************/
 
 HANDLE MSACM_hHeap = (HANDLE) NULL;
@@ -25,89 +31,66 @@
 /***********************************************************************
  *           MSACM_RegisterDriver32() 
  */
-PWINE_ACMDRIVERID MSACM_RegisterDriver(
-  LPSTR pszDriverAlias, LPSTR pszFileName,
-  PWINE_ACMLOCALDRIVER pLocalDriver)
-{
-  PWINE_ACMDRIVERID padid;
-  padid = (PWINE_ACMDRIVERID) HeapAlloc(
-    MSACM_hHeap, 0, sizeof(WINE_ACMDRIVERID)
-  );
-  padid->pszDriverAlias = 
-    HEAP_strdupA(MSACM_hHeap, 0, pszDriverAlias);
-  padid->pszFileName = 
-    HEAP_strdupA(MSACM_hHeap, 0, pszFileName);
-  padid->pACMLocalDriver = pLocalDriver; 
-  padid->bEnabled = TRUE;
-  padid->pACMDriver = NULL;
-  padid->pNextACMDriverID = NULL;
-  padid->pPreviousACMDriverID = 
-    MSACM_pLastACMDriverID;
-  MSACM_pLastACMDriverID = padid;
-  if(!MSACM_pFirstACMDriverID)
-    MSACM_pFirstACMDriverID = padid;
+PWINE_ACMDRIVERID MSACM_RegisterDriver(LPSTR pszDriverAlias, LPSTR pszFileName,
+				       HINSTANCE hinstModule)
+{ 
+    PWINE_ACMDRIVERID padid;
 
-  return padid;
+    TRACE("('%s', '%s', 0x%08x)\n", pszDriverAlias, pszFileName, hinstModule);
+
+    padid = (PWINE_ACMDRIVERID) HeapAlloc(MSACM_hHeap, 0, sizeof(WINE_ACMDRIVERID));
+    padid->pszDriverAlias = HEAP_strdupA(MSACM_hHeap, 0, pszDriverAlias);
+    padid->pszFileName = HEAP_strdupA(MSACM_hHeap, 0, pszFileName);
+    padid->hInstModule = hinstModule;
+    padid->bEnabled = TRUE;
+    padid->pACMDriver = NULL;
+    padid->pNextACMDriverID = NULL;
+    padid->pPreviousACMDriverID = MSACM_pLastACMDriverID;
+    if (MSACM_pLastACMDriverID)
+	MSACM_pLastACMDriverID->pNextACMDriverID = padid;
+    MSACM_pLastACMDriverID = padid;
+    if (!MSACM_pFirstACMDriverID)
+	MSACM_pFirstACMDriverID = padid;
+    
+    return padid;
 }
 
 /***********************************************************************
  *           MSACM_RegisterAllDrivers32() 
  */
-void MSACM_RegisterAllDrivers()
+void MSACM_RegisterAllDrivers(void)
 {
-  PWINE_ACMBUILTINDRIVER pbd;
-  LPSTR pszBuffer;
-  DWORD dwBufferLength;
-
-  /* FIXME 
-   *  What if the user edits system.ini while the program is running?
-   *  Does Windows handle that?
-   */
-  if(!MSACM_pFirstACMDriverID)
-    return;
-
-  /* FIXME: Do not work! How do I determine the section length? */
-  dwBufferLength = 
-    GetPrivateProfileSectionA("drivers32", NULL, 0, "system.ini");
-
-  pszBuffer = (LPSTR) HeapAlloc(
-    MSACM_hHeap, 0, dwBufferLength
-  );
-  if(GetPrivateProfileSectionA(
-    "drivers32", pszBuffer, dwBufferLength, "system.ini"))
-    {
-      char *s = pszBuffer;
-      while(*s)
-	{
-	  if(!lstrncmpiA("MSACM.", s, 6))
-	    {
-	      char *s2 = s;
-	      while(*s2 != '\0' && *s2 != '=') s2++;
-	      if(*s2)
-		{
-		  *s2++='\0';
-		  MSACM_RegisterDriver(s, s2, NULL);
+    LPSTR pszBuffer;
+    DWORD dwBufferLength;
+    
+    /* FIXME 
+     *  What if the user edits system.ini while the program is running?
+     *  Does Windows handle that?
+     */
+    if (MSACM_pFirstACMDriverID)
+	return;
+    
+    /* FIXME: Do not work! How do I determine the section length? */
+    dwBufferLength = 1024;
+/* EPP 	GetPrivateProfileSectionA("drivers32", NULL, 0, "system.ini"); */
+    
+    pszBuffer = (LPSTR) HeapAlloc(MSACM_hHeap, 0, dwBufferLength);
+    if (GetPrivateProfileSectionA("drivers32", pszBuffer, dwBufferLength, "system.ini")) {
+	char* s = pszBuffer;
+	while (*s) {
+	    if (!lstrncmpiA("MSACM.", s, 6)) {
+		char *s2 = s;
+		while (*s2 != '\0' && *s2 != '=') s2++;
+		if (*s2) {
+		    *s2++ = '\0';
+		    MSACM_RegisterDriver(s, s2, 0);
 		}
 	    }  
-	  s += lstrlenA(s) + 1; /* Either next char or \0 */
+	    s += lstrlenA(s) + 1; /* Either next char or \0 */
 	}
     }
-
-  /* FIXME
-   *   Check if any of the builtin driver was added
-   *   when the external drivers was. 
-   */
-
-  pbd = MSACM_BuiltinDrivers;
-  while(pbd->pszDriverAlias)
-    {
-      PWINE_ACMLOCALDRIVER pld;
-      pld = HeapAlloc(MSACM_hHeap, 0, sizeof(WINE_ACMLOCALDRIVER));
-      pld->pfnDriverProc = pbd->pfnDriverProc;
-      MSACM_RegisterDriver(pbd->pszDriverAlias, NULL, pld);
-      pbd++;
-    }
-   HeapFree(MSACM_hHeap, 0, pszBuffer);
+    
+    HeapFree(MSACM_hHeap, 0, pszBuffer);
 }
 
 /***********************************************************************
@@ -115,28 +98,31 @@
  */
 PWINE_ACMDRIVERID MSACM_UnregisterDriver(PWINE_ACMDRIVERID p)
 {
-  PWINE_ACMDRIVERID pNextACMDriverID;
+    PWINE_ACMDRIVERID pNextACMDriverID;
+    
+    if (p->pACMDriver)
+	acmDriverClose((HACMDRIVER) p->pACMDriver, 0);
+    
+    if (p->pszDriverAlias)
+	HeapFree(MSACM_hHeap, 0, p->pszDriverAlias);
+    if (p->pszFileName)
+	HeapFree(MSACM_hHeap, 0, p->pszFileName);
+    
+    if (p == MSACM_pFirstACMDriverID)
+	MSACM_pFirstACMDriverID = p->pNextACMDriverID;
+    if (p == MSACM_pLastACMDriverID)
+	MSACM_pLastACMDriverID = p->pPreviousACMDriverID;
 
-  if(p->pACMDriver)
-    acmDriverClose((HACMDRIVER) p->pACMDriver, 0);
-
-  if(p->pszDriverAlias)
-    HeapFree(MSACM_hHeap, 0, p->pszDriverAlias);
-  if(p->pszFileName)
-    HeapFree(MSACM_hHeap, 0, p->pszFileName);
-  if(p->pACMLocalDriver)
-    HeapFree(MSACM_hHeap, 0, p->pACMLocalDriver);
-
-  if(p->pPreviousACMDriverID)
-    p->pPreviousACMDriverID->pNextACMDriverID = p->pNextACMDriverID;
-  if(p->pNextACMDriverID)
-    p->pNextACMDriverID->pPreviousACMDriverID = p->pPreviousACMDriverID;
-
-  pNextACMDriverID = p->pNextACMDriverID;
-
-  HeapFree(MSACM_hHeap, 0, p);
-
-  return pNextACMDriverID;
+    if (p->pPreviousACMDriverID)
+	p->pPreviousACMDriverID->pNextACMDriverID = p->pNextACMDriverID;
+    if (p->pNextACMDriverID)
+	p->pNextACMDriverID->pPreviousACMDriverID = p->pPreviousACMDriverID;
+    
+    pNextACMDriverID = p->pNextACMDriverID;
+    
+    HeapFree(MSACM_hHeap, 0, p);
+    
+    return pNextACMDriverID;
 }
 
 /***********************************************************************
@@ -144,10 +130,11 @@
  * FIXME
  *   Where should this function be called?
  */
-void MSACM_UnregisterAllDrivers()
+void MSACM_UnregisterAllDrivers(void)
 {
-  PWINE_ACMDRIVERID p = MSACM_pFirstACMDriverID;
-  while(p) p = MSACM_UnregisterDriver(p);
+    PWINE_ACMDRIVERID p;
+
+    for (p = MSACM_pFirstACMDriverID; p; p = MSACM_UnregisterDriver(p));
 }
 
 /***********************************************************************
@@ -155,7 +142,7 @@
  */
 PWINE_ACMDRIVERID MSACM_GetDriverID(HACMDRIVERID hDriverID)
 {
-  return (PWINE_ACMDRIVERID) hDriverID;
+    return (PWINE_ACMDRIVERID)hDriverID;
 }
 
 /***********************************************************************
@@ -163,7 +150,7 @@
  */
 PWINE_ACMDRIVER MSACM_GetDriver(HACMDRIVER hDriver)
 {
-  return (PWINE_ACMDRIVER) hDriver;
+    return (PWINE_ACMDRIVER)hDriver;
 }
 
 /***********************************************************************
@@ -171,32 +158,7 @@
  */
 PWINE_ACMOBJ MSACM_GetObj(HACMOBJ hObj)
 {
-  return (PWINE_ACMOBJ) hObj;
+    return (PWINE_ACMOBJ)hObj;
 }
 
-/***********************************************************************
- *           MSACM_OpenDriverProc32
- * FIXME
- *  This function should be integrated with OpenDriver,
- *  renamed and moved there.
- */
-HDRVR MSACM_OpenDriverProc(DRIVERPROC pfnDriverProc)
-{
-#if 0
-  LPDRIVERITEMA pDrvr;
-
-  /* FIXME: This is a very bad solution */
-  pDrvr = (LPDRIVERITEMA) HeapAlloc(MSACM_hHeap, HEAP_ZERO_MEMORY, sizeof(DRIVERITEMA));
-  pDrvr->count = 1;
-  pDrvr->driverproc = pfnDriverProc;
-  
-  /* FIXME: Send DRV_OPEN among others to DriverProc */
-
-  return (HDRVR) pDrvr;
-#else
-  return (HDRVR) 0;
-#endif
-}
-
-
 
