Index: base/applications/regedit/lang/en-US.rc =================================================================== --- base/applications/regedit/lang/en-US.rc (revision 49463) +++ base/applications/regedit/lang/en-US.rc (working copy) @@ -274,6 +274,10 @@ ID_REGISTRY_IMPORTREGISTRYFILE "Imports a text file into the registry" ID_REGISTRY_EXPORTREGISTRYFILE "Exports all or part of the registry to a text file" + ID_REGISTRY_LOADHIVE + "Loads a hive file into the registry" + ID_REGISTRY_UNLOADHIVE + "Unloads a hive from the registry" ID_REGISTRY_CONNECTNETWORKREGISTRY "Connects to a remote computer's registry" ID_REGISTRY_DISCONNECTNETWORKREGISTRY @@ -330,6 +334,8 @@ IDS_MY_COMPUTER "My Computer" IDS_IMPORT_REG_FILE "Import Registry File" IDS_EXPORT_REG_FILE "Export Registry File" + IDS_LOAD_HIVE "Load Hive" + IDS_UNLOAD_HIVE "Unload Hive" IDS_INVALID_DWORD "(invalid DWORD value)" END @@ -392,6 +398,20 @@ EDITTEXT IDC_EXPORT_BRANCH_TEXT,30,34,335,12 END +// +// Dialog resources +// +IDD_LOADHIVE DIALOGEX DISCARDABLE 0, 0, 193, 34 +STYLE DS_SHELLFONT | DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU +CAPTION "Load Hive" +FONT 8, "Ms Shell Dlg" +{ + LTEXT "&Key:", IDC_STATIC, 4, 4, 15, 8, SS_LEFT + EDITTEXT IDC_EDIT_KEY, 23, 2, 167, 13 + DEFPUSHBUTTON "OK", IDOK, 140, 17, 50, 14 + PUSHBUTTON "Cancel", IDCANCEL, 89, 17, 50, 14 +} + IDD_ADDFAVORITES DIALOGEX DISCARDABLE 0, 0, 186, 46 STYLE DS_SHELLFONT | DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU CAPTION "Add to Favorites" Index: base/applications/regedit/regproc.c =================================================================== --- base/applications/regedit/regproc.c (revision 49463) +++ base/applications/regedit/regproc.c (working copy) @@ -30,22 +30,25 @@ */ #define REG_FILE_HEX_LINE_LEN (2 + 25 * 3) -static const CHAR *reg_class_names[] = { +static const CHAR *reg_class_names[] = +{ "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])) -const WCHAR* reg_class_namesW[REG_CLASS_NUMBER] = { +const WCHAR* reg_class_namesW[REG_CLASS_NUMBER] = +{ L"HKEY_LOCAL_MACHINE", L"HKEY_USERS", L"HKEY_CLASSES_ROOT", L"HKEY_CURRENT_CONFIG", L"HKEY_CURRENT_USER", L"HKEY_DYN_DATA" }; -static HKEY reg_class_keys[REG_CLASS_NUMBER] = { +static HKEY reg_class_keys[REG_CLASS_NUMBER] = +{ HKEY_LOCAL_MACHINE, HKEY_USERS, HKEY_CLASSES_ROOT, HKEY_CURRENT_CONFIG, HKEY_CURRENT_USER, HKEY_DYN_DATA - }; +}; /* return values */ #define NOT_ENOUGH_MEMORY 1 @@ -149,7 +152,8 @@ char dummy; WideCharToMultiByte(CP_ACP, 0, str, -1, buf, 9, NULL, NULL); - if (lstrlenW(str) > 8 || sscanf(buf, "%lx%c", dw, &dummy) != 1) { + if (lstrlenW(str) > 8 || sscanf(buf, "%lx%c", dw, &dummy) != 1) + { fprintf(stderr,"%s: ERROR, invalid hex value\n", getAppName()); return FALSE; } @@ -172,12 +176,14 @@ s = str; d = data; *size=0; - while (*s != '\0') { + while (*s != '\0') + { UINT wc; WCHAR *end; wc = wcstoul(s,&end, 16); - if (end == s || wc > 0xff || (*end && *end != L',')) { + if (end == s || wc > 0xff || (*end && *end != L',')) + { char* strA = GetMultiByteString(s); fprintf(stderr,"%s: ERROR converting CSV hex stream. Invalid value at '%s'\n", getAppName(), strA); @@ -203,7 +209,13 @@ */ static DWORD getDataType(LPWSTR *lpValue, DWORD* parse_type) { - struct data_type { const WCHAR *tag; int len; int type; int parse_type; }; + struct data_type + { + const WCHAR *tag; + int len; + int type; + int parse_type; + }; static const WCHAR quote[] = {'"'}; static const WCHAR str[] = {'s','t','r',':','"'}; @@ -225,7 +237,8 @@ const struct data_type *ptr; int type; - for (ptr = data_types; ptr->tag; ptr++) { + for (ptr = data_types; ptr->tag; ptr++) + { if (wcsncmp(ptr->tag, *lpValue, ptr->len)) continue; @@ -233,14 +246,18 @@ *parse_type = ptr->parse_type; type=ptr->type; *lpValue+=ptr->len; - if (type == -1) { + if (type == -1) + { WCHAR* end; /* "hex(xx):" is special */ type = (int)wcstoul( *lpValue , &end, 16 ); - if (**lpValue=='\0' || *end!=')' || *(end+1)!=':') { + if (**lpValue=='\0' || *end!=')' || *(end+1)!=':') + { type=REG_NONE; - } else { + } + else + { *lpValue = end + 2; } } @@ -258,10 +275,13 @@ int str_idx = 0; /* current character under analysis */ int val_idx = 0; /* the last character of the unescaped string */ int len = lstrlenW(str); - for (str_idx = 0; str_idx < len; str_idx++, val_idx++) { - if (str[str_idx] == '\\') { + for (str_idx = 0; str_idx < len; str_idx++, val_idx++) + { + if (str[str_idx] == '\\') + { str_idx++; - switch (str[str_idx]) { + switch (str[str_idx]) + { case 'n': str[val_idx] = '\n'; break; @@ -275,7 +295,9 @@ str[val_idx] = str[str_idx]; break; } - } else { + } + else + { str[val_idx] = str[str_idx]; } } @@ -310,9 +332,12 @@ } *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])) { + 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; } @@ -485,29 +510,39 @@ /* get value name */ while ( iswspace(line[line_idx]) ) line_idx++; - if (line[line_idx] == '@' && line[line_idx + 1] == '=') { + if (line[line_idx] == '@' && line[line_idx + 1] == '=') + { line[line_idx] = '\0'; val_name = line; line_idx++; - } else if (line[line_idx] == '\"') { + } + else if (line[line_idx] == '\"') + { line_idx++; val_name = line + line_idx; - while (TRUE) { + while (TRUE) + { if (line[line_idx] == '\\') /* skip escaped character */ { line_idx += 2; - } else { - if (line[line_idx] == '\"') { + } + else + { + if (line[line_idx] == '\"') + { line[line_idx] = '\0'; line_idx++; break; - } else { + } + else + { line_idx++; } } } while ( iswspace(line[line_idx]) ) line_idx++; - if (line[line_idx] != '=') { + if (line[line_idx] != '=') + { char* lineA; line[line_idx] = '\"'; lineA = GetMultiByteString(line); @@ -516,7 +551,9 @@ return; } - } else { + } + else + { char* lineA = GetMultiByteString(line); fprintf(stderr,"Warning! unrecognized line:\n%s\n", lineA); HeapFree(GetProcessHeap(), 0, lineA); @@ -558,7 +595,8 @@ * We encountered the end of the file, make sure we * close the opened key and exit */ - if (stdInput == NULL) { + if (stdInput == NULL) + { closeKey(); return; } @@ -578,19 +616,22 @@ if ( stdInput[0] == '-') { delete_registry_key(stdInput + 1); - } else if ( openKeyW(stdInput) != ERROR_SUCCESS ) + } + else if ( openKeyW(stdInput) != ERROR_SUCCESS ) { char* stdInputA = GetMultiByteString(stdInput); fprintf(stderr,"%s: setValue failed to open key %s\n", getAppName(), stdInputA); HeapFree(GetProcessHeap(), 0, stdInputA); } - } else if( currentKeyHandle && + } + else if( currentKeyHandle && (( stdInput[0] == '@') || /* reading a default @=data pair */ ( stdInput[0] == '\"'))) /* reading a new value=data pair */ { processSetValue(stdInput, isUnicode); - } else + } + else { /* Since we are assuming that the file format is valid we must be * reading a blank line which indicates the end of this key processing @@ -614,13 +655,15 @@ line = HeapAlloc(GetProcessHeap(), 0, lineSize); CHECK_ENOUGH_MEMORY(line); - while (!feof(in)) { + while (!feof(in)) + { LPSTR s; /* The pointer into line for where the current fgets should read */ LPSTR check; WCHAR* lineW; s = line; - for (;;) { + for (;;) + { size_t size_remaining; int size_to_get; char *s_eol; /* various local uses */ @@ -650,11 +693,15 @@ check = fgets (s, size_to_get, in); - if (check == NULL) { - if (ferror(in)) { + if (check == NULL) + { + if (ferror(in)) + { perror ("While reading input"); exit (IO_ERROR); - } else { + } + else + { assert (feof(in)); *s = '\0'; /* It is not clear to me from the definition that the @@ -666,35 +713,41 @@ /* If we didn't read the eol nor the eof go around for the rest */ s_eol = strchr (s, '\n'); - if (!feof (in) && !s_eol) { + if (!feof (in) && !s_eol) + { s = strchr (s, '\0'); /* It should be s + size_to_get - 1 but this is safer */ continue; } /* If it is a comment line then discard it and go around again */ - if (line [0] == '#') { + if (line [0] == '#') + { s = line; continue; } /* Remove any line feed. Leave s_eol on the \0 */ - if (s_eol) { + if (s_eol) + { *s_eol = '\0'; if (s_eol > line && *(s_eol-1) == '\r') *--s_eol = '\0'; - } else + } + else s_eol = strchr (s, '\0'); /* If there is a concatenating \\ then go around again */ - if (s_eol > line && *(s_eol-1) == '\\') { + if (s_eol > line && *(s_eol-1) == '\\') + { int c; s = s_eol-1; do { c = fgetc(in); - } while(c == ' ' || c == '\t'); + } + while(c == ' ' || c == '\t'); if(c == EOF) { @@ -737,7 +790,8 @@ s = buf; line = buf; - while(!feof(in)) { + while(!feof(in)) + { size_t size_remaining; int size_to_get; WCHAR *s_eol = NULL; /* various local uses */ @@ -769,11 +823,15 @@ CharsInBuf = fread(s, sizeof(WCHAR), size_to_get - 1, in); s[CharsInBuf] = 0; - if (CharsInBuf == 0) { - if (ferror(in)) { + if (CharsInBuf == 0) + { + if (ferror(in)) + { perror ("While reading input"); exit (IO_ERROR); - } else { + } + else + { assert (feof(in)); *s = '\0'; /* It is not clear to me from the definition that the @@ -788,7 +846,8 @@ { s_eol = wcschr(line, '\n'); - if(!s_eol) { + if(!s_eol) + { /* Move the stub of the line to the start of the buffer so * we get the maximum space to read into, and so we don't * have to recalculate 'line' if the buffer expands */ @@ -799,14 +858,16 @@ } /* If it is a comment line then discard it and go around again */ - if (*line == '#') { + if (*line == '#') + { line = s_eol + 1; continue; } /* If there is a concatenating \\ then go around again */ if ((*(s_eol-1) == '\\') || - (*(s_eol-1) == '\r' && *(s_eol-2) == '\\')) { + (*(s_eol-1) == '\r' && *(s_eol-2) == '\\')) + { WCHAR* NextLine = s_eol; while(*(NextLine+1) == ' ' || *(NextLine+1) == '\t') @@ -824,7 +885,8 @@ } /* Remove any line feed. Leave s_eol on the \0 */ - if (s_eol) { + if (s_eol) + { *s_eol = '\0'; if (s_eol > buf && *(s_eol-1) == '\r') *(s_eol-1) = '\0'; @@ -860,7 +922,8 @@ error_code = GetLastError (); status = FormatMessage(FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM, NULL, error_code, 0, (LPTSTR) &lpMsgBuf, 0, NULL); - if (!status) { + if (!status) + { fprintf(stderr,"%s: Cannot display message for error %ld, status %ld\n", getAppName(), error_code, GetLastError()); exit(1); @@ -883,7 +946,8 @@ static void REGPROC_resize_char_buffer(WCHAR **buffer, DWORD *len, DWORD required_len) { required_len++; - if (required_len > *len) { + if (required_len > *len) + { *len = required_len; if (!*buffer) *buffer = HeapAlloc(GetProcessHeap(), 0, *len * sizeof(**buffer)); @@ -903,7 +967,8 @@ */ static void REGPROC_resize_binary_buffer(BYTE **buffer, DWORD *size, DWORD required_size) { - if (required_size > *size) { + if (required_size > *size) + { *size = required_size; if (!*buffer) *buffer = HeapAlloc(GetProcessHeap(), 0, *size); @@ -921,16 +986,20 @@ DWORD i, pos; DWORD extra = 0; - REGPROC_resize_char_buffer(line_buf, line_buf_size, *line_len + str_len + 10); + REGPROC_resize_char_buffer(line_buf, line_buf_size, + *line_len + str_len + 10); /* escaping characters */ pos = *line_len; - for (i = 0; i < str_len; i++) { + for (i = 0; i < str_len; i++) + { WCHAR c = str[i]; - switch (c) { + switch (c) + { case '\n': extra++; - REGPROC_resize_char_buffer(line_buf, line_buf_size, *line_len + str_len + extra); + REGPROC_resize_char_buffer(line_buf, line_buf_size, + *line_len + str_len + extra); (*line_buf)[pos++] = '\\'; (*line_buf)[pos++] = 'n'; break; @@ -938,7 +1007,8 @@ case '\\': case '"': extra++; - REGPROC_resize_char_buffer(line_buf, line_buf_size, *line_len + str_len + extra); + REGPROC_resize_char_buffer(line_buf, line_buf_size, + *line_len + str_len + extra); (*line_buf)[pos++] = '\\'; /* Fall through */ @@ -951,7 +1021,9 @@ *line_len = pos; } -static void REGPROC_export_binary(WCHAR **line_buf, DWORD *line_buf_size, DWORD *line_len, DWORD type, BYTE *value, DWORD value_size, BOOL unicode) +static void REGPROC_export_binary(WCHAR **line_buf, DWORD *line_buf_size, + DWORD *line_len, DWORD type, BYTE *value, + DWORD value_size, BOOL unicode) { DWORD hex_pos, data_pos; const WCHAR *hex_prefix; @@ -962,15 +1034,20 @@ const WCHAR newline[] = {'\n',0}; CHAR* value_multibyte = NULL; - if (type == REG_BINARY) { + if (type == REG_BINARY) + { hex_prefix = hex; - } else { + } + else + { const WCHAR hex_format[] = {'h','e','x','(','%','u',')',':',0}; hex_prefix = hex_buf; wsprintfW(hex_buf, hex_format, type); - if ((type == REG_SZ || type == REG_EXPAND_SZ || type == REG_MULTI_SZ) && !unicode) + if ((type == REG_SZ || type == REG_EXPAND_SZ || + type == REG_MULTI_SZ) && !unicode) { - value_multibyte = GetMultiByteStringN((WCHAR*)value, value_size / sizeof(WCHAR), &value_size); + value_multibyte = GetMultiByteStringN((WCHAR*)value, + value_size / sizeof(WCHAR), &value_size); value = (BYTE*)value_multibyte; } } @@ -1011,7 +1088,8 @@ column += 3; /* wrap the line */ - if (column >= REG_FILE_HEX_LINE_LEN) { + if (column >= REG_FILE_HEX_LINE_LEN) + { lstrcpyW(*line_buf + data_pos, concat); data_pos += concat_len; column = concat_prefix; @@ -1062,11 +1140,11 @@ * val_size - size of the buffer for storing values in bytes. */ static void export_hkey(FILE *file, HKEY key, - WCHAR **reg_key_name_buf, DWORD *reg_key_name_size, - WCHAR **val_name_buf, DWORD *val_name_size, - BYTE **val_buf, DWORD *val_size, - WCHAR **line_buf, DWORD *line_buf_size, - BOOL unicode) +WCHAR **reg_key_name_buf, DWORD *reg_key_name_size, +WCHAR **val_name_buf, DWORD *val_name_size, +BYTE **val_buf, DWORD *val_size, +WCHAR **line_buf, DWORD *line_buf_size, +BOOL unicode) { DWORD max_sub_key_len; DWORD max_val_name_len; @@ -1081,7 +1159,8 @@ if (RegQueryInfoKeyW(key, NULL, NULL, NULL, NULL, &max_sub_key_len, NULL, NULL, &max_val_name_len, &max_val_size, NULL, NULL - ) != ERROR_SUCCESS) { + ) != ERROR_SUCCESS) + { REGPROC_print_error(); } curr_len = lstrlenW(*reg_key_name_buf); @@ -1090,7 +1169,8 @@ REGPROC_resize_char_buffer(val_name_buf, val_name_size, max_val_name_len); REGPROC_resize_binary_buffer(val_buf, val_size, max_val_size); - REGPROC_resize_char_buffer(line_buf, line_buf_size, lstrlenW(*reg_key_name_buf) + 4); + REGPROC_resize_char_buffer(line_buf, line_buf_size, + lstrlenW(*reg_key_name_buf) + 4); /* output data for the current key */ wsprintfW(*line_buf, key_format, *reg_key_name_buf); REGPROC_write_line(file, *line_buf, unicode); @@ -1098,52 +1178,69 @@ /* print all the values */ i = 0; more_data = TRUE; - while(more_data) { + while(more_data) + { DWORD value_type; DWORD val_name_size1 = *val_name_size; DWORD val_size1 = *val_size; ret = RegEnumValueW(key, i, *val_name_buf, &val_name_size1, NULL, &value_type, *val_buf, &val_size1); - if (ret == ERROR_MORE_DATA) { + if (ret == ERROR_MORE_DATA) + { /* Increase the size of the buffers and retry */ REGPROC_resize_char_buffer(val_name_buf, val_name_size, val_name_size1); REGPROC_resize_binary_buffer(val_buf, val_size, val_size1); - } else if (ret != ERROR_SUCCESS) { + } + else if (ret != ERROR_SUCCESS) + { more_data = FALSE; - if (ret != ERROR_NO_MORE_ITEMS) { + if (ret != ERROR_NO_MORE_ITEMS) + { REGPROC_print_error(); } - } else { + } + else + { DWORD line_len; i++; - if ((*val_name_buf)[0]) { + if ((*val_name_buf)[0]) + { const WCHAR val_start[] = {'"','%','s','"','=',0}; line_len = 0; - REGPROC_export_string(line_buf, line_buf_size, &line_len, *val_name_buf, lstrlenW(*val_name_buf)); - REGPROC_resize_char_buffer(val_name_buf, val_name_size, lstrlenW(*line_buf) + 1); + REGPROC_export_string(line_buf, line_buf_size, &line_len, + *val_name_buf, lstrlenW(*val_name_buf)); + REGPROC_resize_char_buffer(val_name_buf, val_name_size, + lstrlenW(*line_buf) + 1); lstrcpyW(*val_name_buf, *line_buf); line_len = 3 + lstrlenW(*val_name_buf); REGPROC_resize_char_buffer(line_buf, line_buf_size, line_len); wsprintfW(*line_buf, val_start, *val_name_buf); - } else { + } + else + { const WCHAR std_val[] = {'@','=',0}; line_len = 2; REGPROC_resize_char_buffer(line_buf, line_buf_size, line_len); lstrcpyW(*line_buf, std_val); } - switch (value_type) { + switch (value_type) + { case REG_SZ: { WCHAR* wstr = (WCHAR*)*val_buf; if (val_size1 < sizeof(WCHAR) || val_size1 % sizeof(WCHAR) || - wstr[val_size1 / sizeof(WCHAR) - 1]) { - REGPROC_export_binary(line_buf, line_buf_size, &line_len, value_type, *val_buf, val_size1, unicode); - } else { + wstr[val_size1 / sizeof(WCHAR) - 1]) + { + REGPROC_export_binary(line_buf, line_buf_size, &line_len, + value_type, *val_buf, val_size1, unicode); + } + else + { const WCHAR start[] = {'"',0}; const WCHAR end[] = {'"','\n',0}; DWORD len; @@ -1156,9 +1253,11 @@ /* At this point we know wstr is '\0'-terminated * so we can substract 1 from the size */ - REGPROC_export_string(line_buf, line_buf_size, &line_len, wstr, val_size1 / sizeof(WCHAR) - 1); + REGPROC_export_string(line_buf, line_buf_size, &line_len, + wstr, val_size1 / sizeof(WCHAR) - 1); - REGPROC_resize_char_buffer(line_buf, line_buf_size, line_len + lstrlenW(end)); + REGPROC_resize_char_buffer(line_buf, line_buf_size, + line_len + lstrlenW(end)); lstrcpyW(*line_buf + line_len, end); } break; @@ -1190,7 +1289,8 @@ case REG_MULTI_SZ: /* falls through */ case REG_BINARY: - REGPROC_export_binary(line_buf, line_buf_size, &line_len, value_type, *val_buf, val_size1, unicode); + REGPROC_export_binary(line_buf, line_buf_size, &line_len, + value_type, *val_buf, val_size1, unicode); } REGPROC_write_line(file, *line_buf, unicode); } @@ -1199,30 +1299,41 @@ i = 0; more_data = TRUE; (*reg_key_name_buf)[curr_len] = '\\'; - while(more_data) { + while(more_data) + { DWORD buf_size = *reg_key_name_size - curr_len - 1; ret = RegEnumKeyExW(key, i, *reg_key_name_buf + curr_len + 1, &buf_size, NULL, NULL, NULL, NULL); - if (ret == ERROR_MORE_DATA) { + if (ret == ERROR_MORE_DATA) + { /* Increase the size of the buffer and retry */ - REGPROC_resize_char_buffer(reg_key_name_buf, reg_key_name_size, curr_len + 1 + buf_size); - } else if (ret != ERROR_SUCCESS) { + REGPROC_resize_char_buffer(reg_key_name_buf, reg_key_name_size, + curr_len + 1 + buf_size); + } + else if (ret != ERROR_SUCCESS) + { more_data = FALSE; - if (ret != ERROR_NO_MORE_ITEMS) { + if (ret != ERROR_NO_MORE_ITEMS) + { REGPROC_print_error(); } - } else { + } + else + { HKEY subkey; i++; if (RegOpenKeyW(key, *reg_key_name_buf + curr_len + 1, - &subkey) == ERROR_SUCCESS) { + &subkey) == ERROR_SUCCESS) + { export_hkey(file, subkey, reg_key_name_buf, reg_key_name_size, val_name_buf, val_name_size, val_buf, val_size, line_buf, line_buf_size, unicode); RegCloseKey(subkey); - } else { + } + else + { REGPROC_print_error(); } } @@ -1246,7 +1357,8 @@ file = _wfopen(file_name, L"wb"); else file = _wfopen(file_name, L"w"); - if (!file) { + if (!file) + { CHAR* file_nameA = GetMultiByteString(file_name); perror(""); fprintf(stderr,"%s: Can't open file \"%s\"\n", getAppName(), file_nameA); @@ -1298,7 +1410,8 @@ line_buf = HeapAlloc(GetProcessHeap(), 0, line_buf_size * sizeof(*line_buf)); CHECK_ENOUGH_MEMORY(reg_key_name_buf && val_name_buf && val_buf && line_buf); - if (reg_key_name && reg_key_name[0]) { + if (reg_key_name && reg_key_name[0]) + { HKEY reg_key_class; WCHAR *branch_name = NULL; HKEY key; @@ -1308,14 +1421,16 @@ lstrcpyW(reg_key_name_buf, reg_key_name); /* open the specified key */ - if (!parseKeyName(reg_key_name, ®_key_class, &branch_name)) { + if (!parseKeyName(reg_key_name, ®_key_class, &branch_name)) + { CHAR* key_nameA = GetMultiByteString(reg_key_name); fprintf(stderr,"%s: Incorrect registry class specification in '%s'\n", getAppName(), key_nameA); HeapFree(GetProcessHeap(), 0, key_nameA); exit(1); } - if (!branch_name[0]) { + if (!branch_name[0]) + { /* no branch - registry class is specified */ file = REGPROC_open_export_file(file_name, unicode); export_hkey(file, reg_key_class, @@ -1323,7 +1438,9 @@ &val_name_buf, &val_name_size, &val_buf, &val_size, &line_buf, &line_buf_size, unicode); - } else if (RegOpenKeyW(reg_key_class, branch_name, &key) == ERROR_SUCCESS) { + } + else if (RegOpenKeyW(reg_key_class, branch_name, &key) == ERROR_SUCCESS) + { file = REGPROC_open_export_file(file_name, unicode); export_hkey(file, key, ®_key_name_buf, ®_key_name_size, @@ -1331,24 +1448,30 @@ &val_buf, &val_size, &line_buf, &line_buf_size, unicode); RegCloseKey(key); - } else { + } + else + { CHAR* key_nameA = GetMultiByteString(reg_key_name); fprintf(stderr,"%s: Can't export. Registry key '%s' does not exist!\n", getAppName(), key_nameA); HeapFree(GetProcessHeap(), 0, key_nameA); REGPROC_print_error(); } - } else { + } + else + { unsigned int i; /* export all registry classes */ file = REGPROC_open_export_file(file_name, unicode); - for (i = 0; i < REG_CLASS_NUMBER; i++) { + for (i = 0; i < REG_CLASS_NUMBER; i++) + { /* do not export HKEY_CLASSES_ROOT */ if (reg_class_keys[i] != HKEY_CLASSES_ROOT && reg_class_keys[i] != HKEY_CURRENT_USER && reg_class_keys[i] != HKEY_CURRENT_CONFIG && - reg_class_keys[i] != HKEY_DYN_DATA) { + reg_class_keys[i] != HKEY_DYN_DATA) + { lstrcpyW(reg_key_name_buf, reg_class_namesW[i]); export_hkey(file, reg_class_keys[i], ®_key_name_buf, ®_key_name_size, @@ -1359,7 +1482,8 @@ } } - if (file) { + if (file) + { fclose(file); } HeapFree(GetProcessHeap(), 0, reg_key_name); @@ -1382,7 +1506,8 @@ if (s[0] == 0xff && s[1] == 0xfe) { processRegLinesW(reg_file); - } else + } + else { fseek(reg_file, 0, SEEK_SET); processRegLinesA(reg_file); @@ -1408,14 +1533,16 @@ if (!reg_key_name || !reg_key_name[0]) return; - if (!parseKeyName(reg_key_name, &key_class, &key_name)) { + if (!parseKeyName(reg_key_name, &key_class, &key_name)) + { char* reg_key_nameA = GetMultiByteString(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) { + if (!*key_name) + { char* reg_key_nameA = GetMultiByteString(reg_key_name); fprintf(stderr,"%s: Can't delete registry class '%s'\n", getAppName(), reg_key_nameA); Index: base/applications/regedit/framewnd.c =================================================================== --- base/applications/regedit/framewnd.c (revision 49463) +++ base/applications/regedit/framewnd.c (working copy) @@ -45,7 +45,8 @@ prect->bottom -= rt.bottom+3; } */ - if (IsWindowVisible(hStatusBar)) { + if (IsWindowVisible(hStatusBar)) + { SetupStatusBar(hWnd, TRUE); GetClientRect(hStatusBar, &rt); prect->bottom -= rt.bottom; @@ -97,7 +98,8 @@ { cbValueName = COUNT_OF(szValueName); cbValueData = sizeof(abValueData); - lResult = RegEnumValue(hKey, dwIndex, szValueName, &cbValueName, NULL, &dwType, abValueData, &cbValueData); + lResult = RegEnumValue(hKey, dwIndex, szValueName, &cbValueName, NULL, &dwType, + abValueData, &cbValueData); if ((lResult == ERROR_SUCCESS) && (dwType == REG_SZ)) { if (!bDisplayedAny) @@ -141,12 +143,15 @@ TCHAR str[100]; _tcscpy(str, _T("")); - if (nFlags & MF_POPUP) { - if (hSysMenu != GetMenu(hWnd)) { + if (nFlags & MF_POPUP) + { + if (hSysMenu != GetMenu(hWnd)) + { if (nItemID == 2) nItemID = 5; } } - if (LoadString(hInst, nItemID, str, 100)) { + if (LoadString(hInst, nItemID, str, 100)) + { /* load appropriate string*/ LPTSTR lpsz = str; /* first newline terminates actual string*/ @@ -191,7 +196,8 @@ { DWORD dwErrorCode = CommDlgExtendedError(); UNREFERENCED_PARAMETER(hWnd); - switch (dwErrorCode) { + switch (dwErrorCode) + { case CDERR_DIALOGFAILURE: break; case CDERR_FINDRESFAILURE: @@ -282,6 +288,108 @@ return TRUE; } +static INT_PTR CALLBACK LoadHive_KeyNameInHookProc(HWND hWndDlg, UINT uMsg, WPARAM wParam, LPARAM lParam) +{ + static LPTSTR sKey = NULL; + static INT sLength = 0; + switch(uMsg) + { + case WM_INITDIALOG: + sKey = (LPTSTR)lParam; + sLength = 128; /* FIXME: Ugly hack! */ + case WM_COMMAND: + switch(LOWORD(wParam)) + { + case IDOK: + if(GetDlgItemText(hWndDlg, IDC_EDIT_KEY, sKey, sLength)) + return EndDialog(hWndDlg, -1); + else + return EndDialog(hWndDlg, 0); + case IDCANCEL: + return EndDialog(hWndDlg, 0); + } + break; + } + return FALSE; +} + +static BOOL LoadHive(HWND hWnd) +{ + OPENFILENAME ofn; + TCHAR Caption[128]; + LPCTSTR pszKeyPath; + TCHAR xPath[128]; + HKEY hRootKey; + TCHAR Filter[1024]; + FILTERPAIR filter; + /* get the item key to load the hive in */ + pszKeyPath = GetItemPath(g_pChildWnd->hTreeWnd, 0, &hRootKey); + /* initialize the "open file" dialog */ + InitOpenFileName(hWnd, &ofn); + /* build the "All Files" filter up */ + filter.DisplayID = IDS_FLT_ALLFILES; + filter.FilterID = IDS_FLT_ALLFILES_FLT; + BuildFilterStrings(Filter, &filter, sizeof(filter)); + ofn.lpstrFilter = Filter; + /* load and set the caption and flags for dialog */ + LoadString(hInst, IDS_LOAD_HIVE, Caption, COUNT_OF(Caption)); + ofn.lpstrTitle = Caption; + ofn.Flags |= OFN_ENABLESIZING; + /* ofn.lCustData = ;*/ + /* now load the hive */ + if (GetOpenFileName(&ofn)) + { + if(DialogBoxParam(hInst, MAKEINTRESOURCE(IDD_LOADHIVE), hWnd, + &LoadHive_KeyNameInHookProc, (LPARAM)xPath)) + { + LONG regLoadResult = RegLoadKey(hRootKey, xPath, ofn.lpstrFile); + if(regLoadResult == ERROR_SUCCESS) + { + /* refresh tree and list views */ + RefreshTreeView(g_pChildWnd->hTreeWnd); + pszKeyPath = GetItemPath(g_pChildWnd->hTreeWnd, 0, &hRootKey); + RefreshListView(g_pChildWnd->hListWnd, hRootKey, pszKeyPath); + } + else + { + ErrorMessageBox(hWnd, Caption, regLoadResult); + return FALSE; + } + } + } + else + { + CheckCommDlgError(hWnd); + } + return TRUE; +} + +static BOOL UnloadHive(HWND hWnd) +{ + TCHAR Caption[128]; + LPCTSTR pszKeyPath; + HKEY hRootKey; + /* get the item key to unload */ + pszKeyPath = GetItemPath(g_pChildWnd->hTreeWnd, 0, &hRootKey); + /* load and set the caption and flags for dialog */ + LoadString(hInst, IDS_UNLOAD_HIVE, Caption, COUNT_OF(Caption)); + /* now unload the hive */ + LONG regUnloadResult = RegUnLoadKey(hRootKey, pszKeyPath); + if(regUnloadResult == ERROR_SUCCESS) + { + /* refresh tree and list views */ + RefreshTreeView(g_pChildWnd->hTreeWnd); + pszKeyPath = GetItemPath(g_pChildWnd->hTreeWnd, 0, &hRootKey); + RefreshListView(g_pChildWnd->hListWnd, hRootKey, pszKeyPath); + } + else + { + ErrorMessageBox(hWnd, Caption, regUnloadResult); + return FALSE; + } + return TRUE; +} + static BOOL ImportRegistryFile(HWND hWnd) { OPENFILENAME ofn; @@ -294,9 +402,11 @@ ofn.lpstrTitle = Caption; ofn.Flags |= OFN_ENABLESIZING; /* ofn.lCustData = ;*/ - if (GetOpenFileName(&ofn)) { + if (GetOpenFileName(&ofn)) + { FILE *fp = _wfopen(ofn.lpstrFile, L"r"); - if (fp == NULL || !import_registry_file(fp)) { + if (fp == NULL || !import_registry_file(fp)) + { LPSTR p = GetMultiByteString(ofn.lpstrFile); fprintf(stderr, "Can't open file \"%s\"\n", p); HeapFree(GetProcessHeap(), 0, p); @@ -305,7 +415,9 @@ return FALSE; } fclose(fp); - } else { + } + else + { CheckCommDlgError(hWnd); } @@ -316,8 +428,8 @@ return TRUE; } - -static UINT_PTR CALLBACK ExportRegistryFile_OFNHookProc(HWND hdlg, UINT uiMsg, WPARAM wParam, LPARAM lParam) +static UINT_PTR CALLBACK ExportRegistryFile_OFNHookProc(HWND hdlg, UINT uiMsg, + WPARAM wParam, LPARAM lParam) { HWND hwndExportAll; HWND hwndExportBranch; @@ -329,7 +441,8 @@ UNREFERENCED_PARAMETER(wParam); - switch(uiMsg) { + switch(uiMsg) + { case WM_INITDIALOG: pOfn = (OPENFILENAME *) lParam; pszSelectedKey = (LPTSTR) pOfn->lCustData; @@ -394,22 +507,26 @@ ofn.Flags = OFN_ENABLETEMPLATE | OFN_EXPLORER | OFN_ENABLEHOOK | OFN_OVERWRITEPROMPT; ofn.lpfnHook = ExportRegistryFile_OFNHookProc; ofn.lpTemplateName = MAKEINTRESOURCE(IDD_EXPORTRANGE); - if (GetSaveFileName(&ofn)) { + if (GetSaveFileName(&ofn)) + { BOOL result; DWORD format; - + if (ofn.nFilterIndex == 1) format = REG_FORMAT_5; else format = REG_FORMAT_4; result = export_registry_key(ofn.lpstrFile, ExportKeyPath, format); - if (!result) { + if (!result) + { LPSTR p = GetMultiByteString(ofn.lpstrFile); fprintf(stderr, "Can't open file \"%s\"\n", p); HeapFree(GetProcessHeap(), 0, p); return FALSE; } - } else { + } + else + { CheckCommDlgError(hWnd); } return TRUE; @@ -432,7 +549,8 @@ pd.nToPage = 0xFFFF; pd.nMinPage = 1; pd.nMaxPage = 0xFFFF; - if (PrintDlg(&pd)) { + if (PrintDlg(&pd)) + { /* GDI calls to render output. */ DeleteDC(pd.hDC); /* Delete DC when done.*/ } @@ -441,8 +559,10 @@ PRINTDLGEX pd; hResult = PrintDlgEx(&pd); - if (hResult == S_OK) { - switch (pd.dwResultAction) { + if (hResult == S_OK) + { + switch (pd.dwResultAction) + { case PD_RESULT_APPLY: /*The user clicked the Apply button and later clicked the Cancel button. This indicates that the user wants to apply the changes made in the property sheet, but does not yet want to print. The PRINTDLGEX structure contains the information specified by the user at the time the Apply button was clicked. */ break; @@ -455,8 +575,11 @@ default: break; } - } else { - switch (hResult) { + } + else + { + switch (hResult) + { case E_OUTOFMEMORY: /*Insufficient memory. */ break; @@ -564,9 +687,11 @@ wsprintf(szNewValue, szNewValueFormat, iIndex++); cbData = sizeof(data); lResult = RegQueryValueEx(hKey, szNewValue, NULL, &dwExistingType, data, &cbData); - } while(lResult == ERROR_SUCCESS); + } + while(lResult == ERROR_SUCCESS); - switch(dwType) { + switch(dwType) + { case REG_DWORD: cbData = sizeof(DWORD); break; @@ -757,7 +882,14 @@ UNREFERENCED_PARAMETER(lParam); UNREFERENCED_PARAMETER(message); - switch (LOWORD(wParam)) { + switch (LOWORD(wParam)) + { + case ID_REGISTRY_LOADHIVE: + LoadHive(hWnd); + return TRUE; + case ID_REGISTRY_UNLOADHIVE: + UnloadHive(hWnd); + return TRUE; case ID_REGISTRY_IMPORTREGISTRYFILE: ImportRegistryFile(hWnd); return TRUE; @@ -836,12 +968,14 @@ keyPath = GetItemPath(g_pChildWnd->hTreeWnd, 0, &hKeyRoot); valueName = GetValueName(g_pChildWnd->hListWnd, -1); - if (keyPath) { + if (keyPath) + { lRet = RegOpenKeyEx(hKeyRoot, keyPath, 0, regsam, &hKey); if (lRet != ERROR_SUCCESS) hKey = 0; } - switch (LOWORD(wParam)) { + switch (LOWORD(wParam)) + { case ID_EDIT_MODIFY: if (valueName && ModifyValue(hWnd, hKey, valueName, FALSE)) RefreshListView(g_pChildWnd->hListWnd, hKeyRoot, keyPath); @@ -879,7 +1013,8 @@ { TCHAR msg[128], caption[128]; LoadString(hInst, IDS_QUERY_DELETE_CONFIRM, caption, sizeof(caption)/sizeof(TCHAR)); - LoadString(hInst, (nSelected == 1 ? IDS_QUERY_DELETE_ONE : IDS_QUERY_DELETE_MORE), msg, sizeof(msg)/sizeof(TCHAR)); + LoadString(hInst, (nSelected == 1 ? IDS_QUERY_DELETE_ONE : IDS_QUERY_DELETE_MORE), + msg, sizeof(msg)/sizeof(TCHAR)); if(MessageBox(g_pChildWnd->hWnd, msg, caption, MB_ICONQUESTION | MB_YESNO) == IDYES) { int ni, errs; @@ -911,8 +1046,8 @@ if (keyPath == 0 || *keyPath == 0) { MessageBeep(MB_ICONHAND); - } else - if (DeleteKey(hWnd, hKeyRoot, keyPath)) + } + else if (DeleteKey(hWnd, hKeyRoot, keyPath)) { DeleteNode(g_pChildWnd->hTreeWnd, 0); RefreshTreeView(g_pChildWnd->hTreeWnd); @@ -1012,7 +1147,8 @@ LRESULT CALLBACK FrameWndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam) { - switch (message) { + switch (message) + { case WM_CREATE: CreateWindowEx(0, szChildClass, NULL, WS_CHILD | WS_VISIBLE, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, Index: base/applications/regedit/listview.c =================================================================== --- base/applications/regedit/listview.c (revision 49463) +++ base/applications/regedit/listview.c (working copy) @@ -162,8 +162,10 @@ #endif index = ListView_InsertItem(hwndLV, &item); - if (index != -1) { - switch (dwValType) { + if (index != -1) + { + switch (dwValType) + { case REG_SZ: case REG_EXPAND_SZ: if(dwCount > 0) @@ -205,7 +207,8 @@ ListView_SetItemText(hwndLV, index, 2, _T("")); } break; - case REG_DWORD: { + case REG_DWORD: + { TCHAR buf[200]; if(dwCount == sizeof(DWORD)) { @@ -258,7 +261,8 @@ lvC.pszText = szText; /* Load the column labels from the resource file. */ - for (index = 0; index < MAX_LIST_COLUMNS; index++) { + for (index = 0; index < MAX_LIST_COLUMNS; index++) + { lvC.iSubItem = index; lvC.cx = default_column_widths[index]; lvC.fmt = column_alignment[index]; @@ -306,13 +310,15 @@ plvdi->item.pszText = NULL; plvdi->item.cchTextMax = 0; - switch (plvdi->item.iSubItem) { + switch (plvdi->item.iSubItem) + { case 0: LoadString(hInst, IDS_DEFAULT_VALUE_NAME, buffer, sizeof(buffer)/sizeof(TCHAR)); plvdi->item.pszText = buffer; break; case 1: - switch (((LINE_INFO*)plvdi->item.lParam)->dwValType) { + switch (((LINE_INFO*)plvdi->item.lParam)->dwValType) + { case REG_NONE: plvdi->item.pszText = _T("REG_NONE"); break; @@ -349,7 +355,8 @@ case REG_QWORD: /* REG_QWORD_LITTLE_ENDIAN */ plvdi->item.pszText = _T("REG_QWORD"); break; - default: { + default: + { TCHAR buf2[200]; LoadString(hInst, IDS_UNKNOWN_TYPE, buf2, sizeof(buf2)/sizeof(TCHAR)); wsprintf(buffer, buf2, ((LINE_INFO*)plvdi->item.lParam)->dwValType); @@ -377,7 +384,8 @@ if (g_columnToSort == 1 && l->dwValType != r->dwValType) return g_invertSort ? (int)r->dwValType - (int)l->dwValType : (int)l->dwValType - (int)r->dwValType; - if (g_columnToSort == 2) { + if (g_columnToSort == 2) + { /* FIXME: Sort on value */ } return g_invertSort ? _tcsicmp(r->name, l->name) : _tcsicmp(l->name, r->name); @@ -388,14 +396,16 @@ NMLVDISPINFO* Info; UNREFERENCED_PARAMETER(wParam); *Result = TRUE; - switch (((LPNMHDR)lParam)->code) { + switch (((LPNMHDR)lParam)->code) + { case LVN_GETDISPINFO: OnGetDispInfo((NMLVDISPINFO*)lParam); return TRUE; case LVN_COLUMNCLICK: if (g_columnToSort == (DWORD)((LPNMLISTVIEW)lParam)->iSubItem) g_invertSort = !g_invertSort; - else { + else + { g_columnToSort = ((LPNMLISTVIEW)lParam)->iSubItem; g_invertSort = FALSE; } @@ -503,7 +513,8 @@ LVITEM item; count = ListView_GetItemCount(hwndLV); - for (i = 0; i < count; i++) { + for (i = 0; i < count; i++) + { item.mask = LVIF_PARAM; item.iItem = i; (void)ListView_GetItem(hwndLV, &item); @@ -555,7 +566,9 @@ /* AddEntryToList(hwndLV, _T("(Default)"), dwValType, ValBuf, dwValSize); */ /* } */ /* dwValSize = max_val_size; */ - while (RegEnumValue(hNewKey, dwIndex, ValName, &dwValNameLen, NULL, &dwValType, ValBuf, &dwValSize) == ERROR_SUCCESS) { + while (RegEnumValue(hNewKey, dwIndex, ValName, &dwValNameLen, + NULL, &dwValType, ValBuf, &dwValSize) == ERROR_SUCCESS) + { /* Add a terminating 0 character. Usually this is only necessary for strings. */ ValBuf[dwValSize] = 0; #ifdef UNICODE Index: base/applications/regedit/security.c =================================================================== --- base/applications/regedit/security.c (revision 49463) +++ base/applications/regedit/security.c (working copy) @@ -335,7 +335,8 @@ Implementation of the ISecurityInformation interface ******************************************************************************/ -static SI_ACCESS RegAccess[] = { +static SI_ACCESS RegAccess[] = +{ {&GUID_NULL, KEY_ALL_ACCESS, (LPWSTR)MAKEINTRESOURCE(IDS_ACCESS_FULLCONTROL), SI_ACCESS_GENERAL | SI_ACCESS_SPECIFIC}, {&GUID_NULL, KEY_READ, (LPWSTR)MAKEINTRESOURCE(IDS_ACCESS_READ), SI_ACCESS_GENERAL}, {&GUID_NULL, KEY_QUERY_VALUE, (LPWSTR)MAKEINTRESOURCE(IDS_ACCESS_QUERYVALUE), SI_ACCESS_SPECIFIC}, @@ -352,14 +353,16 @@ static const DWORD RegDefaultAccess = 1; /* KEY_READ */ -static GENERIC_MAPPING RegAccessMasks = { +static GENERIC_MAPPING RegAccessMasks = +{ KEY_READ, KEY_WRITE, KEY_EXECUTE, KEY_ALL_ACCESS }; -static SI_INHERIT_TYPE RegInheritTypes[] = { +static SI_INHERIT_TYPE RegInheritTypes[] = +{ {&GUID_NULL, 0, (LPWSTR)MAKEINTRESOURCE(IDS_INHERIT_THISKEYONLY)}, {&GUID_NULL, CONTAINER_INHERIT_ACE, (LPWSTR)MAKEINTRESOURCE(IDS_INHERIT_THISKEYANDSUBKEYS)}, {&GUID_NULL, INHERIT_ONLY_ACE | CONTAINER_INHERIT_ACE, (LPWSTR)MAKEINTRESOURCE(IDS_INHERIT_SUBKEYSONLY)}, Index: base/applications/regedit/find.c =================================================================== --- base/applications/regedit/find.c (revision 49463) +++ base/applications/regedit/find.c (working copy) @@ -103,7 +103,7 @@ return 2 == CompareString(LOCALE_SYSTEM_DEFAULT, 0, psz1, cch1, psz2, cch2); else - return 2 == CompareString(LOCALE_SYSTEM_DEFAULT, + return 2 == CompareString(LOCALE_SYSTEM_DEFAULT, NORM_IGNORECASE, psz1, cch1, psz2, cch2); } @@ -134,7 +134,7 @@ } BOOL RegFindRecurse( - HKEY hKey, + HKEY hKey, LPCTSTR pszSubKey, LPCTSTR pszValueName, LPTSTR *ppszFoundSubKey, @@ -176,7 +176,7 @@ goto err; s_cbName = MAX_PATH * sizeof(TCHAR); - lResult = RegEnumValue(hSubKey, i, s_szName, &s_cbName, NULL, NULL, + lResult = RegEnumValue(hSubKey, i, s_szName, &s_cbName, NULL, NULL, NULL, &cb); if (lResult == ERROR_NO_MORE_ITEMS) { @@ -206,7 +206,7 @@ if (!fPast) continue; - if ((s_dwFlags & RSF_LOOKATVALUES) && + if ((s_dwFlags & RSF_LOOKATVALUES) && CompareName(ppszNames[i], s_szFindWhat)) { *ppszFoundSubKey = _tcsdup(szSubKey); @@ -229,7 +229,7 @@ if (lResult != ERROR_SUCCESS) goto err; - if ((s_dwFlags & RSF_LOOKATDATA) && + if ((s_dwFlags & RSF_LOOKATDATA) && CompareData(type, (LPTSTR) pb, s_szFindWhat)) { *ppszFoundSubKey = _tcsdup(szSubKey); @@ -266,7 +266,7 @@ goto err; s_cbName = MAX_PATH * sizeof(TCHAR); - lResult = RegEnumKeyEx(hSubKey, i, s_szName, &s_cbName, NULL, NULL, + lResult = RegEnumKeyEx(hSubKey, i, s_szName, &s_cbName, NULL, NULL, NULL, NULL); if (lResult == ERROR_NO_MORE_ITEMS) { @@ -292,7 +292,7 @@ CompareName(ppszNames[i], s_szFindWhat)) { *ppszFoundSubKey = malloc( - (lstrlen(szSubKey) + lstrlen(ppszNames[i]) + 2) * + (lstrlen(szSubKey) + lstrlen(ppszNames[i]) + 2) * sizeof(TCHAR)); if (*ppszFoundSubKey == NULL) goto err; @@ -352,7 +352,7 @@ } BOOL RegFindWalk( - HKEY * phKey, + HKEY * phKey, LPCTSTR pszSubKey, LPCTSTR pszValueName, LPTSTR *ppszFoundSubKey, @@ -462,12 +462,12 @@ goto success; } - if (RegFindRecurse(hSubKey, ppszNames[i], NULL, + if (RegFindRecurse(hSubKey, ppszNames[i], NULL, ppszFoundSubKey, ppszFoundValueName)) { LPTSTR psz = *ppszFoundSubKey; *ppszFoundSubKey = malloc( - (lstrlen(szSubKey) + lstrlen(psz) + 2) * + (lstrlen(szSubKey) + lstrlen(psz) + 2) * sizeof(TCHAR)); if (*ppszFoundSubKey == NULL) goto err; @@ -667,7 +667,7 @@ EnableWindow(g_pChildWnd->hListWnd, FALSE); EnableWindow(g_pChildWnd->hAddressBarWnd, FALSE); - fSuccess = RegFindWalk(&hKeyRoot, pszKeyPath, pszValueName, + fSuccess = RegFindWalk(&hKeyRoot, pszKeyPath, pszValueName, &pszFoundSubKey, &pszFoundValueName); EnableWindow(hFrameWnd, TRUE); Index: base/applications/regedit/regedit.rbuild =================================================================== --- base/applications/regedit/regedit.rbuild (revision 49463) +++ base/applications/regedit/regedit.rbuild (working copy) @@ -23,6 +23,7 @@ hexedit.c listview.c main.c + error.c regedit.c regproc.c security.c Index: base/applications/regedit/regedit.c =================================================================== --- base/applications/regedit/regedit.c (revision 49463) +++ base/applications/regedit/regedit.c (working copy) @@ -52,7 +52,8 @@ "This program is command-line compatible with Microsoft Windows\n" "regedit.\n"; -typedef enum { +typedef enum +{ ACTION_UNDEF, ACTION_ADD, ACTION_EXPORT, ACTION_DELETE } REGEDIT_ACTION; @@ -79,40 +80,52 @@ int pos = 0; /* position of pointer "s" in *command_line */ file_name[0] = 0; - if (!s[0]) { + if (!s[0]) + { return; } - if (s[0] == L'"') { + if (s[0] == L'"') + { s++; (*command_line)++; - while(s[0] != L'"') { - if (!s[0]) { + while(s[0] != L'"') + { + if (!s[0]) + { fprintf(stderr, "%s: Unexpected end of file name!\n", getAppName()); exit(1); } s++; pos++; } - } else { - while(s[0] && !iswspace(s[0])) { + } + else + { + while(s[0] && !iswspace(s[0])) + { s++; pos++; } } memcpy(file_name, *command_line, pos * sizeof((*command_line)[0])); /* remove the last backslash */ - if (file_name[pos - 1] == L'\\') { + if (file_name[pos - 1] == L'\\') + { file_name[pos - 1] = L'\0'; - } else { + } + else + { file_name[pos] = L'\0'; } - if (s[0]) { + if (s[0]) + { s++; pos++; } - while(s[0] && iswspace(s[0])) { + while(s[0] && iswspace(s[0])) + { s++; pos++; } @@ -121,19 +134,23 @@ BOOL PerformRegAction(REGEDIT_ACTION action, LPWSTR s) { - switch (action) { - case ACTION_ADD: { + switch (action) + { + case ACTION_ADD: + { WCHAR filename[MAX_PATH]; FILE *fp; get_file_name(&s, filename); - if (!filename[0]) { + if (!filename[0]) + { fprintf(stderr, "%s: No file name is specified\n", getAppName()); fprintf(stderr, usage); exit(4); } - while(filename[0]) { + while(filename[0]) + { fp = _wfopen(filename, L"r"); if (fp == NULL) { @@ -148,10 +165,12 @@ } break; } - case ACTION_DELETE: { + case ACTION_DELETE: + { WCHAR reg_key_name[KEY_MAX_LEN]; get_file_name(&s, reg_key_name); - if (!reg_key_name[0]) { + if (!reg_key_name[0]) + { fprintf(stderr, "%s: No registry key is specified for removal\n", getAppName()); fprintf(stderr, usage); exit(6); @@ -159,22 +178,27 @@ delete_registry_key(reg_key_name); break; } - case ACTION_EXPORT: { + case ACTION_EXPORT: + { WCHAR filename[MAX_PATH]; filename[0] = _T('\0'); get_file_name(&s, filename); - if (!filename[0]) { + if (!filename[0]) + { fprintf(stderr, "%s: No file name is specified\n", getAppName()); fprintf(stderr, usage); exit(7); } - if (s[0]) { + if (s[0]) + { WCHAR reg_key_name[KEY_MAX_LEN]; get_file_name(&s, reg_key_name); export_registry_key(filename, reg_key_name, REG_FORMAT_4); - } else { + } + else + { export_registry_key(filename, NULL, REG_FORMAT_4); } break; @@ -196,9 +220,12 @@ */ static void error_unknown_switch(WCHAR chu, LPWSTR s) { - if (iswalpha(chu)) { + if (iswalpha(chu)) + { fprintf(stderr, "%s: Undefined switch /%c!\n", getAppName(), chu); - } else { + } + else + { fprintf(stderr, "%s: Alphabetic character is expected after '%c' " "in swit ch specification\n", getAppName(), *(s - 1)); } @@ -220,12 +247,16 @@ ch = *s; ch2 = *(s + 1); chu = (WCHAR)towupper(ch); - if (!ch2 || iswspace(ch2)) { + if (!ch2 || iswspace(ch2)) + { if (chu == L'S' || chu == L'V') { /* ignore these switches */ - } else { - switch (chu) { + } + else + { + switch (chu) + { case L'D': action = ACTION_DELETE; break; @@ -242,14 +273,19 @@ } } s++; - } else { - if (ch2 == L':') { - switch (chu) { + } + else + { + if (ch2 == L':') + { + switch (chu) + { case L'L': /* fall through */ case L'R': s += 2; - while (*s && !iswspace(*s)) { + while (*s && !iswspace(*s)) + { s++; } break; @@ -257,7 +293,9 @@ error_unknown_switch(chu, s); break; } - } else { + } + else + { /* this is a file name, starting from '/' */ s--; break; @@ -265,7 +303,8 @@ } /* skip spaces to the next parameter */ ch = *s; - while (ch && iswspace(ch)) { + while (ch && iswspace(ch)) + { s++; ch = *s; } Index: base/applications/regedit/main.c =================================================================== --- base/applications/regedit/main.c (revision 49463) +++ base/applications/regedit/main.c (working copy) @@ -129,14 +129,16 @@ CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, NULL, hMenuFrame, hInstance, NULL/*lpParam*/); - if (!hFrameWnd) { + if (!hFrameWnd) + { return FALSE; } /* Create the status bar */ hStatusBar = CreateStatusWindow(WS_VISIBLE|WS_CHILD|WS_CLIPSIBLINGS|SBT_NOBORDERS, _T(""), hFrameWnd, STATUS_WINDOW); - if (hStatusBar) { + if (hStatusBar) + { /* Create the status bar panes */ SetupStatusBar(hFrameWnd, FALSE); CheckMenuItem(GetSubMenu(hMenuFrame, ID_VIEW_MENU), ID_VIEW_STATUSBAR, MF_BYCOMMAND|MF_CHECKED); @@ -159,7 +161,8 @@ /* we need to destroy the main menu before destroying the main window to avoid a memory leak */ -void DestroyMainMenu() { +void DestroyMainMenu() +{ DestroyMenu(hMenuFrame); } @@ -192,7 +195,8 @@ UNREFERENCED_PARAMETER(hPrevInstance); - if (ProcessCmdLine(lpCmdLine)) { + if (ProcessCmdLine(lpCmdLine)) + { return 0; } @@ -205,15 +209,18 @@ hInst = hInstance; /* Perform application initialization */ - if (!InitInstance(hInstance, nCmdShow)) { + if (!InitInstance(hInstance, nCmdShow)) + { return FALSE; } hAccel = LoadAccelerators(hInstance, MAKEINTRESOURCE(ID_ACCEL)); /* Main message loop */ - while (GetMessage(&msg, (HWND)NULL, 0, 0)) { + while (GetMessage(&msg, (HWND)NULL, 0, 0)) + { if (!TranslateAccelerator(hFrameWnd, hAccel, &msg) - && !TranslateChildTabMessage(&msg)) { + && !TranslateChildTabMessage(&msg)) + { TranslateMessage(&msg); DispatchMessage(&msg); } Index: base/applications/regedit/edit.c =================================================================== --- base/applications/regedit/edit.c (revision 49463) +++ base/applications/regedit/edit.c (working copy) @@ -59,19 +59,10 @@ static void error_code_messagebox(HWND hwnd, DWORD error_code) { - LPTSTR lpMsgBuf; - DWORD status; TCHAR title[256]; - static const TCHAR fallback[] = TEXT("Error displaying error message.\n"); if (!LoadString(hInst, IDS_ERROR, title, COUNT_OF(title))) lstrcpy(title, TEXT("Error")); - status = FormatMessage(FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM, - NULL, error_code, 0, (LPTSTR)&lpMsgBuf, 0, NULL); - if (!status) - lpMsgBuf = (LPTSTR)fallback; - MessageBox(hwnd, lpMsgBuf, title, MB_OK | MB_ICONERROR); - if (lpMsgBuf != fallback) - LocalFree(lpMsgBuf); + ErrorMessageBox(hwnd, title, error_code); } void warning(HWND hwnd, INT resId, ...) @@ -105,7 +96,8 @@ UNREFERENCED_PARAMETER(lParam); - switch(uMsg) { + switch(uMsg) + { case WM_INITDIALOG: if(editValueName && _tcscmp(editValueName, _T(""))) { @@ -172,7 +164,8 @@ UNREFERENCED_PARAMETER(lParam); - switch(uMsg) { + switch(uMsg) + { case WM_INITDIALOG: if(editValueName && _tcscmp(editValueName, _T(""))) { @@ -283,7 +276,8 @@ UNREFERENCED_PARAMETER(lParam); - switch(uMsg) { + switch(uMsg) + { case WM_INITDIALOG: dwordEditMode = EDIT_MODE_HEX; @@ -391,7 +385,8 @@ UNREFERENCED_PARAMETER(lParam); - switch(uMsg) { + switch(uMsg) + { case WM_INITDIALOG: if(editValueName && _tcscmp(editValueName, _T(""))) { @@ -539,7 +534,8 @@ stringValueData = NULL; } - if (DialogBox(0, MAKEINTRESOURCE(IDD_EDIT_MULTI_STRING), hwnd, modify_multi_string_dlgproc) == IDOK) + if (DialogBox(0, MAKEINTRESOURCE(IDD_EDIT_MULTI_STRING), hwnd, + modify_multi_string_dlgproc) == IDOK) { if (stringValueData) { @@ -795,7 +791,8 @@ HKEY hKey; lRet = RegOpenKeyEx(hKeyRoot, keyPath, 0, KEY_READ|KEY_SET_VALUE, &hKey); - if (lRet != ERROR_SUCCESS) { + if (lRet != ERROR_SUCCESS) + { error_code_messagebox(hwnd, lRet); return FALSE; } @@ -807,7 +804,8 @@ goto done; lRet = SHDeleteKey(hKeyRoot, keyPath); - if (lRet != ERROR_SUCCESS) { + if (lRet != ERROR_SUCCESS) + { error(hwnd, IDS_BAD_KEY, keyPath); goto done; } @@ -831,7 +829,8 @@ if (s) { s++; - lpNewSubKey = (LPTSTR) HeapAlloc(GetProcessHeap(), 0, (s - lpSubKey + _tcslen(lpNewName) + 1) * sizeof(TCHAR)); + lpNewSubKey = (LPTSTR) HeapAlloc(GetProcessHeap(), 0, + (s - lpSubKey + _tcslen(lpNewName) + 1) * sizeof(TCHAR)); if (lpNewSubKey != NULL) { memcpy(lpNewSubKey, lpSubKey, (s - lpSubKey) * sizeof(TCHAR)); @@ -883,7 +882,8 @@ return lResult; } -LONG QueryStringValue(HKEY hKey, LPCTSTR lpSubKey, LPCTSTR lpValueName, LPTSTR pszBuffer, DWORD dwBufferLen) +LONG QueryStringValue(HKEY hKey, LPCTSTR lpSubKey, LPCTSTR lpValueName, + LPTSTR pszBuffer, DWORD dwBufferLen) { LONG lResult; HKEY hSubKey = NULL; @@ -898,7 +898,8 @@ } cbData = (dwBufferLen - 1) * sizeof(*pszBuffer); - lResult = RegQueryValueEx(hKey, lpValueName, NULL, &dwType, (LPBYTE) pszBuffer, &cbData); + lResult = RegQueryValueEx(hKey, lpValueName, NULL, &dwType, + (LPBYTE) pszBuffer, &cbData); if (lResult != ERROR_SUCCESS) goto done; if (dwType != REG_SZ) @@ -917,7 +918,8 @@ return lResult; } -BOOL GetKeyName(LPTSTR pszDest, size_t iDestLength, HKEY hRootKey, LPCTSTR lpSubKey) +BOOL GetKeyName(LPTSTR pszDest, size_t iDestLength, + HKEY hRootKey, LPCTSTR lpSubKey) { LPCTSTR pszRootKey; Index: base/applications/regedit/main.h =================================================================== --- base/applications/regedit/main.h (revision 49463) +++ base/applications/regedit/main.h (working copy) @@ -43,7 +43,8 @@ /******************************************************************************/ -enum OPTION_FLAGS { +enum OPTION_FLAGS +{ OPTIONS_AUTO_REFRESH = 0x01, OPTIONS_READ_ONLY_MODE = 0x02, OPTIONS_CONFIRM_ON_DELETE = 0x04, @@ -53,11 +54,13 @@ OPTIONS_VIEW_DATA_ONLY = 0x40, }; -typedef struct { +typedef struct +{ HWND hWnd; HWND hTreeWnd; HWND hListWnd; HWND hAddressBarWnd; + HWND hAddressBtnWnd; int nFocusPanel; /* 0: left 1: right */ int nSplitPos; WINDOWPLACEMENT pos; @@ -88,6 +91,9 @@ /* childwnd.c */ extern LRESULT CALLBACK ChildWndProc(HWND, UINT, WPARAM, LPARAM); +/* error.c */ +extern void ErrorMessageBox(HWND hWnd, LPCTSTR title, DWORD code); + /* find.c */ extern void FindDialog(HWND hWnd); extern BOOL FindNext(HWND hWnd); Index: base/applications/regedit/error.c =================================================================== --- base/applications/regedit/error.c (revision 0) +++ base/applications/regedit/error.c (revision 0) @@ -0,0 +1,14 @@ +#include +void ErrorMessageBox(HWND hWnd, LPCTSTR title, DWORD code) +{ + LPTSTR lpMsgBuf; + DWORD status; + static const TCHAR fallback[] = TEXT("Error displaying error message.\n"); + status = FormatMessage(FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM, + NULL, code, 0, (LPTSTR)&lpMsgBuf, 0, NULL); + if (!status) + lpMsgBuf = (LPTSTR)fallback; + MessageBox(hWnd, lpMsgBuf, title, MB_OK | MB_ICONERROR); + if (lpMsgBuf != fallback) + LocalFree(lpMsgBuf); +} Index: base/applications/regedit/hexedit.c =================================================================== --- base/applications/regedit/hexedit.c (revision 49463) +++ base/applications/regedit/hexedit.c (working copy) @@ -121,9 +121,11 @@ } if(hed->EditingField) - SetCaretPos(hed->LeftMargin + ((4 + hed->AddressSpacing + (3 * hed->CaretCol) + hed->InMid * 2) * hed->CharWidth) - 1, (hed->CaretLine - si.nPos) * hed->LineHeight); + SetCaretPos(hed->LeftMargin + ((4 + hed->AddressSpacing + (3 * hed->CaretCol) + hed->InMid * 2) * hed->CharWidth) - 1, + (hed->CaretLine - si.nPos) * hed->LineHeight); else - SetCaretPos(hed->LeftMargin + ((4 + hed->AddressSpacing + hed->SplitSpacing + (3 * hed->ColumnsPerLine) + hed->CaretCol) * hed->CharWidth) - 2, (hed->CaretLine - si.nPos) * hed->LineHeight); + SetCaretPos(hed->LeftMargin + ((4 + hed->AddressSpacing + hed->SplitSpacing + (3 * hed->ColumnsPerLine) + hed->CaretCol) * hed->CharWidth) - 2, + (hed->CaretLine - si.nPos) * hed->LineHeight); } static VOID @@ -891,7 +893,8 @@ hbmpold = SelectObject(hTempDC, hbmp); hOldFont = SelectObject(hTempDC, hed->hFont); HEXEDIT_PaintLines(hed, hTempDC, si.nPos, nFirst, nFirst + nLines, &ps.rcPaint); - BitBlt(ps.hdc, rc.left, rc.top, rc.right - rc.left, rc.bottom - rc.top, hTempDC, rc.left, rc.top, SRCCOPY); + BitBlt(ps.hdc, rc.left, rc.top, rc.right - rc.left, rc.bottom - rc.top, + hTempDC, rc.left, rc.top, SRCCOPY); SelectObject(hTempDC, hOldFont); SelectObject(hTempDC, hbmpold); @@ -1047,7 +1050,7 @@ switch(VkCode) { case 'X': - if (GetAsyncKeyState(VK_SHIFT) >= 0 && + if (GetAsyncKeyState(VK_SHIFT) >= 0 && GetAsyncKeyState(VK_CONTROL) < 0 && hed->SelStart != hed->SelEnd) HEXEDIT_Cut(hed); else @@ -1055,7 +1058,7 @@ break; case 'C': - if (GetAsyncKeyState(VK_SHIFT) >= 0 && + if (GetAsyncKeyState(VK_SHIFT) >= 0 && GetAsyncKeyState(VK_CONTROL) < 0 && hed->SelStart != hed->SelEnd) HEXEDIT_Copy(hed); else @@ -1087,7 +1090,7 @@ break; case VK_DELETE: - if (GetAsyncKeyState(VK_SHIFT) < 0 && GetAsyncKeyState(VK_CONTROL) >= 0 && + if (GetAsyncKeyState(VK_SHIFT) < 0 && GetAsyncKeyState(VK_CONTROL) >= 0 && hed->SelStart != hed->SelEnd) HEXEDIT_Copy(hed); if (i0 != i1) Index: base/applications/regedit/treeview.c =================================================================== --- base/applications/regedit/treeview.c (revision 49463) +++ base/applications/regedit/treeview.c (working copy) @@ -32,7 +32,8 @@ #define NUM_ICONS 3 -static BOOL get_item_path(HWND hwndTV, HTREEITEM hItem, HKEY* phKey, LPTSTR* pKeyPath, int* pPathLen, int* pMaxLen) +static BOOL get_item_path(HWND hwndTV, HTREEITEM hItem, HKEY* phKey, + LPTSTR* pKeyPath, int* pPathLen, int* pMaxLen) { TVITEM item; size_t maxLen, len; @@ -42,19 +43,24 @@ item.hItem = hItem; if (!TreeView_GetItem(hwndTV, &item)) return FALSE; - if (item.lParam) { + if (item.lParam) + { /* found root key with valid key value */ *phKey = (HKEY)item.lParam; return TRUE; } - if(!get_item_path(hwndTV, TreeView_GetParent(hwndTV, hItem), phKey, pKeyPath, pPathLen, pMaxLen)) return FALSE; - if (*pPathLen) { + if(!get_item_path(hwndTV, TreeView_GetParent(hwndTV, hItem), + phKey, pKeyPath, pPathLen, pMaxLen)) + return FALSE; + if (*pPathLen) + { (*pKeyPath)[*pPathLen] = _T('\\'); ++(*pPathLen); } - do { + do + { item.mask = TVIF_TEXT; item.hItem = hItem; item.pszText = *pKeyPath + *pPathLen; @@ -62,7 +68,8 @@ item.cchTextMax = (int) maxLen; if (!TreeView_GetItem(hwndTV, &item)) return FALSE; len = _tcslen(item.pszText); - if (len < maxLen - 1) { + if (len < maxLen - 1) + { *pPathLen += (int) len; break; } @@ -70,7 +77,8 @@ if (!newStr) return FALSE; *pKeyPath = newStr; *pMaxLen *= 2; - } while(TRUE); + } + while(TRUE); return TRUE; } @@ -87,7 +95,8 @@ if (maxLen == -1) return NULL; if (!hItem) hItem = TreeView_GetSelection(hwndTV); if (!hItem) return NULL; - if (!get_item_path(hwndTV, hItem, phRootKey, &pathBuffer, &pathLen, &maxLen)) { + if (!get_item_path(hwndTV, hItem, phRootKey, &pathBuffer, &pathLen, &maxLen)) + { return NULL; } return pathBuffer; @@ -101,13 +110,17 @@ } /* Add an entry to the tree. Only give hKey for root nodes (HKEY_ constants) */ -static HTREEITEM AddEntryToTree(HWND hwndTV, HTREEITEM hParent, LPTSTR label, HKEY hKey, DWORD dwChildren) +static HTREEITEM AddEntryToTree(HWND hwndTV, HTREEITEM hParent, + LPTSTR label, HKEY hKey, DWORD dwChildren) { TVITEM tvi; TVINSERTSTRUCT tvins; - if (hKey) { - if (RegQueryInfoKey(hKey, 0, 0, 0, &dwChildren, 0, 0, 0, 0, 0, 0, 0) != ERROR_SUCCESS) { + if (hKey) + { + if (RegQueryInfoKey(hKey, 0, 0, 0, &dwChildren, + 0, 0, 0, 0, 0, 0, 0) != ERROR_SUCCESS) + { dwChildren = 0; } } @@ -140,15 +153,21 @@ KeyPath = GetItemPath(hwndTV, hItem, &hRoot); - if (*KeyPath) { - if (RegOpenKeyEx(hRoot, KeyPath, 0, KEY_READ, &hKey) != ERROR_SUCCESS) { + if (*KeyPath) + { + if (RegOpenKeyEx(hRoot, KeyPath, 0, KEY_READ, &hKey) != ERROR_SUCCESS) + { goto done; } - } else { + } + else + { hKey = hRoot; } - if (RegQueryInfoKey(hKey, 0, 0, 0, &dwCount, &dwMaxSubKeyLen, 0, 0, 0, 0, 0, 0) != ERROR_SUCCESS) { + if (RegQueryInfoKey(hKey, 0, 0, 0, &dwCount, &dwMaxSubKeyLen, + 0, 0, 0, 0, 0, 0) != ERROR_SUCCESS) + { goto done; } @@ -156,19 +175,22 @@ tvItem.mask = TVIF_CHILDREN; tvItem.hItem = hItem; tvItem.cChildren = dwCount; - if (!TreeView_SetItem(hwndTV, &tvItem)) { + if (!TreeView_SetItem(hwndTV, &tvItem)) + { goto done; } /* We don't have to bother with the rest if it's not expanded. */ - if (TreeView_GetItemState(hwndTV, hItem, TVIS_EXPANDED) == 0) { + if (TreeView_GetItemState(hwndTV, hItem, TVIS_EXPANDED) == 0) + { RegCloseKey(hKey); bSuccess = TRUE; goto done; } dwMaxSubKeyLen++; /* account for the \0 terminator */ - if (!(Name = HeapAlloc(GetProcessHeap(), 0, dwMaxSubKeyLen * sizeof(TCHAR)))) { + if (!(Name = HeapAlloc(GetProcessHeap(), 0, dwMaxSubKeyLen * sizeof(TCHAR)))) + { goto done; } tvItem.cchTextMax = dwMaxSubKeyLen; @@ -185,14 +207,16 @@ DWORD dwStep = 10000; for (childItem = TreeView_GetChild(hwndTV, hItem); childItem; - childItem = TreeView_GetNextSibling(hwndTV, childItem)) { + childItem = TreeView_GetNextSibling(hwndTV, childItem)) + { if (dwActualSize + dwMaxSubKeyLen + 1 > dwPhysicalSize) { dwNewPhysicalSize = dwActualSize + dwMaxSubKeyLen + 1 + dwStep; if (pszNodes) - pszNewNodes = (LPTSTR) HeapReAlloc(GetProcessHeap(), 0, pszNodes, dwNewPhysicalSize * sizeof(TCHAR)); + pszNewNodes = (LPTSTR) HeapReAlloc(GetProcessHeap(), 0, pszNodes, + dwNewPhysicalSize * sizeof(TCHAR)); else pszNewNodes = (LPTSTR) HeapAlloc(GetProcessHeap(), 0, dwNewPhysicalSize * sizeof(TCHAR)); if (!pszNewNodes) @@ -218,9 +242,11 @@ /* Now go through all the children in the tree, and check if any have to be removed. */ childItem = TreeView_GetChild(hwndTV, hItem); - while (childItem) { + while (childItem) + { HTREEITEM nextItem = TreeView_GetNextSibling(hwndTV, childItem); - if (RefreshTreeItem(hwndTV, childItem) == FALSE) { + if (RefreshTreeItem(hwndTV, childItem) == FALSE) + { (void)TreeView_DeleteItem(hwndTV, childItem); } childItem = nextItem; @@ -228,30 +254,39 @@ /* Now go through all the children in the registry, and check if any have to be added. */ bAddedAny = FALSE; - for (dwIndex = 0; dwIndex < dwCount; dwIndex++) { + for (dwIndex = 0; dwIndex < dwCount; dwIndex++) + { DWORD cName = dwMaxSubKeyLen, dwSubCount; BOOL found; found = FALSE; - if (RegEnumKeyEx(hKey, dwIndex, Name, &cName, 0, 0, 0, NULL) != ERROR_SUCCESS) { + if (RegEnumKeyEx(hKey, dwIndex, Name, &cName, 0, 0, 0, NULL) != ERROR_SUCCESS) + { continue; } /* Check if the node is already in there. */ - if (pszNodes) { - for (s = pszNodes; *s; s += _tcslen(s) + 1) { - if (!_tcscmp(s, Name)) { + if (pszNodes) + { + for (s = pszNodes; *s; s += _tcslen(s) + 1) + { + if (!_tcscmp(s, Name)) + { found = TRUE; break; } } } - if (found == FALSE) { + if (found == FALSE) + { /* Find the number of children of the node. */ dwSubCount = 0; - if (RegOpenKeyEx(hKey, Name, 0, KEY_QUERY_VALUE, &hSubKey) == ERROR_SUCCESS) { - if (RegQueryInfoKey(hSubKey, 0, 0, 0, &dwSubCount, 0, 0, 0, 0, 0, 0, 0) != ERROR_SUCCESS) { + if (RegOpenKeyEx(hKey, Name, 0, KEY_QUERY_VALUE, &hSubKey) == ERROR_SUCCESS) + { + if (RegQueryInfoKey(hSubKey, 0, 0, 0, &dwSubCount, + 0, 0, 0, 0, 0, 0, 0) != ERROR_SUCCESS) + { dwSubCount = 0; } RegCloseKey(hSubKey); @@ -287,7 +322,8 @@ SendMessage(hwndTV, WM_SETREDRAW, FALSE, 0); hItem = TreeView_GetChild(hwndTV, TreeView_GetRoot(hwndTV)); - while (hItem) { + while (hItem) + { RefreshTreeItem(hwndTV, hItem); hItem = TreeView_GetNextSibling(hwndTV, hItem); } @@ -337,7 +373,8 @@ (void)TreeView_Expand(hwndTV, hItem, TVE_EXPAND); if (!hNewItem) { - for(hNewItem = TreeView_GetChild(hwndTV, hItem); hNewItem; hNewItem = TreeView_GetNextSibling(hwndTV, hNewItem)) + for(hNewItem = TreeView_GetChild(hwndTV, hItem); hNewItem; + hNewItem = TreeView_GetNextSibling(hwndTV, hNewItem)) { item.mask = TVIF_HANDLE | TVIF_TEXT; item.hItem = hNewItem; @@ -483,7 +520,8 @@ static int expanding; if (expanding) return FALSE; - if (pnmtv->itemNew.state & TVIS_EXPANDEDONCE ) { + if (pnmtv->itemNew.state & TVIS_EXPANDEDONCE ) + { return TRUE; } expanding = TRUE; @@ -493,10 +531,13 @@ keyPath = GetItemPath(hwndTV, pnmtv->itemNew.hItem, &hRoot); if (!keyPath) goto done; - if (*keyPath) { + if (*keyPath) + { errCode = RegOpenKeyEx(hRoot, keyPath, 0, KEY_READ, &hNewKey); if (errCode != ERROR_SUCCESS) goto done; - } else { + } + else + { hNewKey = hRoot; } @@ -506,13 +547,15 @@ Name = HeapAlloc(GetProcessHeap(), 0, dwMaxSubKeyLen * sizeof(TCHAR)); if (!Name) goto done; - for (dwIndex = 0; dwIndex < dwCount; dwIndex++) { + for (dwIndex = 0; dwIndex < dwCount; dwIndex++) + { DWORD cName = dwMaxSubKeyLen, dwSubCount; errCode = RegEnumKeyEx(hNewKey, dwIndex, Name, &cName, 0, 0, 0, 0); if (errCode != ERROR_SUCCESS) continue; errCode = RegOpenKeyEx(hNewKey, Name, 0, KEY_QUERY_VALUE, &hKey); - if (errCode == ERROR_SUCCESS) { + if (errCode == ERROR_SUCCESS) + { errCode = RegQueryInfoKey(hKey, 0, 0, 0, &dwSubCount, 0, 0, 0, 0, 0, 0, 0); RegCloseKey(hKey); } @@ -552,14 +595,16 @@ else if (RegOpenKey(hRootKey, pszKeyPath, &hKey) != ERROR_SUCCESS) goto done; - if (LoadString(hInst, IDS_NEW_KEY, szNewKeyFormat, sizeof(szNewKeyFormat) / sizeof(szNewKeyFormat[0])) <= 0) + if (LoadString(hInst, IDS_NEW_KEY, szNewKeyFormat, + sizeof(szNewKeyFormat) / sizeof(szNewKeyFormat[0])) <= 0) goto done; /* Need to create a new key with a unique name */ do { wsprintf(szNewKey, szNewKeyFormat, iIndex++); - nResult = RegCreateKeyEx(hKey, szNewKey, 0, NULL, 0, KEY_WRITE, NULL, &hNewKey, &dwDisposition); + nResult = RegCreateKeyEx(hKey, szNewKey, 0,NULL, 0, KEY_WRITE, NULL, + &hNewKey, &dwDisposition); if (hNewKey && dwDisposition == REG_OPENED_EXISTING_KEY) { RegCloseKey(hNewKey); @@ -611,14 +656,16 @@ 0, 0, rcClient.right, rcClient.bottom, hwndParent, id, hInst, NULL); /* Initialize the image list, and add items to the control. */ - if (!InitTreeViewImageLists(hwndTV) || !InitTreeViewItems(hwndTV, pHostName)) { + if (!InitTreeViewImageLists(hwndTV) || !InitTreeViewItems(hwndTV, pHostName)) + { DestroyWindow(hwndTV); return NULL; } return hwndTV; } -void DestroyTreeView() { +void DestroyTreeView() +{ if (pathBuffer) HeapFree(GetProcessHeap(), 0, pathBuffer); } @@ -633,7 +680,7 @@ TVITEM tvi; /* Total no-good hack */ - if (!_tcsncmp(keyPath, _T("My Computer\\"), 12)) + if (!_tcsnicmp(keyPath, _T("My Computer\\"), 12)) keyPath += 12; hRoot = TreeView_GetRoot(hwndTV); @@ -647,17 +694,17 @@ /* Special case for root to expand root key abbreviations */ if (hItem == hRoot) { - if (!_tcscmp(szPathPart, TEXT("HKCR"))) + if (!_tcsicmp(szPathPart, TEXT("HKCR"))) _tcscpy(szPathPart, TEXT("HKEY_CLASSES_ROOT")); - else if (!_tcscmp(szPathPart, TEXT("HKCU"))) + else if (!_tcsicmp(szPathPart, TEXT("HKCU"))) _tcscpy(szPathPart, TEXT("HKEY_CURRENT_USER")); - else if (!_tcscmp(szPathPart, TEXT("HKLM"))) + else if (!_tcsicmp(szPathPart, TEXT("HKLM"))) _tcscpy(szPathPart, TEXT("HKEY_LOCAL_MACHINE")); - else if (!_tcscmp(szPathPart, TEXT("HKU"))) + else if (!_tcsicmp(szPathPart, TEXT("HKU"))) _tcscpy(szPathPart, TEXT("HKEY_USERS")); - else if (!_tcscmp(szPathPart, TEXT("HKCC"))) + else if (!_tcsicmp(szPathPart, TEXT("HKCC"))) _tcscpy(szPathPart, TEXT("HKEY_CURRENT_CONFIG")); - else if (!_tcscmp(szPathPart, TEXT("HKDD"))) + else if (!_tcsicmp(szPathPart, TEXT("HKDD"))) _tcscpy(szPathPart, TEXT("HKEY_DYN_DATA")); } @@ -672,7 +719,7 @@ (void)TreeView_GetItem(hwndTV, &tvi); - if (!_tcscmp(szBuffer, szPathPart)) + if (!_tcsicmp(szBuffer, szPathPart)) break; } Index: base/applications/regedit/childwnd.c =================================================================== --- base/applications/regedit/childwnd.c (revision 49463) +++ base/applications/regedit/childwnd.c (working copy) @@ -67,19 +67,32 @@ static void ResizeWnd(ChildWnd* pChildWnd, int cx, int cy) { - HDWP hdwp = BeginDeferWindowPos(2); - RECT rt, rs; - + HDWP hdwp = BeginDeferWindowPos(3); + RECT rt, rs, rb; + const int tHeight = 18; SetRect(&rt, 0, 0, cx, cy); cy = 0; - if (hStatusBar != NULL) { + if (hStatusBar != NULL) + { GetWindowRect(hStatusBar, &rs); - cy = rs.bottom - rs.top + 8; + cy = rs.bottom - rs.top; } + GetWindowRect(pChildWnd->hAddressBtnWnd, &rb); cx = pChildWnd->nSplitPos + SPLIT_WIDTH/2; - DeferWindowPos(hdwp, pChildWnd->hAddressBarWnd, 0, rt.left, rt.top, rt.right-rt.left, 23, SWP_NOZORDER|SWP_NOACTIVATE); - DeferWindowPos(hdwp, pChildWnd->hTreeWnd, 0, rt.left, rt.top + 25, pChildWnd->nSplitPos-SPLIT_WIDTH/2-rt.left, rt.bottom-rt.top-cy, SWP_NOZORDER|SWP_NOACTIVATE); - DeferWindowPos(hdwp, pChildWnd->hListWnd, 0, rt.left+cx , rt.top + 25, rt.right-cx, rt.bottom-rt.top-cy, SWP_NOZORDER|SWP_NOACTIVATE); + DeferWindowPos(hdwp, pChildWnd->hAddressBarWnd, 0, + rt.left, rt.top, rt.right-rt.left - tHeight-2, tHeight, + SWP_NOZORDER|SWP_NOACTIVATE); + DeferWindowPos(hdwp, pChildWnd->hAddressBtnWnd, 0, + rt.right - tHeight, rt.top, tHeight, tHeight, + SWP_NOZORDER|SWP_NOACTIVATE); + DeferWindowPos(hdwp, pChildWnd->hTreeWnd, 0, + rt.left, rt.top + tHeight+2, + pChildWnd->nSplitPos-SPLIT_WIDTH/2-rt.left, + rt.bottom-rt.top-cy, SWP_NOZORDER|SWP_NOACTIVATE); + DeferWindowPos(hdwp, pChildWnd->hListWnd, 0, + rt.left+cx, rt.top + tHeight+2, + rt.right-cx, rt.bottom-rt.top-cy, + SWP_NOZORDER|SWP_NOACTIVATE); EndDeferWindowPos(hdwp); } @@ -130,7 +143,8 @@ UNREFERENCED_PARAMETER(message); - switch (wID) { + switch (wID) + { /* Parse the menu selections: */ case ID_REGISTRY_EXIT: DestroyWindow(hWnd); @@ -139,14 +153,19 @@ /* TODO */ break; case ID_TREE_EXPANDBRANCH: - (void)TreeView_Expand(pChildWnd->hTreeWnd, TreeView_GetSelection(pChildWnd->hTreeWnd), TVE_EXPAND); + (void)TreeView_Expand(pChildWnd->hTreeWnd, + TreeView_GetSelection(pChildWnd->hTreeWnd), + TVE_EXPAND); break; case ID_TREE_COLLAPSEBRANCH: - (void)TreeView_Expand(pChildWnd->hTreeWnd, TreeView_GetSelection(pChildWnd->hTreeWnd), TVE_COLLAPSE); + (void)TreeView_Expand(pChildWnd->hTreeWnd, + TreeView_GetSelection(pChildWnd->hTreeWnd), + TVE_COLLAPSE); break; case ID_TREE_RENAME: SetFocus(pChildWnd->hTreeWnd); - (void)TreeView_EditLabel(pChildWnd->hTreeWnd, TreeView_GetSelection(pChildWnd->hTreeWnd)); + (void)TreeView_EditLabel(pChildWnd->hTreeWnd, + TreeView_GetSelection(pChildWnd->hTreeWnd)); break; case ID_TREE_DELETE: hSelection = TreeView_GetSelection(pChildWnd->hTreeWnd); @@ -155,8 +174,8 @@ if (keyPath == 0 || *keyPath == 0) { MessageBeep(MB_ICONHAND); - } else - if (DeleteKey(hWnd, hRootKey, keyPath)) + } + else if (DeleteKey(hWnd, hRootKey, keyPath)) DeleteNode(g_pChildWnd->hTreeWnd, 0); break; case ID_TREE_EXPORT: @@ -171,7 +190,8 @@ CopyKeyName(hWnd, hRootKey, keyPath); break; case ID_EDIT_NEW_KEY: - CreateNewKey(pChildWnd->hTreeWnd, TreeView_GetSelection(pChildWnd->hTreeWnd)); + CreateNewKey(pChildWnd->hTreeWnd, + TreeView_GetSelection(pChildWnd->hTreeWnd)); break; case ID_EDIT_NEW_STRINGVALUE: case ID_EDIT_NEW_BINARYVALUE: @@ -259,7 +279,7 @@ /* Check CLSID key */ if (RegOpenKey(hRootKey, pszKeyPath, &hSubKey) == ERROR_SUCCESS) { - if (QueryStringValue(hSubKey, TEXT("CLSID"), NULL, szBuffer, + if (QueryStringValue(hSubKey, TEXT("CLSID"), NULL, szBuffer, COUNT_OF(szBuffer)) == ERROR_SUCCESS) { lstrcpyn(pszSuggestions, TEXT("HKCR\\CLSID\\"), (int) iSuggestionsLength); @@ -315,7 +335,8 @@ BOOL Result; ChildWnd* pChildWnd = g_pChildWnd; - switch (message) { + switch (message) + { case WM_CREATE: { WNDPROC oldproc; @@ -330,23 +351,31 @@ _tcsncpy(pChildWnd->szPath, buffer, MAX_PATH); pChildWnd->nSplitPos = 250; pChildWnd->hWnd = hWnd; - pChildWnd->hAddressBarWnd = CreateWindowEx(WS_EX_CLIENTEDGE, _T("Edit"), NULL, WS_CHILD | WS_VISIBLE | WS_CHILDWINDOW | WS_TABSTOP, + pChildWnd->hAddressBarWnd = CreateWindowEx(WS_EX_CLIENTEDGE, _T("Edit"), NULL, + WS_CHILD | WS_VISIBLE | WS_CHILDWINDOW | WS_TABSTOP, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, hWnd, (HMENU)0, hInst, 0); + pChildWnd->hAddressBtnWnd = CreateWindowEx(WS_EX_CLIENTEDGE, _T("Button"), _T("ยป"), + WS_CHILD | WS_VISIBLE | WS_CHILDWINDOW | WS_TABSTOP | BS_DEFPUSHBUTTON, + CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, + hWnd, (HMENU)0, hInst, 0); pChildWnd->hTreeWnd = CreateTreeView(hWnd, pChildWnd->szPath, (HMENU) TREE_WINDOW); pChildWnd->hListWnd = CreateListView(hWnd, (HMENU) LIST_WINDOW/*, pChildWnd->szPath*/); SetFocus(pChildWnd->hTreeWnd); - /* set the address bar font */ - if (pChildWnd->hAddressBarWnd) + /* set the address bar and button font */ + if ((pChildWnd->hAddressBarWnd) && (pChildWnd->hAddressBtnWnd)) { hFont = (HFONT)GetStockObject(DEFAULT_GUI_FONT); SendMessage(pChildWnd->hAddressBarWnd, WM_SETFONT, (WPARAM)hFont, 0); + SendMessage(pChildWnd->hAddressBtnWnd, + WM_SETFONT, + (WPARAM)hFont, + 0); } - /* Subclass the AddressBar */ oldproc = (WNDPROC)(LONG_PTR)GetWindowLongPtr(pChildWnd->hAddressBarWnd, GWL_WNDPROC); SetWindowLongPtr(pChildWnd->hAddressBarWnd, GWL_USERDATA, (DWORD_PTR)oldproc); @@ -354,7 +383,12 @@ break; } case WM_COMMAND: - if (!_CmdWndProc(hWnd, message, wParam, lParam)) { + if(HIWORD(wParam) == BN_CLICKED) + { + PostMessage(pChildWnd->hAddressBarWnd, WM_KEYUP, VK_RETURN, 0); + } + else if (!_CmdWndProc(hWnd, message, wParam, lParam)) + { goto def; } break; @@ -362,11 +396,13 @@ OnPaint(hWnd); return 0; case WM_SETCURSOR: - if (LOWORD(lParam) == HTCLIENT) { + if (LOWORD(lParam) == HTCLIENT) + { POINT pt; GetCursorPos(&pt); ScreenToClient(hWnd, &pt); - if (pt.x>=pChildWnd->nSplitPos-SPLIT_WIDTH/2 && pt.xnSplitPos+SPLIT_WIDTH/2+1) { + if (pt.x>=pChildWnd->nSplitPos-SPLIT_WIDTH/2 && pt.xnSplitPos+SPLIT_WIDTH/2+1) + { SetCursor(LoadCursor(0, IDC_SIZEWE)); return TRUE; } @@ -380,11 +416,13 @@ pChildWnd = NULL; PostQuitMessage(0); break; - case WM_LBUTTONDOWN: { + case WM_LBUTTONDOWN: + { RECT rt; int x = (short)LOWORD(lParam); GetClientRect(hWnd, &rt); - if (x>=pChildWnd->nSplitPos-SPLIT_WIDTH/2 && xnSplitPos+SPLIT_WIDTH/2+1) { + if (x>=pChildWnd->nSplitPos-SPLIT_WIDTH/2 && xnSplitPos+SPLIT_WIDTH/2+1) + { last_split = pChildWnd->nSplitPos; draw_splitbar(hWnd, last_split); SetCapture(hWnd); @@ -394,7 +432,8 @@ case WM_LBUTTONUP: case WM_RBUTTONDOWN: - if (GetCapture() == hWnd) { + if (GetCapture() == hWnd) + { finish_splitbar(hWnd, LOWORD(lParam)); } break; @@ -406,7 +445,8 @@ case WM_KEYDOWN: if (wParam == VK_ESCAPE) - if (GetCapture() == hWnd) { + if (GetCapture() == hWnd) + { RECT rt; draw_splitbar(hWnd, last_split); GetClientRect(hWnd, &rt); @@ -418,7 +458,8 @@ break; case WM_MOUSEMOVE: - if (GetCapture() == hWnd) { + if (GetCapture() == hWnd) + { HDC hdc; RECT rt; HGDIOBJ OldObj; @@ -453,7 +494,8 @@ break; case WM_SETFOCUS: - if (pChildWnd != NULL) { + if (pChildWnd != NULL) + { SetFocus(pChildWnd->nFocusPanel? pChildWnd->hListWnd: pChildWnd->hTreeWnd); } break; @@ -462,25 +504,48 @@ break; case WM_NOTIFY: - if ((int)wParam == TREE_WINDOW) { - switch (((LPNMHDR)lParam)->code) { + if ((int)wParam == TREE_WINDOW) + { + switch (((LPNMHDR)lParam)->code) + { case TVN_ITEMEXPANDING: return !OnTreeExpanding(pChildWnd->hTreeWnd, (NMTREEVIEW*)lParam); - case TVN_SELCHANGED: { + case TVN_SELCHANGED: + { LPCTSTR keyPath, rootName; LPTSTR fullPath; HKEY hRootKey; keyPath = GetItemPath(pChildWnd->hTreeWnd, ((NMTREEVIEW*)lParam)->itemNew.hItem, &hRootKey); - if (keyPath) { + if (keyPath) + { RefreshListView(pChildWnd->hListWnd, hRootKey, keyPath); rootName = get_root_key_name(hRootKey); fullPath = HeapAlloc(GetProcessHeap(), 0, (_tcslen(rootName) + 1 + _tcslen(keyPath) + 1) * sizeof(TCHAR)); - if (fullPath) { + if (fullPath) + { + /* set (correct) the address bar text */ + if(keyPath[0] != '\0') _stprintf(fullPath, _T("%s\\%s"), rootName, keyPath); + else + fullPath = _tcscpy(fullPath, rootName); SendMessage(hStatusBar, SB_SETTEXT, 0, (LPARAM)fullPath); SendMessage(pChildWnd->hAddressBarWnd, WM_SETTEXT, 0, (LPARAM)fullPath); HeapFree(GetProcessHeap(), 0, fullPath); + /* disable hive manipulation items temporarily (enable only if necessary) */ + EnableMenuItem(GetSubMenu(hMenuFrame,0), ID_REGISTRY_LOADHIVE, MF_BYCOMMAND | MF_GRAYED); + EnableMenuItem(GetSubMenu(hMenuFrame,0), ID_REGISTRY_UNLOADHIVE, MF_BYCOMMAND | MF_GRAYED); + /* compare the strings to see if we should enable/disable the "Load Hive" menus accordingly */ + if (!(_tcsicmp(rootName, TEXT("HKEY_LOCAL_MACHINE")) && + _tcsicmp(rootName, TEXT("HKEY_USERS")))) + { + // enable the unload menu item if at the root + // otherwise enable the load menu item if there is no slash in keyPath (ie. immediate child selected) + if(keyPath[0] == '\0') + EnableMenuItem(GetSubMenu(hMenuFrame,0), ID_REGISTRY_LOADHIVE, MF_BYCOMMAND | MF_ENABLED); + else if(!_tcschr(keyPath, _T('\\'))) + EnableMenuItem(GetSubMenu(hMenuFrame,0), ID_REGISTRY_UNLOADHIVE, MF_BYCOMMAND | MF_ENABLED); + } { HKEY hKey; @@ -544,11 +609,13 @@ default: return 0; } - } else + } + else { if ((int)wParam == LIST_WINDOW) { - switch (((LPNMHDR)lParam)->code) { + switch (((LPNMHDR)lParam)->code) + { case NM_SETFOCUS: pChildWnd->nFocusPanel = 1; break; @@ -716,11 +783,13 @@ } case WM_SIZE: - if (wParam != SIZE_MINIMIZED && pChildWnd != NULL) { + if (wParam != SIZE_MINIMIZED && pChildWnd != NULL) + { ResizeWnd(pChildWnd, LOWORD(lParam), HIWORD(lParam)); } /* fall through */ -default: def: + default: + def: return DefWindowProc(hWnd, message, wParam, lParam); } return 0; Index: base/applications/regedit/resource.h =================================================================== --- base/applications/regedit/resource.h (revision 49463) +++ base/applications/regedit/resource.h (working copy) @@ -137,9 +137,11 @@ #define IDS_ERR_RENVAL_CAPTION 32856 #define IDS_ERR_RENVAL_TOEMPTY 32857 #define IDS_BAD_KEY 32858 +#define IDS_LOAD_HIVE 32859 +#define IDS_UNLOAD_HIVE 32860 -#define ID_EDIT_NEW_MULTISTRINGVALUE 32860 -#define ID_EDIT_NEW_EXPANDABLESTRINGVALUE 32861 +#define ID_EDIT_NEW_MULTISTRINGVALUE 32861 +#define ID_EDIT_NEW_EXPANDABLESTRINGVALUE 32862 #define ID_SWITCH_PANELS 32871 #define ID_EDIT_PERMISSIONS 32872 @@ -199,6 +201,8 @@ #define IDC_EXPORT_BRANCH 2009 #define IDC_EXPORT_BRANCH_TEXT 2010 +#define IDD_LOADHIVE 2500 +#define IDC_EDIT_KEY 2501 #define IDC_FAVORITENAME 2011 #define IDC_FAVORITESLIST 2012