[misc] improve genericity of registry functions

* Ensure that we can also handle non app specific keys
This commit is contained in:
Pete Batard 2016-03-14 13:41:20 +00:00
parent b82462bb7d
commit 03a97ee261
3 changed files with 67 additions and 22 deletions

View File

@ -1,3 +1,12 @@
o Version 2.8 (2016.03.??)
Enable listing of non-USB card readers (EXPERIMENTAL)
Major speed improvements for checksum computation
Fix UI flicker during progress report
Fix computation of FAT size for Large FAT32 (with thanks to Ady)
Syslinux improvements
Update GRUB to 2.02~beta3
Switch to https when downloading updates
o Version 2.7 (2016.02.14)
Add Thai translation, courtesy of Sippapas Wangsri
Add Drag and Drop support, courtesy of SeymourApps

View File

@ -54,13 +54,14 @@ static __inline BOOL DeleteRegistryKey(HKEY key_root, const char* key_name)
the application and create the app subkey if required */
static __inline BOOL _GetRegistryKey(HKEY key_root, const char* key_name, DWORD reg_type, LPBYTE dest, DWORD dest_size)
{
const char software_prefix[] = "SOFTWARE\\";
char long_key_name[MAX_PATH] = { 0 };
BOOL r = FALSE;
size_t i = 0;
size_t i;
LONG s;
HKEY hSoftware = NULL, hApp = NULL;
DWORD dwDisp, dwType = -1, dwSize = dest_size;
// VS Code Analysis complains if we don't break our initialization into chars
char long_key_name[256] = { 0 };
memset(dest, 0, dest_size);
if (key_name == NULL)
@ -72,9 +73,15 @@ static __inline BOOL _GetRegistryKey(HKEY key_root, const char* key_name, DWORD
}
if (i != 0) {
strcpy(long_key_name, "SOFTWARE\\");
safe_strcat(long_key_name, sizeof(long_key_name), key_name);
long_key_name[sizeof("SOFTWARE\\") + i-1] = 0;
// Prefix with "SOFTWARE" if needed
if (_strnicmp(key_name, software_prefix, sizeof(software_prefix) - 1) != 0) {
strcpy(long_key_name, software_prefix);
safe_strcat(long_key_name, sizeof(long_key_name), key_name);
long_key_name[sizeof(software_prefix) + i - 1] = 0;
} else {
safe_strcpy(long_key_name, sizeof(long_key_name), key_name);
long_key_name[i] = 0;
}
i++;
if (RegOpenKeyExA(key_root, long_key_name, 0, KEY_READ, &hApp) != ERROR_SUCCESS) {
hApp = NULL;
@ -108,25 +115,54 @@ out:
/* Write a generic registry key value (create the key if it doesn't exist) */
static __inline BOOL _SetRegistryKey(HKEY key_root, const char* key_name, DWORD reg_type, LPBYTE src, DWORD src_size)
{
const char software_prefix[] = "SOFTWARE\\";
char long_key_name[MAX_PATH] = { 0 };
BOOL r = FALSE;
HKEY hSoftware = NULL, hApp = NULL;
size_t i;
HKEY hRoot = NULL, hApp = NULL;
DWORD dwDisp, dwType = reg_type;
if (RegOpenKeyExA(key_root, "SOFTWARE", 0, KEY_READ|KEY_CREATE_SUB_KEY, &hSoftware) != ERROR_SUCCESS) {
hSoftware = NULL;
goto out;
}
if (RegCreateKeyExA(hSoftware, COMPANY_NAME "\\" APPLICATION_NAME, 0, NULL, 0,
KEY_SET_VALUE|KEY_QUERY_VALUE|KEY_CREATE_SUB_KEY, NULL, &hApp, &dwDisp) != ERROR_SUCCESS) {
hApp = NULL;
if (RegOpenKeyExA(key_root, NULL, 0, KEY_READ|KEY_CREATE_SUB_KEY, &hRoot) != ERROR_SUCCESS) {
hRoot = NULL;
goto out;
}
r = (RegSetValueExA(hApp, key_name, 0, dwType, src, src_size) == ERROR_SUCCESS);
// Find if we're dealing with a short key
for (i = safe_strlen(key_name); i>0; i--) {
if (key_name[i] == '\\')
break;
}
if (i == 0) {
// If this is a short key name, store the value under our app sub-hive
if (RegCreateKeyExA(hRoot, "SOFTWARE\\" COMPANY_NAME "\\" APPLICATION_NAME, 0, NULL, 0,
KEY_SET_VALUE | KEY_QUERY_VALUE | KEY_CREATE_SUB_KEY, NULL, &hApp, &dwDisp) != ERROR_SUCCESS) {
hApp = NULL;
goto out;
}
} else {
// Prefix with "SOFTWARE" if needed
if (_strnicmp(key_name, software_prefix, sizeof(software_prefix) - 1) != 0) {
strcpy(long_key_name, software_prefix);
safe_strcat(long_key_name, sizeof(long_key_name), key_name);
long_key_name[sizeof(software_prefix) + i - 1] = 0;
} else {
safe_strcpy(long_key_name, sizeof(long_key_name), key_name);
long_key_name[i] = 0;
}
i++;
if (RegCreateKeyExA(hRoot, long_key_name, 0, NULL, 0,
KEY_SET_VALUE | KEY_QUERY_VALUE | KEY_CREATE_SUB_KEY, NULL, &hApp, &dwDisp) != ERROR_SUCCESS) {
hApp = NULL;
goto out;
}
}
r = (RegSetValueExA(hApp, &key_name[i], 0, dwType, src, src_size) == ERROR_SUCCESS);
out:
if (hSoftware != NULL)
RegCloseKey(hSoftware);
if (hRoot != NULL)
RegCloseKey(hRoot);
if (hApp != NULL)
RegCloseKey(hApp);
return r;

View File

@ -33,7 +33,7 @@ LANGUAGE LANG_NEUTRAL, SUBLANG_NEUTRAL
IDD_DIALOG DIALOGEX 12, 12, 242, 376
STYLE DS_SETFONT | DS_MODALFRAME | DS_CENTER | WS_MINIMIZEBOX | WS_POPUP | WS_CAPTION | WS_SYSMENU
EXSTYLE WS_EX_ACCEPTFILES
CAPTION "Rufus 2.8.882"
CAPTION "Rufus 2.8.883"
FONT 8, "Segoe UI Symbol", 400, 0, 0x0
BEGIN
LTEXT "Device",IDS_DEVICE_TXT,9,6,200,8
@ -320,8 +320,8 @@ END
//
VS_VERSION_INFO VERSIONINFO
FILEVERSION 2,8,882,0
PRODUCTVERSION 2,8,882,0
FILEVERSION 2,8,883,0
PRODUCTVERSION 2,8,883,0
FILEFLAGSMASK 0x3fL
#ifdef _DEBUG
FILEFLAGS 0x1L
@ -338,13 +338,13 @@ BEGIN
BEGIN
VALUE "CompanyName", "Akeo Consulting (http://akeo.ie)"
VALUE "FileDescription", "Rufus"
VALUE "FileVersion", "2.8.882"
VALUE "FileVersion", "2.8.883"
VALUE "InternalName", "Rufus"
VALUE "LegalCopyright", "© 2011-2016 Pete Batard (GPL v3)"
VALUE "LegalTrademarks", "http://www.gnu.org/copyleft/gpl.html"
VALUE "OriginalFilename", "rufus.exe"
VALUE "ProductName", "Rufus"
VALUE "ProductVersion", "2.8.882"
VALUE "ProductVersion", "2.8.883"
END
END
BLOCK "VarFileInfo"