static HANDLE get_file_handle(WCHAR *filename, BOOL overwrite_file) { HANDLE hFile = create_file(filename, overwrite_file ? CREATE_ALWAYS : CREATE_NEW); if (hFile == INVALID_HANDLE_VALUE) { DWORD error = GetLastError(); if (error == ERROR_FILE_EXISTS) { if (!ask_confirm(STRING_OVERWRITE_FILE, filename)) { output_message(STRING_CANCELLED); exit(0); } hFile = create_file(filename, CREATE_ALWAYS); } else { WCHAR *str; FormatMessageW(FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_IGNORE_INSERTS, NULL, error, 0, (WCHAR *)&str, 0, NULL); output_writeconsole(str, lstrlenW(str)); LocalFree(str); exit(1); } } return hFile; }
static int reg_delete(WCHAR *key_name, WCHAR *value_name, BOOL value_empty, BOOL value_all, 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) || (value_name && value_all) || (value_empty && value_all)) { output_message(STRING_INVALID_CMDLINE); return 1; } if (!force) { BOOL ret; if (value_name || value_empty) ret = ask_confirm(STRING_DELETE_VALUE, value_name); else if (value_all) ret = ask_confirm(STRING_DELETE_VALUEALL, key_name); else ret = ask_confirm(STRING_DELETE_SUBKEY, key_name); if (!ret) { output_message(STRING_CANCELLED); return 0; } } /* Delete subtree only if no /v* option is given */ if (!value_name && !value_empty && !value_all) { if (RegDeleteTreeW(root,p)!=ERROR_SUCCESS) { output_message(STRING_CANNOT_FIND); return 1; } output_message(STRING_SUCCESS); return 0; } if(RegOpenKeyW(root,p,&subkey)!=ERROR_SUCCESS) { output_message(STRING_CANNOT_FIND); return 1; } if (value_all) { LPWSTR szValue; DWORD maxValue; DWORD count; LONG rc; rc = RegQueryInfoKeyW(subkey, NULL, NULL, NULL, NULL, NULL, NULL, NULL, &maxValue, NULL, NULL, NULL); if (rc != ERROR_SUCCESS) { /* FIXME: failure */ RegCloseKey(subkey); return 1; } maxValue++; szValue = HeapAlloc(GetProcessHeap(),0,maxValue*sizeof(WCHAR)); while (1) { count = maxValue; rc = RegEnumValueW(subkey, 0, szValue, &count, NULL, NULL, NULL, NULL); if (rc == ERROR_SUCCESS) { rc = RegDeleteValueW(subkey, szValue); if (rc != ERROR_SUCCESS) break; } else break; } if (rc != ERROR_SUCCESS) { /* FIXME delete failed */ } } else if (value_name) { if (RegDeleteValueW(subkey,value_name) != ERROR_SUCCESS) { RegCloseKey(subkey); output_message(STRING_CANNOT_FIND); return 1; } } else if (value_empty) { RegSetValueExW(subkey,NULL,0,REG_SZ,NULL,0); } RegCloseKey(subkey); output_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; }