static int reg_add(WCHAR *key_name, WCHAR *value_name, BOOL value_empty, WCHAR *type, WCHAR separator, WCHAR *data, BOOL force) { static const WCHAR stubW[] = {'A','D','D',' ','-',' ','%','s', ' ','%','s',' ','%','d',' ','%','s',' ','%','s',' ','%','d','\n',0 }; LPWSTR p; HKEY root,subkey; reg_printfW(stubW, key_name, value_name, value_empty, type, data, force); if (key_name[0]=='\\' && key_name[1]=='\\') { reg_message(STRING_NO_REMOTE); return 1; } p = strchrW(key_name,'\\'); if (!p) { reg_message(STRING_INVALID_KEY); return 1; } p++; root = get_rootkey(key_name); if (!root) { reg_message(STRING_INVALID_KEY); return 1; } if(RegCreateKeyW(root,p,&subkey)!=ERROR_SUCCESS) { reg_message(STRING_INVALID_KEY); return 1; } if (value_name || data) { DWORD reg_type; DWORD reg_count = 0; BYTE* reg_data = NULL; if (!force) { if (RegQueryValueW(subkey,value_name,NULL,NULL)==ERROR_SUCCESS) { /* FIXME: Prompt for overwrite */ } } reg_type = get_regtype(type); if (reg_type == -1) { RegCloseKey(subkey); reg_message(STRING_INVALID_CMDLINE); return 1; } if (data) reg_data = get_regdata(data,reg_type,separator,®_count); RegSetValueExW(subkey,value_name,0,reg_type,reg_data,reg_count); HeapFree(GetProcessHeap(),0,reg_data); } RegCloseKey(subkey); reg_message(STRING_SUCCESS); return 0; }
static int reg_add(WCHAR *key_name, WCHAR *value_name, BOOL value_empty, WCHAR *type, WCHAR separator, WCHAR *data, BOOL force) { LPWSTR p; HKEY root,subkey; if (!sane_path(key_name)) return 1; p = strchrW(key_name,'\\'); if (!p) { output_message(STRING_INVALID_KEY); return 1; } p++; root = path_get_rootkey(key_name); if (!root) { output_message(STRING_INVALID_KEY); return 1; } if (value_name && value_empty) { output_message(STRING_INVALID_CMDLINE); return 1; } if(RegCreateKeyW(root,p,&subkey)!=ERROR_SUCCESS) { output_message(STRING_INVALID_KEY); return 1; } if (value_name || data) { DWORD reg_type; DWORD reg_count = 0; BYTE* reg_data = NULL; if (!force) { if (RegQueryValueExW(subkey, value_name, NULL, NULL, NULL, NULL) == ERROR_SUCCESS) { if (!ask_confirm(STRING_OVERWRITE_VALUE, value_name)) { RegCloseKey(subkey); output_message(STRING_CANCELLED); return 0; } } } reg_type = wchar_get_type(type); if (reg_type == ~0u) { RegCloseKey(subkey); output_message(STRING_UNSUPPORTED_TYPE, type); return 1; } if (reg_type == REG_DWORD && !data) { RegCloseKey(subkey); output_message(STRING_INVALID_CMDLINE); return 1; } if (data && !(reg_data = get_regdata(data, reg_type, separator, ®_count))) { RegCloseKey(subkey); return 1; } RegSetValueExW(subkey,value_name,0,reg_type,reg_data,reg_count); HeapFree(GetProcessHeap(),0,reg_data); } RegCloseKey(subkey); output_message(STRING_SUCCESS); return 0; }