/* Copyright (c) 1995 Microsoft Corporation */ /* **----------------------------------------------------------------------------- ** File: RegFix.c ** Purpose: Fix up various registry settings for MidiMapper ** Mod Log: Created by Shawn Brown (11/14/95) **----------------------------------------------------------------------------- */ /* **----------------------------------------------------------------------------- ** Includes **----------------------------------------------------------------------------- */ #include "RegFix.h" /* **----------------------------------------------------------------------------- ** Local Prototypes **----------------------------------------------------------------------------- */ BOOL CheckMidiOK (void); BOOL SetMidiOK (BOOL fOK); BOOL CheckMidiHeader (void); BOOL CheckMidiSchemes (void); BOOL CheckMidiDrivers (void); BOOL CreateDefMidiHeader (void); BOOL CreateDefMidiSchemes (void); BOOL CreateDefMidiDrivers (void); /* **----------------------------------------------------------------------------- ** Local Variables **----------------------------------------------------------------------------- */ // Consider - revisit these and make them use the appropriate roots // from regstr.h static const TCHAR l_aszMidiMapKey[] = TEXT ("Software\\Microsoft\\Multimedia\\MidiMap"); static const TCHAR l_aszMediaPropKey[] = TEXT ("System\\CurrentControlSet\\Control\\MediaProperties"); static const TCHAR l_aszMediaRsrcKey[] = TEXT ("System\\CurrentControlSet\\Control\\MediaResources"); static const TCHAR l_aszMRMidiKey[] = TEXT ("System\\CurrentControlSet\\Control\\MediaResources\\Midi"); static const TCHAR l_aszSchemesKey[] = TEXT ("System\\CurrentControlSet\\Control\\MediaProperties\\PrivateProperties\\MIDI\\Schemes"); static const TCHAR l_aszMediaKey[] = TEXT ("Media"); static const TCHAR l_aszMIDIKey[] = TEXT ("Midi"); static const TCHAR aszInstrumentKey[] = TEXT ("Instruments"); static const TCHAR aszDrvMIDIKey[] = TEXT ("Drivers\\MIDI"); static const TCHAR aszPrivateKey[] = TEXT ("Private Properties"); static const TCHAR aszDefaultKey[] = TEXT ("Default"); static const TCHAR aszMigratedVal[] = TEXT ("Migrated"); static const TCHAR aszMIDI[] = TEXT ("MIDI"); static const TCHAR aszNULL[] = TEXT (""); static const TCHAR l_aszOK[] = TEXT ("Validate"); static const TCHAR aszActiveVal[] = TEXT ("Active"); static const TCHAR aszDescripVal[] = TEXT ("Description"); static const TCHAR aszDeviceIDVal[] = TEXT ("DeviceID"); static const TCHAR aszDevNodeVal[] = TEXT ("DevNode"); static const TCHAR aszDriverVal[] = TEXT ("Driver"); static const TCHAR aszFriendlyVal[] = TEXT ("FriendlyName"); static const TCHAR aszMapCfgVal[] = TEXT ("MapperConfig"); static const TCHAR aszSoftwareVal[] = TEXT ("SOFTWAREKEY"); static const TCHAR aszInstallerVal[] = TEXT ("Installer"); static const TCHAR aszChannelsVal[] = TEXT ("Channels"); static const TCHAR aszMIDIClass[] = TEXT ("Midi"); static const TCHAR aszAuxClass[] = TEXT ("Aux"); static const TCHAR aszWaveClass[] = TEXT ("Wave"); static const TCHAR aszMixerClass[] = TEXT ("Mixer"); static const TCHAR aszOne[] = TEXT ("1"); static const TCHAR aszZeroZeroKey[] = TEXT ("00"); /* **----------------------------------------------------------------------------- ** Name: CheckRegistry ** Purpose: ** Mod Log: Created by Shawn Brown (11/95) **----------------------------------------------------------------------------- */ BOOL CheckRegistry (BOOL fForceUpdate) { if (!fForceUpdate) { // Check OK flag if (CheckMidiOK()) return TRUE; } // Fix up Header if (! CheckMidiHeader()) return FALSE; // Fix up schemes if (! CheckMidiSchemes ()) return FALSE; // Fix up drivers if (! CheckMidiDrivers ()) return FALSE; // All done, set OK flag SetMIDIOK (TRUE); return TRUE; } /* **----------------------------------------------------------------------------- ** Name: CheckMidiOK ** Purpose: Simple quick check to see if everything is OK ** Mod Log: Created by Shawn Brown (11/95) **----------------------------------------------------------------------------- */ BOOL CheckMidiOK (void) { HKEY hKey; LONG lResult; DWORD dwType; DWORD dwVal; DWORD cbSize; lResult = RegOpenEx (HKEY_CURRENT_USER, l_aszMidiMapKey, 0, KEY_ALL_ACCESS, &hKey); if (ERROR_SUCCESS != lResult) return FALSE; dwType = REG_DWORD; cbSize = sizeof (DWORD); lResult = RegQueryValueEx (hKey, l_aszOK, NULL, &dwType, (LPBYTE)(LPDWORD)&dwVal, &cbSize); if (ERROR_SUCCESS != lResult) { RegCloseKey (hKey); return FALSE; } RegCloseKey (hKey); if (0 == dwVal) return FALSE; return TRUE; } // End CheckMidiOK /* **----------------------------------------------------------------------------- ** Name: SetMidiOK ** Purpose: Set OK value ** Mod Log: Created by Shawn Brown (11/95) **----------------------------------------------------------------------------- */ BOOL SetMidiOK (BOOL fOK) { HKEY hKey; LONG lResult; DWORD dwType; DWORD dwVal; DWORD cbSize; lResult = RegOpenEx (HKEY_CURRENT_USER, l_aszMidiMapKey, 0, KEY_ALL_ACCESS, &hKey); if (ERROR_SUCCESS != lResult) return FALSE; dwType = REG_DWORD; dwVal = (DWORD)fOK; cbSize = sizeof (DWORD); lResult = RegSetValueEx (hKey, l_aszOK, 0, &dwType, (LPBYTE)(LPDWORD)&dwVal, &cbSize); if (ERROR_SUCCESS != lResult) { RegCloseKey (hKey); return FALSE; } RegCloseKey (hKey); return TRUE; } // End SetMidiOK /* **----------------------------------------------------------------------------- ** Name: CheckHeader ** Purpose: do we have a valid Midi Header ?!? ** Mod Log: Created by Shawn Brown (11/95) **----------------------------------------------------------------------------- */ BOOL CheckMidiHeader (void) { return CreateDefMidiHeader (); } // End CheckMidiHeader /* **----------------------------------------------------------------------------- ** Name: CreateDefMidiHeader ** Purpose: ** Mod Log: Created by Shawn Brown (11/95) **----------------------------------------------------------------------------- */ BOOL CreateDefaultHeader (void) { } // End CreateDefaultHeader /* **----------------------------------------------------------------------------- ** Name: IsMIDIDriver ** Purpose: ** Mod Log: Created by Shawn Brown (11/95) **----------------------------------------------------------------------------- */ BOOL IsMIDIDriver ( LPCTSTR pszDriverName) // IN: driver name { UINT cNumDrivers; UINT ii; TCHAR szDriver[MAX_PATH]; // Look for the MIDI driver cNumDrivers = midiOutGetNumDevs (); for (ii = 0; ii < cNumDrivers; ii++) { if (! GetDriverName (aszMIDI, ii, szDriver, MAX_PATH)) continue; if (0 == lstrcmpi (pszDriverName, szDriver)) return TRUE; } // End for // Look for the MIDI driver cNumDrivers = midiInGetNumDevs (); for (ii = 0; ii < cNumDrivers; ii++) { if (! GetDriverName (aszMIDI, ii, szDriver, MAX_PATH)) continue; if (0 == lstrcmpi (pszDriverName, szDriver)) return TRUE; } // End for return FALSE; } // End IsMIDIDriver /* **----------------------------------------------------------------------------- ** Name: IsMigrated ** Purpose: ** Mod Log: Created by Shawn Brown (11/95) **----------------------------------------------------------------------------- */ BOOL IsMigrated (UINT uDeviceID) { TCHAR szDriver[MAX_PATH]; TCHAR szBuffer[MAX_PATH]; HKEY hDriverKey; DWORD cbSize; // Get Driver if (! GetDriverName (aszMIDI, uDeviceID, szDriver, MAX_PATH)) return FALSE; // Open Driver Key wsprintf (szBuffer, TEXT ("%s\\%s<%04ld>"), aszMRMidiKey, szDriver, uDeviceID); if (ERROR_SUCCESS != RegOpenKeyEx (HKEY_LOCAL_MACHINE, szBuffer, 0, KEY_ALL_ACCESS, &hDriverKey)) return FALSE; // Get Migrated Value // The mere existence of the Migrated value indicates // we have already successfully migrated this driver cbSize = sizeof(szBuffer); if (ERROR_SUCCESS != RegQueryValueEx (hDriverKey, aszMigratedVal, NULL, NULL, (LPBYTE)szBuffer, &cbSize)) { RegCloseKey (hDriverKey); return FALSE; } RegCloseKey (hDriverKey); return TRUE; } // End IsMigrated /* **----------------------------------------------------------------------------- ** Name: MigrateNewMIDIDriver ** Purpose: ** Mod Log: Created by Shawn Brown (11/95) **----------------------------------------------------------------------------- */ BOOL MigrateNewMIDIDriver ( UINT uDeviceID) // IN: MIDI Driver device ID { TCHAR szDriver[MAX_PATH]; TCHAR szFriend[MAX_PATH]; TCHAR szDescrip[MAX_PATH]; TCHAR szBuffer[MAX_PATH]; DWORD cOut; MIDIOUTCAPS moc; DWORD dwDisposition; DWORD cbSize; DWORD dwVal; HKEY hMIDIKey = NULL; HKEY hDriverKey = NULL; HKEY hInstrumentKey = NULL; HKEY hKey = NULL; BOOL fResult = FALSE; cOut = midiOutGetNumDevs (); if (uDeviceID >= cOut) return FALSE; // Get Driver if (! GetDriverName (aszMIDI, uDeviceID, szDriver, MAX_PATH)) return FALSE; // Get Friendly Name if (! GetDriverFriendlyName (aszMIDI, uDeviceID, szFriend, MAX_PATH)) { lstrcpy (szFriend, szDriver); } // Get Description if (MMSYSERR_NOERROR != midiOutGetDevCaps (uDeviceID, &moc, sizeof(moc))) return FALSE; if (moc.szPname[0] == 0) { lstrcpy (szDescrip, szDriver); } else { lstrcpy (szDescrip, moc.szPname); } // Open key, create it if it doesn't already exist if (ERROR_SUCCESS != RegCreateKeyEx (HKEY_LOCAL_MACHINE, aszMRMidiKey, 0, NULL, 0, KEY_ALL_ACCESS, NULL, &hMIDIKey, NULL)) { return FALSE; } // Create new driver key wsprintf (szBuffer, TEXT ("%s<%04ld>"), szDriver, uDeviceID); if (ERROR_SUCCESS != RegCreateKeyEx (hMIDIKey, szBuffer, 0, NULL, 0, KEY_ALL_ACCESS, NULL, &hDriverKey, &dwDisposition)) { goto lblCLEANUP; } RegCloseKey (hMIDIKey); hMIDIKey = NULL; // // Set Driver Values // // Set Active = "1" value cbSize = sizeof (aszOne); if (ERROR_SUCCESS != RegSetValueEx (hDriverKey, aszActiveVal, 0, REG_SZ, (LPBYTE)aszOne, cbSize)) { goto lblCLEANUP; } // Set Description = szDescrip value cbSize = (lstrlen (szDescrip) + 1) * sizeof(TCHAR); if (ERROR_SUCCESS != RegSetValueEx (hDriverKey, aszDescripVal, 0, REG_SZ, (LPBYTE)szDescrip, cbSize)) { goto lblCLEANUP; } // Set DeviceID = "" value cbSize = (lstrlen (aszNULL) + 1) * sizeof(TCHAR); if (ERROR_SUCCESS != RegSetValueEx (hDriverKey, aszDeviceIDVal, 0, REG_SZ, (LPBYTE)aszNULL, cbSize)) { goto lblCLEANUP; } // Set DevNode = value cbSize = 0; if (ERROR_SUCCESS != RegSetValueEx (hDriverKey, aszDeviceIDVal, 0, REG_BINARY, (LPBYTE)NULL, cbSize)) { goto lblCLEANUP; } // Set Driver = szDriver cbSize = (lstrlen (szDriver) + 1) * sizeof(TCHAR); if (ERROR_SUCCESS != RegSetValueEx (hDriverKey, aszDriverVal, 0, REG_SZ, (LPBYTE)szDriver, cbSize)) { goto lblCLEANUP; } // Set FriendlyName cbSize = (lstrlen (szFriend) + 1) * sizeof(TCHAR); if (ERROR_SUCCESS != RegSetValueEx (hDriverKey, aszFriendlyVal, 0, REG_SZ, (LPBYTE)szFriend, cbSize)) { goto lblCLEANUP; } // Set Mapper Config cbSize = sizeof(DWORD); dwVal = 0; if (ERROR_SUCCESS != RegSetValueEx (hDriverKey, aszMapCfgVal, 0, REG_DWORD, (LPBYTE)&dwVal, cbSize)) { goto lblCLEANUP; } // Set SOFTWARE value wsprintf (szBuffer, TEXT("%s\\%04ld"), aszServiceKey, uDeviceID); cbSize = (lstrlen (szBuffer) + 1) * sizeof(TCHAR); if (ERROR_SUCCESS != RegSetValueEx (hDriverKey, aszSoftwareVal, 0, REG_SZ, (LPBYTE)szBuffer, cbSize)) { goto lblCLEANUP; } // Create Instruments Key if (ERROR_SUCCESS != RegCreateKeyEx (hDriverKey, aszInstrumentKey, 0, NULL, 0, KEY_ALL_ACCESS, NULL, &hInstrumentKey, &dwDisposition)) { goto lblCLEANUP; } RegCloseKey (hInstrumentKey); hInstrumentKey = NULL; // Create Services\Class\Media\0001\Drivers\midi key // Open key, create it if it doesn't already exist // wsprintf (szBuffer, TEXT("%s\\%04ld\\%s"), aszServiceKey, uDeviceID, aszDrvMIDIKey); // if (ERROR_SUCCESS != RegCreateKeyEx (HKEY_LOCAL_MACHINE, szBuffer, // 0, NULL, 0, KEY_ALL_ACCESS, NULL, // &hMIDIKey, NULL)) // { // goto lblCLEANUP; // } // Create // Set MIGRATED value // NOTE: this is always the very last thing to do to indicate successful migration cbSize = (lstrlen (aszOne) + 1) * sizeof(TCHAR); if (ERROR_SUCCESS != RegSetValueEx (hDriverKey, aszMigratedVal, 0, REG_SZ, (LPBYTE)aszOne, cbSize)) { goto lblCLEANUP; } // Success fResult = TRUE; lblCLEANUP: if (hInstrumentKey) RegCloseKey (hInstrumentKey); if (hDriverKey) RegCloseKey (hDriverKey); if (hMIDIKey) RegCloseKey (hMIDIKey); return fResult; } // End MigrateNewMIDIDriver /* **----------------------------------------------------------------------------- ** Name: CreateDefaultMIDISchemes ** Purpose: ** Mod Log: Created by Shawn Brown (11/95) **----------------------------------------------------------------------------- */ BOOL CreateDefaultMIDISchemes (void) { HKEY hSchemeKey; HKEY hDefaultKey; HKEY hZeroKey; DWORD dwVal; DWORD cbSize; // Create MIDI Schemes key if (ERROR_SUCCESS != RegCreateKeyEx (HKEY_LOCAL_MACHINE, aszMIDISchemesKey, 0, NULL, 0, KEY_ALL_ACCESS, NULL, &hSchemeKey, NULL)) { return FALSE; } // Create Default Key if (ERROR_SUCCESS != RegCreateKeyEx (hSchemeKey, aszDefaultKey, 0, NULL, 0, KEY_ALL_ACCESS, NULL, &hDefaultKey, NULL)) { RegCloseKey (hSchemeKey); return FALSE; } RegCloseKey (hSchemeKey); // Create 00 Key if (ERROR_SUCCESS != RegCreateKeyEx (hDefaultKey, aszZeroZeroKey, 0, NULL, 0, KEY_ALL_ACCESS, NULL, &hZeroKey, NULL)) { RegCloseKey (hDefaultKey); return FALSE; } RegCloseKey (hDefaultKey); // Create Default Channels Value dwVal = 0x0000FFFF; cbSize = sizeof(DWORD); if (ERROR_SUCCESS != RegSetValueEx (hZeroKey, aszChannelsVal, 0, REG_DWORD, (LPBYTE)&dwVal, cbSize)) { RegCloseKey (hZeroKey); return FALSE; } RegCloseKey (hZeroKey); // Success return TRUE; } // End CreateDefaultMIDISchemes /* **----------------------------------------------------------------------------- ** Name: MigrateExistingMIDISchemes ** Purpose: ** Mod Log: Created by Shawn Brown (11/95) **----------------------------------------------------------------------------- */ BOOL MigrateExistingMIDISchemes (void) { return TRUE; } // End MigrateExistingMIDISchemes /* **----------------------------------------------------------------------------- ** Name: MigrateMIDIDrivers ** Purpose: ** Mod Log: Created by Shawn Brown (11/95) **----------------------------------------------------------------------------- */ BOOL MigrateMIDIDrivers (void) { UINT cOut; UINT ii; BOOL fResult = TRUE; if (! CreateDefaultMIDISchemes ()) { return FALSE; } if (! MigrateExistingMIDISchemes ()) { return FALSE; } cOut = midiOutGetNumDevs (); if (cOut == 0L) return FALSE; for (ii = 0; ii < cOut; ii++) { if (IsMigrated (ii)) continue; if (! MigrateNewMIDIDriver (ii)) fResult = FALSE; } return fResult; } // End MigrateMIDIDrivers /* **----------------------------------------------------------------------------- ** Name: DumpDeviceCaps ** Purpose: ** Mod Log: Created by Shawn Brown (11/95) **----------------------------------------------------------------------------- */ BOOL DumpMidiOutDeviceCaps (UINT uDeviceID, LPSTR pszBuff, UINT cchLen) { static const aszMMicrosoft[] = TEXT ("Microsoft(TM)"); static const aszMMUnknown[] = MIDIOUTCAPS moc; MMRESULT mmr; DWORD wMid; DWORD wPid; DWORD dwVerHigh, dwVerLow; LPTSTR pszName; WORD wTechnology; WORD wVoices; WORD wNotes; WORD wChannelMask; DWORD dwSupport; mmr = midiOutGetDevCaps (uDeviceId, &moc, sizeof(moc)); if (MMSYSERR_NOERROR != mmr) return FALSE; return TRUE; } // End DumpDeviceCaps /* **----------------------------------------------------------------------------- ** End of File **----------------------------------------------------------------------------- */