static int reg_message(int msg) { static const WCHAR formatW[] = {'%','s',0}; WCHAR msg_buffer[8192]; LoadStringW(GetModuleHandleW(NULL), msg, msg_buffer, sizeof(msg_buffer)/sizeof(WCHAR)); return reg_printfW(formatW, msg_buffer); }
static int reg_query(WCHAR *key_name, WCHAR *value_name, BOOL value_empty, BOOL subkey) { static const WCHAR stubW[] = {'S','T','U','B',' ','Q','U','E','R','Y',' ', '-',' ','%','s',' ','%','s',' ','%','d',' ','%','d','\n',0}; reg_printfW(stubW, key_name, value_name, value_empty, subkey); return 1; }
static int reg_delete(WCHAR *key_name, WCHAR *value_name, BOOL value_empty, BOOL value_all, BOOL force) { const WCHAR stubW[] = {'S','T','U','B',' ','D','E','L','E','T','E',' ','-', ' ','%','s',' ','%','s',' ','%','d',' ','%','d',' ','%','d','\n',0}; reg_printfW(stubW, key_name, value_name, value_empty, value_all, force); return 1; }
static int reg_add(WCHAR *key_name, WCHAR *value_name, BOOL value_empty, WCHAR *type, WCHAR separator, WCHAR *data, BOOL force) { const WCHAR stubW[] = {'S','T','U','B',' ','A','D','D',' ','-',' ','%','s', ' ','%','s',' ','%','d',' ','%','s',' ','%','s',' ','%','d','\n',0}; reg_printfW(stubW, key_name, value_name, value_empty, type, data, force); return 1; }
static int reg_message(int msg, ...) { va_list va_args; WCHAR msg_buffer[8192]; LoadString(GetModuleHandle(NULL), msg, msg_buffer, sizeof(msg_buffer)/sizeof(WCHAR)); va_start(va_args, msg); reg_printfW(msg_buffer, va_args); va_end(va_args); return 0; }
static LPBYTE get_regdata(LPWSTR data, DWORD reg_type, WCHAR separator, DWORD *reg_count) { LPBYTE out_data = NULL; *reg_count = 0; switch (reg_type) { case REG_SZ: { *reg_count = (lstrlenW(data) + 1) * sizeof(WCHAR); out_data = HeapAlloc(GetProcessHeap(),0,*reg_count); lstrcpyW((LPWSTR)out_data,data); break; } case REG_DWORD: { LPWSTR rest; DWORD val; val = strtolW(data, &rest, 0); if (rest == data) { static const WCHAR nonnumber[] = {'E','r','r','o','r',':',' ','/','d',' ','r','e','q','u','i','r','e','s',' ','n','u','m','b','e','r','.','\n',0}; reg_printfW(nonnumber); break; } *reg_count = sizeof(DWORD); out_data = HeapAlloc(GetProcessHeap(),0,*reg_count); ((LPDWORD)out_data)[0] = val; break; } default: { static const WCHAR unhandled[] = {'U','n','h','a','n','d','l','e','d',' ','T','y','p','e',' ','0','x','%','x',' ',' ','d','a','t','a',' ','%','s','\n',0}; reg_printfW(unhandled, reg_type,data); } } return out_data; }
static int reg_delete(WCHAR *key_name, WCHAR *value_name, BOOL value_empty, BOOL value_all, BOOL force) { LPWSTR p; HKEY root,subkey; static const WCHAR stubW[] = {'D','E','L','E','T','E', ' ','-',' ','%','s',' ','%','s',' ','%','d',' ','%','d',' ','%','d','\n' ,0 }; reg_printfW(stubW, key_name, value_name, value_empty, value_all, 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 (value_name && value_empty) { reg_message(STRING_INVALID_CMDLINE); return 1; } if (value_empty && value_all) { reg_message(STRING_INVALID_CMDLINE); return 1; } if (!force) { /* FIXME: Prompt for delete */ } /* Delete subtree only if no /v* option is given */ if (!value_name && !value_empty && !value_all) { if (RegDeleteTreeW(root,p)!=ERROR_SUCCESS) { reg_message(STRING_CANNOT_FIND); return 1; } reg_message(STRING_SUCCESS); return 0; } if(RegOpenKeyW(root,p,&subkey)!=ERROR_SUCCESS) { reg_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); reg_message(STRING_CANNOT_FIND); return 1; } } else if (value_empty) { RegSetValueExW(subkey,NULL,0,REG_SZ,NULL,0); } 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) { 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; }