diff --git a/reactos/boot/bootdata/hivesft.inf b/reactos/boot/bootdata/hivesft.inf index ab324f81129..7478bc3664b 100644 --- a/reactos/boot/bootdata/hivesft.inf +++ b/reactos/boot/bootdata/hivesft.inf @@ -25,6 +25,12 @@ HKLM,"Software\Microsoft\Windows NT\CurrentVersion\Image File Execution Options\ ;HKLM,"Software\Microsoft\Windows NT\CurrentVersion\Image File Execution Options\soffice.exe","GlobalFlag",0x00000000,"0x00000002" ;HKLM,"Software\Microsoft\Windows NT\CurrentVersion\Image File Execution Options\tlstest.exe","GlobalFlag",0x00000000,"0x00000002" +; MME - TODO: Should not require full paths! +HKLM,"SOFTWARE\Microsoft\Windows NT\CurrentVersion\Drivers32","midimapper",0x00000000,"c:\reactos\system32\midimap.dll" +HKLM,"SOFTWARE\Microsoft\Windows NT\CurrentVersion\Drivers32","wavemapper",0x00000000,"c:\reactos\system32\msacm32.dll" +;HKLM,"SOFTWARE\Microsoft\Windows NT\CurrentVersion\Drivers32","wave",0x00000000,"sndblst.dll" +HKLM,"SOFTWARE\Microsoft\Windows NT\CurrentVersion\Drivers32","midi",0x00000000,"c:\reactos\system32\beepmidi.dll" + ; Mesa OpenGL Driver HKLM,"SOFTWARE\Microsoft\Windows NT\CurrentVersion\OpenGLDrivers","DefaultDriver",0x00000000,"Mesa" HKLM,"SOFTWARE\Microsoft\Windows NT\CurrentVersion\OpenGLDrivers\Mesa","Version",0x00010001,0x00000002 diff --git a/reactos/boot/bootdata/packages/reactos.dff b/reactos/boot/bootdata/packages/reactos.dff index b32cf58ce37..1142a1a56d2 100644 --- a/reactos/boot/bootdata/packages/reactos.dff +++ b/reactos/boot/bootdata/packages/reactos.dff @@ -251,6 +251,7 @@ dll\win32\ws2help\ws2help.dll 1 dll\win32\wshirda\wshirda.dll 1 dll\win32\wsock32\wsock32.dll 1 dll\win32\wtsapi32\wtsapi32.dll 1 +dll\win32\beepmidi\beepmidi.dll 1 ; Drivers diff --git a/reactos/dll/win32/beepmidi/beepmidi.c b/reactos/dll/win32/beepmidi/beepmidi.c index f3b3a3c71ea..ba50ffe6342 100644 --- a/reactos/dll/win32/beepmidi/beepmidi.c +++ b/reactos/dll/win32/beepmidi/beepmidi.c @@ -51,8 +51,8 @@ #include #include -#define DPRINT printf -//#define DPRINT // +/*#define DPRINT printf*/ +#define DPRINT FakePrintf /* A few MIDI command categories */ #define MIDI_NOTE_OFF 0x80 diff --git a/reactos/dll/win32/winmm/lolvldrv.c b/reactos/dll/win32/winmm/lolvldrv.c index 095dbb7f337..80f53a433c2 100644 --- a/reactos/dll/win32/winmm/lolvldrv.c +++ b/reactos/dll/win32/winmm/lolvldrv.c @@ -620,7 +620,7 @@ static BOOL MMDRV_InitPerType(LPWINE_MM_DRIVER lpDrv, UINT type, UINT wMsg) /************************************************************************** * MMDRV_Install [internal] */ -static BOOL MMDRV_Install(LPCSTR drvRegName, LPCSTR drvFileName, BOOL bIsMapper) +BOOL MMDRV_Install(LPCSTR drvRegName, LPCSTR drvFileName, BOOL bIsMapper) { int i, count = 0; LPWINE_MM_DRIVER lpDrv = &MMDrvs[MMDrvsHi]; @@ -723,6 +723,8 @@ static BOOL MMDRV_Install(LPCSTR drvRegName, LPCSTR drvFileName, BOOL bIsMapper) */ BOOL MMDRV_Init(void) { +/* Redundant code, keeping this for reference only (for now) */ +#if 0 HKEY hKey; char driver_buffer[256]; char mapper_buffer[256]; @@ -743,13 +745,21 @@ BOOL MMDRV_Init(void) strcpy(driver_buffer, WINE_DEFAULT_WINMM_DRIVER); } - // AG: TESTING: - ret |= MMDRV_Install("mmdrv.dll", "mmdrv.dll", FALSE); + ret |= MMDRV_Install("beepmidi.dll", "beepmidi.dll", FALSE); ret |= MMDRV_Install("wavemapper", WINE_DEFAULT_WINMM_MAPPER, TRUE); ret |= MMDRV_Install("midimapper", WINE_DEFAULT_WINMM_MIDI, TRUE); return ret; +#else + INT driver_count = 0; + driver_count += LoadRegistryMMEDrivers(NT_MME_DRIVERS_KEY); + driver_count += LoadRegistryMMEDrivers(NT_MME_DRIVERS32_KEY); + + /* Explorer doesn't like us failing */ + return TRUE; +// return ( driver_count > 0 ); +#endif } /****************************************************************** diff --git a/reactos/dll/win32/winmm/registry.c b/reactos/dll/win32/winmm/registry.c new file mode 100644 index 00000000000..79f1fc427bd --- /dev/null +++ b/reactos/dll/win32/winmm/registry.c @@ -0,0 +1,134 @@ +/* + MME User-Mode Driver Support + (c) Andrew Greenwood, 2007. + + This is intended for use with WINE's winmm.dll to allow it to find + and load appropriate drivers from the correct (Windows) registry keys. + + By default, WINE's winmm.dll will look in: + HKEY_CURRENT_USER\Software\Wine\Drivers + + Here it determines the driver to load based on a value called "Audio". + + Windows NT stores a list of drivers in: + HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Drivers32 + + TODO: Handle system.ini +*/ + +#include +#include "winemm.h" +#include "wine/debug.h" + +WINE_DEFAULT_DEBUG_CHANNEL(winmm); + +BOOL LoadRegistryMMEDrivers(char* key) +{ + INT driver_count = 0; + INT driver_index = 0; + HKEY drivers_key; + BOOL ret; + + DWORD value_name_length = 256; + char value_name[value_name_length]; + + DWORD value_data_length = 256; + char value_data[value_data_length]; + + DWORD value_type; + + if ( RegOpenKeyA(HKEY_LOCAL_MACHINE, key, &drivers_key) != ERROR_SUCCESS ) + { + TRACE("ERROR: Could not open: HKEY_LOCAL_MACHINE\\%s\n", key); + return 0; + } + + while ( RegEnumValue(drivers_key, + driver_index, + value_name, + &value_name_length, + NULL, + &value_type, + value_data, + &value_data_length) == ERROR_SUCCESS ) + { + BOOL valid_driver = FALSE; + BOOL is_mapper = FALSE; + + if ( value_type == REG_SZ ) + { + /* We look for mappers first so they don't match + something else later on! */ + + if ( ! stricmp("wavemapper", value_name) ) + { + TRACE("Found a Wave-mapper: %s\n", value_data); + valid_driver = TRUE; + is_mapper = TRUE; + driver_count ++; + } + else if ( ! stricmp("midimapper", value_name) ) + { + TRACE("Found a MIDI-mapper: %s\n", value_data); + valid_driver = TRUE; + is_mapper = TRUE; + driver_count ++; + } + else if ( ! strnicmp("wave", value_name, 4) ) + { + TRACE("Found a Wave driver: %s\n", value_data); + valid_driver = TRUE; + driver_count ++; + } + else if ( ! strnicmp("midi", value_name, 4) ) + { + TRACE("Found a MIDI driver: %s\n", value_data); + valid_driver = TRUE; + driver_count ++; + } + else if ( ! strnicmp("mixer", value_name, 5) ) + { + TRACE("Found a mixer driver: %s\n", value_data); + valid_driver = TRUE; + driver_count ++; + } + else if ( ! strnicmp("aux", value_name, 4) ) + { + TRACE("Found an aux driver: %s\n", value_data); + valid_driver = TRUE; + driver_count ++; + } + else + { + TRACE("Not supported: %s\n", value_data); + } + + /* If we have a valid driver now, we get it "installed" in + winmm itself so it can be used */ + + if ( valid_driver ) + { + if ( ! MMDRV_Install(value_name, value_data, is_mapper) ) + { + TRACE("FAILED when initializing %s\n", value_data); + } + } + } + else + { + TRACE("Invalid data format\n"); + } + + /* Reinitialize */ + value_name_length = 256; + value_data_length = 256; + memset(value_name, 0, value_name_length); + memset(value_data, 0, value_data_length); + + driver_index ++; + } + + TRACE("Found a total of %d drivers\n", driver_count); + + return driver_count; +} diff --git a/reactos/dll/win32/winmm/winemm.h b/reactos/dll/win32/winmm/winemm.h index cd70e5d4670..5a82503f53c 100644 --- a/reactos/dll/win32/winmm/winemm.h +++ b/reactos/dll/win32/winmm/winemm.h @@ -315,3 +315,14 @@ extern void (WINAPI *pFnRestoreThunkLock)(DWORD); */ #define WINE_GDF_EXIST 0x80000000 #define WINE_GDF_16BIT 0x10000000 + +/* Modification to take into account Windows NT's registry format */ + +#define NT_MME_DRIVERS32_KEY \ + "SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion\\Drivers32" + +#define NT_MME_DRIVERS_KEY \ + "SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion\\Drivers" + +INT LoadRegistryMMEDrivers(char* key); +BOOL MMDRV_Install(LPCSTR drvRegName, LPCSTR drvFileName, BOOL bIsMapper); diff --git a/reactos/dll/win32/winmm/winmm.rbuild b/reactos/dll/win32/winmm/winmm.rbuild index cccf08c3a97..a548c7649e1 100644 --- a/reactos/dll/win32/winmm/winmm.rbuild +++ b/reactos/dll/win32/winmm/winmm.rbuild @@ -27,7 +27,8 @@ playsound.c time.c winmm.c + registry.c winmm_res.rc winmm.spec - \ No newline at end of file +