Alexander Nicolaysen Sørnes : regedit: Convert import delete handling to unicode.
Alexandre Julliard
julliard at winehq.org
Tue Jul 8 14:35:37 CDT 2008
Module: wine
Branch: master
Commit: eafa99ea559c9c53333af65490e9f3ad5026146a
URL: http://source.winehq.org/git/wine.git/?a=commit;h=eafa99ea559c9c53333af65490e9f3ad5026146a
Author: Alexander Nicolaysen Sørnes <alex at thehandofagony.com>
Date: Mon Jul 7 23:12:21 2008 +0200
regedit: Convert import delete handling to unicode.
---
programs/regedit/regproc.c | 112 +++++++++++++++++++++++++++++++++++++++++++-
programs/regedit/regproc.h | 1 +
2 files changed, 111 insertions(+), 2 deletions(-)
diff --git a/programs/regedit/regproc.c b/programs/regedit/regproc.c
index b91cbf5..a169889 100644
--- a/programs/regedit/regproc.c
+++ b/programs/regedit/regproc.c
@@ -39,6 +39,19 @@ static const CHAR *reg_class_names[] = {
"HKEY_CURRENT_CONFIG", "HKEY_CURRENT_USER", "HKEY_DYN_DATA"
};
+static const WCHAR hkey_local_machine[] = {'H','K','E','Y','_','L','O','C','A','L','_','M','A','C','H','I','N','E',0};
+static const WCHAR hkey_users[] = {'H','K','E','Y','_','U','S','E','R','S',0};
+static const WCHAR hkey_classes_root[] = {'H','K','E','Y','_','C','L','A','S','S','E','S','_','R','O','O','T',0};
+static const WCHAR hkey_current_config[] = {'H','K','E','Y','_','C','U','R','R','E','N','T','_','C','O','N','F','I','G',0};
+static const WCHAR hkey_current_user[] = {'H','K','E','Y','_','C','U','R','R','E','N','T','_','U','S','E','R',0};
+static const WCHAR hkey_dyn_data[] = {'H','K','E','Y','_','D','Y','N','_','D','A','T','A',0};
+
+static const WCHAR *reg_class_namesW[] = {hkey_local_machine, hkey_users,
+ hkey_classes_root, hkey_current_config,
+ hkey_current_user, hkey_dyn_data
+ };
+
+
#define REG_CLASS_NUMBER (sizeof(reg_class_names) / sizeof(reg_class_names[0]))
static HKEY reg_class_keys[REG_CLASS_NUMBER] = {
@@ -62,6 +75,20 @@ if (!(p)) \
}
/******************************************************************************
+ * Allocates memory and convers input from wide chars to multibyte
+ * Returned string must be freed by the caller
+ */
+char* GetMultiByteString(WCHAR* strW, int len)
+{
+ char* strA = NULL;
+
+ strA = HeapAlloc(GetProcessHeap(), 0, len);
+ CHECK_ENOUGH_MEMORY(strA);
+ WideCharToMultiByte(CP_ACP, 0, strW, len, strA, len, NULL, NULL);
+ return strA;
+}
+
+/******************************************************************************
* Converts a hex representation of a DWORD into a DWORD.
*/
static BOOL convertHexToDWord(char* str, DWORD *dw)
@@ -229,6 +256,52 @@ static BOOL parseKeyName(LPSTR lpKeyName, HKEY *hKey, LPSTR *lpKeyPath)
return TRUE;
}
+static BOOL parseKeyNameW(LPWSTR lpKeyName, HKEY *hKey, LPWSTR *lpKeyPath)
+{
+ WCHAR* lpSlash = NULL;
+ unsigned int i, len;
+
+ if (lpKeyName == NULL)
+ return FALSE;
+
+ for(i = 0; *(lpKeyName+i) != 0; i++)
+ {
+ if(*(lpKeyName+i) == '\\')
+ {
+ lpSlash = lpKeyName+i;
+ break;
+ }
+ }
+
+ if (lpSlash)
+ {
+ len = lpSlash-lpKeyName;
+ }
+ else
+ {
+ len = lstrlenW(lpKeyName);
+ lpSlash = lpKeyName+len;
+ }
+ *hKey = NULL;
+
+ for (i = 0; i < REG_CLASS_NUMBER; i++) {
+ if (CompareStringW(LOCALE_USER_DEFAULT, 0, lpKeyName, len, reg_class_namesW[i], len) == CSTR_EQUAL &&
+ len == lstrlenW(reg_class_namesW[i])) {
+ *hKey = reg_class_keys[i];
+ break;
+ }
+ }
+
+ if (*hKey == NULL)
+ return FALSE;
+
+
+ if (*lpSlash != '\0')
+ lpSlash++;
+ *lpKeyPath = lpSlash;
+ return TRUE;
+}
+
/* Globals used by the setValue() & co */
static LPSTR currentKeyName;
static HKEY currentKeyHandle = NULL;
@@ -455,10 +528,19 @@ static void processRegEntry(LPSTR stdInput)
/* delete the key if we encounter '-' at the start of reg key */
if ( stdInput[0] == '-')
- delete_registry_key(stdInput+1);
- else if ( openKey(stdInput) != ERROR_SUCCESS )
+ {
+ WCHAR* stdInputW = NULL;
+ int size = keyEnd - stdInput - 1;
+ stdInputW = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, size * sizeof(WCHAR));
+ CHECK_ENOUGH_MEMORY(stdInputW);
+ MultiByteToWideChar(CP_ACP, 0, stdInput + 1, size, stdInputW, size);
+ delete_registry_keyW(stdInputW);
+ HeapFree(GetProcessHeap(), 0, stdInputW);
+ } else if ( openKey(stdInput) != ERROR_SUCCESS )
+ {
fprintf(stderr,"%s: setValue failed to open key %s\n",
getAppName(), stdInput);
+ }
} else if( currentKeyHandle &&
(( stdInput[0] == '@') || /* reading a default @=data pair */
( stdInput[0] == '\"'))) /* reading a new value=data pair */
@@ -1001,3 +1083,29 @@ void delete_registry_key(CHAR *reg_key_name)
RegDeleteTreeA(key_class, key_name);
}
+
+void delete_registry_keyW(WCHAR *reg_key_name)
+{
+ WCHAR *key_name = NULL;
+ HKEY key_class;
+
+ if (!reg_key_name || !reg_key_name[0])
+ return;
+
+ if (!parseKeyNameW(reg_key_name, &key_class, &key_name)) {
+ char* reg_key_nameA = GetMultiByteString(reg_key_name, lstrlenW(reg_key_name));
+ fprintf(stderr,"%s: Incorrect registry class specification in '%s'\n",
+ getAppName(), reg_key_nameA);
+ HeapFree(GetProcessHeap(), 0, reg_key_nameA);
+ exit(1);
+ }
+ if (!*key_name) {
+ char* reg_key_nameA = GetMultiByteString(reg_key_name, lstrlenW(reg_key_name));
+ fprintf(stderr,"%s: Can't delete registry class '%s'\n",
+ getAppName(), reg_key_nameA);
+ HeapFree(GetProcessHeap(), 0, reg_key_nameA);
+ exit(1);
+ }
+
+ RegDeleteTreeW(key_class, key_name);
+}
diff --git a/programs/regedit/regproc.h b/programs/regedit/regproc.h
index d0209e8..59e1b0c 100644
--- a/programs/regedit/regproc.h
+++ b/programs/regedit/regproc.h
@@ -24,4 +24,5 @@ const CHAR *getAppName(void);
BOOL export_registry_key(CHAR *file_name, CHAR *reg_key_name);
BOOL import_registry_file(LPTSTR filename);
void delete_registry_key(CHAR *reg_key_name);
+void delete_registry_keyW(WCHAR *reg_key_name);
void processRegLines(FILE *in);
More information about the wine-cvs
mailing list