Skip to content

Commit b1c456b

Browse files
authored
bugfix(registry): Prioritize HKEY_CURRENT_USER registry reads and writes over HKEY_LOCAL_MACHINE to prevent inaccessible data (TheSuperHackers#1844)
1 parent 78d94fb commit b1c456b

3 files changed

Lines changed: 18 additions & 20 deletions

File tree

Core/Libraries/Source/WWVegas/WWDownload/registry.cpp

Lines changed: 8 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -120,12 +120,12 @@ bool GetStringFromRegistry(std::string path, std::string key, std::string& val)
120120
#endif
121121

122122
fullPath.append(path);
123-
if (getStringFromRegistry(HKEY_LOCAL_MACHINE, fullPath.c_str(), key.c_str(), val))
123+
if (getStringFromRegistry(HKEY_CURRENT_USER, fullPath.c_str(), key.c_str(), val))
124124
{
125125
return true;
126126
}
127127

128-
return getStringFromRegistry(HKEY_CURRENT_USER, fullPath.c_str(), key.c_str(), val);
128+
return getStringFromRegistry(HKEY_LOCAL_MACHINE, fullPath.c_str(), key.c_str(), val);
129129
}
130130

131131
bool GetUnsignedIntFromRegistry(std::string path, std::string key, unsigned int& val)
@@ -137,12 +137,12 @@ bool GetUnsignedIntFromRegistry(std::string path, std::string key, unsigned int&
137137
#endif
138138

139139
fullPath.append(path);
140-
if (getUnsignedIntFromRegistry(HKEY_LOCAL_MACHINE, fullPath.c_str(), key.c_str(), val))
140+
if (getUnsignedIntFromRegistry(HKEY_CURRENT_USER, fullPath.c_str(), key.c_str(), val))
141141
{
142142
return true;
143143
}
144144

145-
return getUnsignedIntFromRegistry(HKEY_CURRENT_USER, fullPath.c_str(), key.c_str(), val);
145+
return getUnsignedIntFromRegistry(HKEY_LOCAL_MACHINE, fullPath.c_str(), key.c_str(), val);
146146
}
147147

148148
bool SetStringInRegistry( std::string path, std::string key, std::string val)
@@ -154,9 +154,8 @@ bool SetStringInRegistry( std::string path, std::string key, std::string val)
154154
#endif
155155
fullPath.append(path);
156156

157-
if (setStringInRegistry( HKEY_LOCAL_MACHINE, fullPath, key, val))
158-
return true;
159-
157+
// TheSuperHackers @fix bobtista 12/02/2026 Always write to HKCU. Per-user settings belong
158+
// in HKEY_CURRENT_USER and writes there should always succeed without admin privileges.
160159
return setStringInRegistry( HKEY_CURRENT_USER, fullPath, key, val );
161160
}
162161

@@ -169,9 +168,8 @@ bool SetUnsignedIntInRegistry( std::string path, std::string key, unsigned int v
169168
#endif
170169
fullPath.append(path);
171170

172-
if (setUnsignedIntInRegistry( HKEY_LOCAL_MACHINE, fullPath, key, val))
173-
return true;
174-
171+
// TheSuperHackers @fix bobtista 12/02/2026 Always write to HKCU. Per-user settings belong
172+
// in HKEY_CURRENT_USER and writes there should always succeed without admin privileges.
175173
return setUnsignedIntInRegistry( HKEY_CURRENT_USER, fullPath, key, val );
176174
}
177175

Generals/Code/GameEngine/Source/Common/System/registry.cpp

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -121,12 +121,12 @@ Bool GetStringFromGeneralsRegistry(AsciiString path, AsciiString key, AsciiStrin
121121

122122
fullPath.concat(path);
123123
DEBUG_LOG(("GetStringFromRegistry - looking in %s for key %s", fullPath.str(), key.str()));
124-
if (getStringFromRegistry(HKEY_LOCAL_MACHINE, fullPath.str(), key.str(), val))
124+
if (getStringFromRegistry(HKEY_CURRENT_USER, fullPath.str(), key.str(), val))
125125
{
126126
return TRUE;
127127
}
128128

129-
return getStringFromRegistry(HKEY_CURRENT_USER, fullPath.str(), key.str(), val);
129+
return getStringFromRegistry(HKEY_LOCAL_MACHINE, fullPath.str(), key.str(), val);
130130
}
131131

