/* * reg - registry wrappers */ #include "tweakui.h" #pragma BEGIN_CONST_DATA #pragma END_CONST_DATA /***************************************************************************** * * RegCanModifyKey * * Returns nonzero if the current user has permission to modify the * key. * *****************************************************************************/ BOOL PASCAL RegCanModifyKey(HKEY hkRoot, LPCTSTR ptszSubkey) { BOOL fRc; if (g_fNT) { HKEY hk; DWORD dw; if (RegCreateKeyEx(hkRoot, ptszSubkey, 0, c_tszNil, REG_OPTION_NON_VOLATILE, KEY_WRITE, 0, &hk, &dw) == 0) { RegCloseKey(hk); fRc = 1; } else { fRc = 0; } } else { fRc = 1; } return fRc; } /***************************************************************************** * * _RegOpenKey * * Special version for NT that always asks for MAXIMUM_ALLOWED. * *****************************************************************************/ LONG PASCAL _RegOpenKey(HKEY hk, LPCTSTR ptszSubKey, PHKEY phkResult) { return RegOpenKeyEx(hk, ptszSubKey, 0, MAXIMUM_ALLOWED, phkResult); } /***************************************************************************** * * _RegCreateKey * * Special version for NT that always asks for MAXIMUM_ALLOWED. * *****************************************************************************/ LONG PASCAL _RegCreateKey(HKEY hk, LPCTSTR ptszSubKey, PHKEY phkResult) { DWORD dw; if (ptszSubKey) { return RegCreateKeyEx(hk, ptszSubKey, 0, c_tszNil, REG_OPTION_NON_VOLATILE, MAXIMUM_ALLOWED, 0, phkResult, &dw); } else { return RegOpenKey(hk, ptszSubKey, phkResult); } } /***************************************************************************** * * RegDeleteValues * * Deletes all the values under a key. * *****************************************************************************/ void PASCAL RegDeleteValues(HKEY hkRoot, LPCTSTR ptszSubkey) { HKEY hk; if (_RegOpenKey(hkRoot, ptszSubkey, &hk) == 0) { DWORD dw, ctch; TCHAR tszValue[ctchKeyMax]; dw = 0; while (ctch = cA(tszValue), RegEnumValue(hk, dw, tszValue, &ctch, 0, 0, 0, 0) == 0) { if (RegDeleteValue(hk, tszValue) == 0) { } else { dw++; } } RegCloseKey(hk); } } /***************************************************************************** * * RegDeleteTree * * Deletes an entire registry tree. * * Windows 95's RegDeleteKey will delete an entire tree, but Windows NT * forces you to do it yourself. * * Note that you need to watch out for the case where a key is undeletable, * in which case you must skip over the key and continue as best you can. * *****************************************************************************/ LONG PASCAL RegDeleteTree(HKEY hkRoot, LPCTSTR ptszSubkey) { HKEY hk; LONG lRc; lRc = RegOpenKey(hkRoot, ptszSubkey, &hk); if (lRc == 0) { DWORD dw; TCHAR tszKey[ctchKeyMax]; dw = 0; while (RegEnumKey(hk, dw, tszKey, cA(tszKey)) == 0) { if (RegDeleteTree(hk, tszKey) == 0) { } else { dw++; } } RegCloseKey(hk); lRc = RegDeleteKey(hkRoot, ptszSubkey); if (lRc == 0) { } else { /* Couldn't delete the key; at least nuke the values */ RegDeleteValues(hkRoot, ptszSubkey); } } return lRc; } /***************************************************************************** * * RegKeyExists * *****************************************************************************/ BOOL PASCAL RegKeyExists(HKEY hkRoot, LPCTSTR ptszSubkey) { LONG cb; return RegQueryValue(hkRoot, ptszSubkey, 0, &cb) == ERROR_SUCCESS; } /***************************************************************************** * * hkOpenClsid * * Open a class id (guid) registry key, returning the hkey. * *****************************************************************************/ HKEY PASCAL hkOpenClsid(PCTSTR ptszClsid) { HKEY hk = 0; _RegOpenKey(pcdii->hkClsid, ptszClsid, &hk); return hk; } /***************************************************************************** * * GetRegStr * * Generic wrapper that pulls out a registry key/subkey. * *****************************************************************************/ BOOL PASCAL GetRegStr(HKEY hkRoot, LPCTSTR ptszKey, LPCTSTR ptszSubkey, LPTSTR ptszBuf, int cbBuf) { HKEY hk; BOOL fRc; if ((UINT)cbBuf >= cbCtch(1)) { ptszBuf[0] = TEXT('\0'); } if (hkRoot && _RegOpenKey(hkRoot, ptszKey, &hk) == 0) { DWORD cb = cbBuf; fRc = RegQueryValueEx(hk, ptszSubkey, 0, 0, (LPBYTE)ptszBuf, &cb) == 0; RegCloseKey(hk); } else { fRc = 0; } return fRc; } /***************************************************************************** * * GetStrPkl * * Read a registry key/subkey/string value given a key location. * *****************************************************************************/ BOOL PASCAL GetStrPkl(LPTSTR ptszBuf, int cbBuf, PKL pkl) { return GetRegStr(*pkl->phkRoot, pkl->ptszKey, pkl->ptszSubkey, ptszBuf, cbBuf); } /***************************************************************************** * * GetRegDword * * Read a dword, returning the default if unable. * *****************************************************************************/ DWORD PASCAL GetRegDword(HHK hhk, LPCSTR pszKey, LPCSTR pszSubkey, DWORD dwDefault) { DWORD dw; if (GetRegStr(hkeyHhk(hhk), pszKey, pszSubkey, (LPTSTR)&dw, sizeof(dw))) { return dw; } else { return dwDefault; } } /***************************************************************************** * * GetDwordPkl * * Given a location, read a dword, returning the default if unable. * *****************************************************************************/ DWORD PASCAL GetDwordPkl(PKL pkl, DWORD dwDefault) { DWORD dw; if (GetRegStr(*pkl->phkRoot, pkl->ptszKey, pkl->ptszSubkey, (LPTSTR)&dw, sizeof(dw))) { return dw; } else { return dwDefault; } } /***************************************************************************** * * GetRegInt * * Generic wrapper that pulls out a registry key/subkey as an unsigned. * *****************************************************************************/ UINT PASCAL GetRegInt(HHK hhk, LPCSTR pszKey, LPCSTR pszSubkey, UINT uiDefault) { TCH tsz[20]; if (GetRegStr(hkeyHhk(hhk), pszKey, pszSubkey, tsz, cA(tsz))) { int i = iFromPtsz(tsz); return i == iErr ? uiDefault : (UINT)i; } else { return uiDefault; } } /***************************************************************************** * * GetIntPkl * * Generic wrapper that pulls out a registry key/subkey as an unsigned. * *****************************************************************************/ UINT PASCAL GetIntPkl(UINT uiDefault, PKL pkl) { return GetRegInt(*pkl->phkRoot, pkl->ptszKey, pkl->ptszSubkey, uiDefault); } /***************************************************************************** * * RegSetValuePtsz * * Generic wrapper that writes out a registry key/subkey as a string. * *****************************************************************************/ BOOL PASCAL RegSetValuePtsz(HKEY hk, LPCSTR pszSubkey, LPCTSTR ptszVal) { return RegSetValueEx(hk, pszSubkey, 0, REG_SZ, (LPBYTE)ptszVal, 1 + lstrlen(ptszVal)) == ERROR_SUCCESS; } /***************************************************************************** * * SetRegStr * * Generic wrapper that writes out a registry key/subkey. * * It is an error to call this with a bad hhk. * *****************************************************************************/ BOOL PASCAL SetRegStr(HHK hhk, LPCTSTR ptszKey, LPCTSTR ptszSubkey, LPCTSTR ptszVal) { BOOL fRc = FALSE; HKEY hk; if (RegCreateKey(hkeyHhk(hhk), ptszKey, &hk) == 0) { fRc = RegSetValuePtsz(hk, ptszSubkey, ptszVal); RegCloseKey(hk); } return fRc; } /***************************************************************************** * * SetStrPkl * * Set a registry key/subkey/string value given a key location. * * It is an error to call this with a bad hkRoot. * *****************************************************************************/ BOOL PASCAL SetStrPkl(PKL pkl, LPCTSTR ptszVal) { return SetRegStr(*pkl->phkRoot, pkl->ptszKey, pkl->ptszSubkey, ptszVal); } /***************************************************************************** * * SetRegInt * * Generic wrapper that writes out a registry key/subkey as an * unsigned integer. * *****************************************************************************/ BOOL PASCAL SetRegInt(HHK hhk, LPCSTR pszKey, LPCSTR pszSubkey, UINT ui) { TCH tsz[20]; wsprintf(tsz, c_tszPercentU, ui); return SetRegStr(hhk, pszKey, pszSubkey, tsz); } /***************************************************************************** * * SetIntPkl * * Writes out a registry key/subkey as an unsigned integer. * *****************************************************************************/ BOOL PASCAL SetIntPkl(UINT ui, PKL pkl) { return SetRegInt(*pkl->phkRoot, pkl->ptszKey, pkl->ptszSubkey, ui); } /***************************************************************************** * * SetRegDwordEx * * Generic wrapper that writes out a registry key/subkey as a * dword, of requested type. * *****************************************************************************/ BOOL PASCAL SetRegDwordEx(HHK hhk, LPCSTR pszKey, LPCSTR pszSubkey, DWORD dw, DWORD dwType) { BOOL fRc = FALSE; HKEY hk; if (RegCreateKey(hkeyHhk(hhk), pszKey, &hk) == 0) { /* Bad prototype for RegSetValueEx forces me to cast */ fRc = RegSetValueEx(hk, pszSubkey, 0, dwType, (LPBYTE)&dw, sizeof(dw)) == 0; RegCloseKey(hk); } return fRc; } /***************************************************************************** * * SetRegDword * * Generic wrapper that writes out a registry key/subkey as a * dword, but typed as REG_BINARY (Win95 does this). * *****************************************************************************/ BOOL PASCAL SetRegDword(HHK hhk, LPCSTR pszKey, LPCSTR pszSubkey, DWORD dw) { return SetRegDwordEx(hhk, pszKey, pszSubkey, dw, REG_BINARY); } /***************************************************************************** * * SetRegDword2 * * Generic wrapper that writes out a registry key/subkey as a * real REG_DWORD. * *****************************************************************************/ BOOL PASCAL SetRegDword2(HHK hhk, LPCSTR pszKey, LPCSTR pszSubkey, DWORD dw) { return SetRegDwordEx(hhk, pszKey, pszSubkey, dw, REG_DWORD); } /***************************************************************************** * * SetDwordPkl * * Generic wrapper that writes out a registry key/subkey as a * dword, given a key location. * *****************************************************************************/ BOOL PASCAL SetDwordPkl(PKL pkl, DWORD dw) { return SetRegDword(*pkl->phkRoot, pkl->ptszKey, pkl->ptszSubkey, dw); } /***************************************************************************** * * SetDwordPkl2 * * Generic wrapper that writes out a registry key/subkey as a * real REG_DWORD, given a key location. * *****************************************************************************/ BOOL PASCAL SetDwordPkl2(PKL pkl, DWORD dw) { return SetRegDword2(*pkl->phkRoot, pkl->ptszKey, pkl->ptszSubkey, dw); } /***************************************************************************** * * DelPkl * * Generic wrapper that deletes a registry key/subkey. * *****************************************************************************/ BOOL PASCAL DelPkl(PKL pkl) { BOOL fRc; HKEY hk; LONG lRc; lRc = _RegOpenKey(*pkl->phkRoot, pkl->ptszKey, &hk); switch (lRc) { case ERROR_SUCCESS: fRc = RegDeleteValue(hk, pkl->ptszSubkey) == 0; RegCloseKey(hk); break; case ERROR_FILE_NOT_FOUND: case ERROR_PATH_NOT_FOUND: fRc = TRUE; /* if it doesn't exist, then that's okay */ break; default: fRc = FALSE; break; } return fRc; }