/****************************************************************************** * Writes contents of the registry key to the specified file stream. * * Parameters: * file_name - name of a file to export registry branch to. * reg_key_name - registry branch to export. The whole registry is exported if * reg_key_name is NULL or contains an empty string. */ BOOL export_registry_key(WCHAR *file_name, WCHAR *reg_key_name, DWORD format) { WCHAR *reg_key_name_buf; WCHAR *val_name_buf; BYTE *val_buf; WCHAR *line_buf; DWORD reg_key_name_size = KEY_MAX_LEN; DWORD val_name_size = KEY_MAX_LEN; DWORD val_size = REG_VAL_BUF_SIZE; DWORD line_buf_size = KEY_MAX_LEN + REG_VAL_BUF_SIZE; FILE *file = NULL; BOOL unicode = (format == REG_FORMAT_5); reg_key_name_buf = HeapAlloc(GetProcessHeap(), 0, reg_key_name_size * sizeof(*reg_key_name_buf)); val_name_buf = HeapAlloc(GetProcessHeap(), 0, val_name_size * sizeof(*val_name_buf)); val_buf = HeapAlloc(GetProcessHeap(), 0, val_size); 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]) { HKEY reg_key_class; WCHAR *branch_name = NULL; HKEY key; REGPROC_resize_char_buffer(®_key_name_buf, ®_key_name_size, lstrlenW(reg_key_name)); lstrcpyW(reg_key_name_buf, reg_key_name); /* open the specified key */ if (!parseKeyName(reg_key_name, ®_key_class, &branch_name)) { output_message(STRING_INCORRECT_REG_CLASS, reg_key_name); exit(1); } if (!branch_name[0]) { /* no branch - registry class is specified */ file = REGPROC_open_export_file(file_name, unicode); export_hkey(file, reg_key_class, ®_key_name_buf, ®_key_name_size, &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) { file = REGPROC_open_export_file(file_name, unicode); export_hkey(file, key, ®_key_name_buf, ®_key_name_size, &val_name_buf, &val_name_size, &val_buf, &val_size, &line_buf, &line_buf_size, unicode); RegCloseKey(key); } else { output_message(STRING_REG_KEY_NOT_FOUND, reg_key_name); } } else { unsigned int i; /* export all registry classes */ file = REGPROC_open_export_file(file_name, unicode); for (i = 0; i < ARRAY_SIZE(reg_class_keys); 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) { lstrcpyW(reg_key_name_buf, reg_class_namesW[i]); export_hkey(file, reg_class_keys[i], ®_key_name_buf, ®_key_name_size, &val_name_buf, &val_name_size, &val_buf, &val_size, &line_buf, &line_buf_size, unicode); } } } if (file) { fclose(file); } HeapFree(GetProcessHeap(), 0, reg_key_name); HeapFree(GetProcessHeap(), 0, val_name_buf); HeapFree(GetProcessHeap(), 0, val_buf); HeapFree(GetProcessHeap(), 0, line_buf); return TRUE; }
/****************************************************************************** * Writes contents of the registry key to the specified file stream. * * Parameters: * file_name - name of a file to export registry branch to. * reg_key_name - registry branch to export. The whole registry is exported if * reg_key_name is NULL or contains an empty string. */ BOOL export_registry_key(WCHAR *file_name, WCHAR *reg_key_name, DWORD format) { WCHAR *reg_key_name_buf; WCHAR *val_name_buf; BYTE *val_buf; WCHAR *line_buf; DWORD reg_key_name_size = KEY_MAX_LEN; DWORD val_name_size = KEY_MAX_LEN; DWORD val_size = REG_VAL_BUF_SIZE; DWORD line_buf_size = KEY_MAX_LEN + REG_VAL_BUF_SIZE; FILE *file = NULL; BOOL unicode = (format == REG_FORMAT_5); reg_key_name_buf = HeapAlloc(GetProcessHeap(), 0, reg_key_name_size * sizeof(*reg_key_name_buf)); val_name_buf = HeapAlloc(GetProcessHeap(), 0, val_name_size * sizeof(*val_name_buf)); val_buf = HeapAlloc(GetProcessHeap(), 0, val_size); 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]) { HKEY reg_key_class; WCHAR *branch_name = NULL; HKEY key; REGPROC_resize_char_buffer(®_key_name_buf, ®_key_name_size, lstrlenW(reg_key_name)); lstrcpyW(reg_key_name_buf, reg_key_name); /* open the specified key */ 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]) { /* no branch - registry class is specified */ file = REGPROC_open_export_file(file_name, unicode); export_hkey(file, reg_key_class, ®_key_name_buf, ®_key_name_size, &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) { file = REGPROC_open_export_file(file_name, unicode); export_hkey(file, key, ®_key_name_buf, ®_key_name_size, &val_name_buf, &val_name_size, &val_buf, &val_size, &line_buf, &line_buf_size, unicode); RegCloseKey(key); } 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 { unsigned int i; /* export all registry classes */ file = REGPROC_open_export_file(file_name, unicode); 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) { lstrcpyW(reg_key_name_buf, reg_class_namesW[i]); export_hkey(file, reg_class_keys[i], ®_key_name_buf, ®_key_name_size, &val_name_buf, &val_name_size, &val_buf, &val_size, &line_buf, &line_buf_size, unicode); } } } if (file) { fclose(file); } HeapFree(GetProcessHeap(), 0, reg_key_name); HeapFree(GetProcessHeap(), 0, val_name_buf); HeapFree(GetProcessHeap(), 0, val_buf); HeapFree(GetProcessHeap(), 0, line_buf); return TRUE; }
/****************************************************************************** * Writes contents of the registry key to the specified file stream. * * Parameters: * file_name - name of a file to export registry branch to. * reg_key_name - registry branch to export. The whole registry is exported if * reg_key_name is NULL or contains an empty string. */ BOOL export_registry_key(TCHAR* file_name, TCHAR* reg_key_name) { HKEY reg_key_class; TCHAR *reg_key_name_buf; TCHAR *val_name_buf; BYTE *val_buf; DWORD reg_key_name_len = KEY_MAX_LEN; DWORD val_name_len = KEY_MAX_LEN; DWORD val_size = REG_VAL_BUF_SIZE; FILE *file = NULL; //_tprintf(_T("export_registry_key(%s, %s)\n"), reg_key_name, file_name); reg_key_name_buf = HeapAlloc(GetProcessHeap(), 0, reg_key_name_len * sizeof(*reg_key_name_buf)); val_name_buf = HeapAlloc(GetProcessHeap(), 0, val_name_len * sizeof(*val_name_buf)); val_buf = HeapAlloc(GetProcessHeap(), 0, val_size); CHECK_ENOUGH_MEMORY(reg_key_name_buf && val_name_buf && val_buf); if (reg_key_name && reg_key_name[0]) { TCHAR *branch_name; HKEY key; REGPROC_resize_char_buffer(®_key_name_buf, ®_key_name_len, _tcslen(reg_key_name)); _tcscpy(reg_key_name_buf, reg_key_name); /* open the specified key */ reg_key_class = getRegClass(reg_key_name); if (reg_key_class == (HKEY)ERROR_INVALID_PARAMETER) { _tprintf(_T("Incorrect registry class specification in '%s\n"), reg_key_name); //exit(1); return FALSE; } branch_name = getRegKeyName(reg_key_name); CHECK_ENOUGH_MEMORY(branch_name); if (!branch_name[0]) { /* no branch - registry class is specified */ file = REGPROC_open_export_file(file_name); export_hkey(file, reg_key_class, ®_key_name_buf, ®_key_name_len, &val_name_buf, &val_name_len, &val_buf, &val_size); } else if (RegOpenKey(reg_key_class, branch_name, &key) == ERROR_SUCCESS) { file = REGPROC_open_export_file(file_name); export_hkey(file, key, ®_key_name_buf, ®_key_name_len, &val_name_buf, &val_name_len, &val_buf, &val_size); RegCloseKey(key); } else { _tprintf(_T("Can't export. Registry key '%s does not exist!\n"), reg_key_name); REGPROC_print_error(); } HeapFree(GetProcessHeap(), 0, branch_name); } else { int i; /* export all registry classes */ file = REGPROC_open_export_file(file_name); 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) { _tcscpy(reg_key_name_buf, reg_class_names[i]); export_hkey(file, reg_class_keys[i], ®_key_name_buf, ®_key_name_len, &val_name_buf, &val_name_len, &val_buf, &val_size); } } } if (file) { fclose(file); } // HeapFree(GetProcessHeap(), 0, reg_key_name); HeapFree(GetProcessHeap(), 0, val_buf); HeapFree(GetProcessHeap(), 0, val_name_buf); HeapFree(GetProcessHeap(), 0, reg_key_name_buf); return TRUE; }