132132
Bool GetStringFromRegistry(AsciiString path, AsciiString key, AsciiString& val)
@@ -157,12 +157,12 @@ Bool GetUnsignedIntFromRegistry(AsciiString path, AsciiString key, UnsignedInt&
157157

158158
fullPath.concat(path);
159159
DEBUG_LOG(("GetUnsignedIntFromRegistry - looking in %s for key %s", fullPath.str(), key.str()));
160-
if (getUnsignedIntFromRegistry(HKEY_LOCAL_MACHINE, fullPath.str(), key.str(), val))
160+
if (getUnsignedIntFromRegistry(HKEY_CURRENT_USER, fullPath.str(), key.str(), val))
161161
{
162162
return TRUE;
163163
}
164164

165-
return getUnsignedIntFromRegistry(HKEY_CURRENT_USER, fullPath.str(), key.str(), val);
165+
return getUnsignedIntFromRegistry(HKEY_LOCAL_MACHINE, fullPath.str(), key.str(), val);
166166
}
167167

168168
AsciiString GetRegistryLanguage()

GeneralsMD/Code/GameEngine/Source/Common/System/registry.cpp

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -121,12 +121,12 @@ Bool GetStringFromGeneralsRegistry(AsciiString path, AsciiString key, AsciiStrin
121121

122122
fullPath.concat(path);
123123
DEBUG_LOG(("GetStringFromRegistry - looking in %s for key %s", fullPath.str(), key.str()));
124-
if (getStringFromRegistry(HKEY_LOCAL_MACHINE, fullPath.str(), key.str(), val))
124+
if (getStringFromRegistry(HKEY_CURRENT_USER, fullPath.str(), key.str(), val))
125125
{
126126
return TRUE;
127127
}
128128

129-
return getStringFromRegistry(HKEY_CURRENT_USER, fullPath.str(), key.str(), val);
129+
return getStringFromRegistry(HKEY_LOCAL_MACHINE, fullPath.str(), key.str(), val);
130130
}
131131

132132
Bool GetStringFromRegistry(AsciiString path, AsciiString key, AsciiString& val)
@@ -139,12 +139,12 @@ Bool GetStringFromRegistry(AsciiString path, AsciiString key, AsciiString& val)
139139

140140
fullPath.concat(path);
141141
DEBUG_LOG(("GetStringFromRegistry - looking in %s for key %s", fullPath.str(), key.str()));
142-
if (getStringFromRegistry(HKEY_LOCAL_MACHINE, fullPath.str(), key.str(), val))
142+
if (getStringFromRegistry(HKEY_CURRENT_USER, fullPath.str(), key.str(), val))
143143
{
144144
return TRUE;
145145
}
146146

147-
return getStringFromRegistry(HKEY_CURRENT_USER, fullPath.str(), key.str(), val);
147+
return getStringFromRegistry(HKEY_LOCAL_MACHINE, fullPath.str(), key.str(), val);
148148
}
149149

150150
Bool GetUnsignedIntFromRegistry(AsciiString path, AsciiString key, UnsignedInt& val)
@@ -157,12 +157,12 @@ Bool GetUnsignedIntFromRegistry(AsciiString path, AsciiString key, UnsignedInt&
157157

158158
fullPath.concat(path);
159159
DEBUG_LOG(("GetUnsignedIntFromRegistry - looking in %s for key %s", fullPath.str(), key.str()));
160-
if (getUnsignedIntFromRegistry(HKEY_LOCAL_MACHINE, fullPath.str(), key.str(), val))
160+
if (getUnsignedIntFromRegistry(HKEY_CURRENT_USER, fullPath.str(), key.str(), val))
161161
{
162162
return TRUE;
163163
}
164164

165-
return getUnsignedIntFromRegistry(HKEY_CURRENT_USER, fullPath.str(), key.str(), val);
165+
return getUnsignedIntFromRegistry(HKEY_LOCAL_MACHINE, fullPath.str(), key.str(), val);
166166
}
167167

168168
AsciiString GetRegistryLanguage()

0 commit comments

Comments
 (0)