ReactOS  0.4.15-dev-4934-gfd1e799
delete.c
Go to the documentation of this file.
1 /*
2  * Copyright 2016-2017, 2021 Hugh McMaster
3  *
4  * This library is free software; you can redistribute it and/or
5  * modify it under the terms of the GNU Lesser General Public
6  * License as published by the Free Software Foundation; either
7  * version 2.1 of the License, or (at your option) any later version.
8  *
9  * This library is distributed in the hope that it will be useful,
10  * but WITHOUT ANY WARRANTY; without even the implied warranty of
11  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
12  * Lesser General Public License for more details.
13  *
14  * You should have received a copy of the GNU Lesser General Public
15  * License along with this library; if not, write to the Free Software
16  * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
17  */
18 
19 #include "reg.h"
20 
22 
23 static void output_error(LONG rc)
24 {
25  if (rc == ERROR_FILE_NOT_FOUND)
26  {
27  if (op_delete_key)
29  else
31  }
32  else
33  {
35  }
36 }
37 
38 static int run_delete(HKEY root, WCHAR *path, REGSAM sam, WCHAR *key_name, WCHAR *value_name,
39  BOOL value_empty, BOOL value_all, BOOL force)
40 {
41  LONG rc;
42  HKEY hkey;
43 
44  if (!force)
45  {
46  BOOL ret;
47 
48  if (value_name || value_empty)
49  ret = ask_confirm(STRING_DELETE_VALUE, value_name);
50  else if (value_all)
52  else
54 
55  if (!ret)
56  {
58  return 0;
59  }
60  }
61 
63  {
64  output_error(rc);
65  return 1;
66  }
67 
68  /* Delete registry key if no /v* option is given */
69  if (!value_name && !value_empty && !value_all)
70  {
71  if ((rc = RegDeleteTreeW(hkey, NULL)))
72  {
74  output_error(rc);
75  return 1;
76  }
77 
78  RegDeleteKeyW(hkey, L"");
80 
82  return 0;
83  }
84 
86 
87  if (value_all)
88  {
89  DWORD max_value_len = 256, value_len;
90  WCHAR *value_name;
91 
92  value_name = malloc(max_value_len * sizeof(WCHAR));
93 
94  while (1)
95  {
96  value_len = max_value_len;
97  rc = RegEnumValueW(hkey, 0, value_name, &value_len, NULL, NULL, NULL, NULL);
98  if (rc == ERROR_SUCCESS)
99  {
100  rc = RegDeleteValueW(hkey, value_name);
101  if (rc != ERROR_SUCCESS)
102  {
103  free(value_name);
104  RegCloseKey(hkey);
106  output_error(rc);
107  return 1;
108  }
109  }
110  else if (rc == ERROR_MORE_DATA)
111  {
112  max_value_len *= 2;
113  value_name = realloc(value_name, max_value_len * sizeof(WCHAR));
114  }
115  else break;
116  }
117  free(value_name);
118  }
119  else if (value_name || value_empty)
120  {
121  if ((rc = RegDeleteValueW(hkey, value_name)))
122  {
123  RegCloseKey(hkey);
124  output_error(rc);
125  return 1;
126  }
127  }
128 
129  RegCloseKey(hkey);
131  return 0;
132 }
133 
134 int reg_delete(int argc, WCHAR *argvW[])
135 {
136  HKEY root;
137  WCHAR *path, *key_name, *value_name = NULL;
138  BOOL value_all = FALSE, value_empty = FALSE, force = FALSE;
139  REGSAM sam = 0;
140  int i;
141 
142  if (!parse_registry_key(argvW[2], &root, &path))
143  return 1;
144 
145  for (i = 3; i < argc; i++)
146  {
147  WCHAR *str;
148 
149  if (argvW[i][0] != '/' && argvW[i][0] != '-')
150  goto invalid;
151 
152  str = &argvW[i][1];
153 
154  if (!lstrcmpiW(str, L"va"))
155  {
156  if (value_all) goto invalid;
157  value_all = TRUE;
158  continue;
159  }
160  else if (!lstrcmpiW(str, L"ve"))
161  {
162  if (value_empty) goto invalid;
163  value_empty = TRUE;
164  continue;
165  }
166  else if (!lstrcmpiW(str, L"reg:32"))
167  {
168  if (sam & KEY_WOW64_32KEY) goto invalid;
169  sam |= KEY_WOW64_32KEY;
170  continue;
171  }
172  else if (!lstrcmpiW(str, L"reg:64"))
173  {
174  if (sam & KEY_WOW64_64KEY) goto invalid;
175  sam |= KEY_WOW64_64KEY;
176  continue;
177  }
178  else if (!str[0] || str[1])
179  goto invalid;
180 
181  switch (towlower(*str))
182  {
183  case 'v':
184  if (value_name || !(value_name = argvW[++i]))
185  goto invalid;
186  break;
187  case 'f':
188  if (force) goto invalid;
189  force = TRUE;
190  break;
191  default:
192  goto invalid;
193  }
194  }
195 
196  if ((value_name && value_empty) || (value_name && value_all) || (value_empty && value_all))
197  goto invalid;
198 
200  goto invalid;
201 
203 
204  return run_delete(root, path, sam, key_name, value_name, value_empty, value_all, force);
205 
206 invalid:
209  return 1;
210 }
#define realloc
Definition: debug_ros.c:6
static const WCHAR invalid[]
Definition: assoc.c:39
static int argc
Definition: ServiceArgs.c:12
#define ERROR_SUCCESS
Definition: deptool.c:10
#define KEY_SET_VALUE
Definition: nt_native.h:1017
#define KEY_READ
Definition: nt_native.h:1023
#define TRUE
Definition: types.h:120
GLsizei const GLchar ** path
Definition: glext.h:7234
#define STRING_DELETE_VALUE
Definition: resource.h:71
#define free
Definition: debug_ros.c:5
struct _root root
LONG WINAPI RegDeleteKeyW(_In_ HKEY hKey, _In_ LPCWSTR lpSubKey)
Definition: reg.c:1237
void WINAPIV output_message(unsigned int id,...)
Definition: reg.c:92
#define STRING_VALUEALL_FAILED
Definition: resource.h:74
static void output_error(LONG rc)
Definition: delete.c:23
#define STRING_DELETE_VALUEALL
Definition: resource.h:72
int WINAPI lstrcmpiW(LPCWSTR lpString1, LPCWSTR lpString2)
Definition: lstring.c:194
static int run_delete(HKEY root, WCHAR *path, REGSAM sam, WCHAR *key_name, WCHAR *value_name, BOOL value_empty, BOOL value_all, BOOL force)
Definition: delete.c:38
#define L(x)
Definition: ntvdm.h:50
#define FALSE
Definition: types.h:117
unsigned int BOOL
Definition: ntddk_ex.h:94
long LONG
Definition: pedump.c:60
#define STRING_SUCCESS
Definition: resource.h:36
const WCHAR * str
LONG WINAPI RegEnumValueW(_In_ HKEY hKey, _In_ DWORD index, _Out_ LPWSTR value, _Inout_ PDWORD val_count, _Reserved_ PDWORD reserved, _Out_opt_ PDWORD type, _Out_opt_ LPBYTE data, _Inout_opt_ PDWORD count)
Definition: reg.c:2853
#define STRING_FUNC_HELP
Definition: resource.h:34
_CRTIMP wchar_t *__cdecl _wcsupr(_Inout_z_ wchar_t *_String)
#define ERROR_FILE_NOT_FOUND
Definition: disk.h:79
#define KEY_WOW64_64KEY
Definition: cmtypes.h:46
__wchar_t WCHAR
Definition: xmlstorage.h:180
#define STRING_INVALID_SYNTAX
Definition: resource.h:33
unsigned long DWORD
Definition: ntddk_ex.h:95
int ret
#define STRING_DELETE_SUBKEY
Definition: resource.h:73
WCHAR * get_long_key(HKEY root, WCHAR *path)
Definition: reg.c:208
#define ERROR_MORE_DATA
Definition: dderror.h:13
int reg_delete(int argc, WCHAR *argvW[])
Definition: delete.c:134
LSTATUS WINAPI RegDeleteTreeW(HKEY hKey, LPCWSTR lpszSubKey)
Definition: reg.c:1746
#define STRING_ACCESS_DENIED
Definition: resource.h:35
BOOL ask_confirm(unsigned int msgid, WCHAR *reg_info)
Definition: reg.c:127
HKEY hkey
Definition: copy.c:25
GLsizei GLenum const GLvoid GLsizei GLenum GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLint GLint GLint GLshort GLshort GLshort GLubyte GLubyte GLubyte GLuint GLuint GLuint GLushort GLushort GLushort GLbyte GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLfloat GLint GLint GLint GLint GLshort GLshort GLshort GLshort GLubyte GLubyte GLubyte GLubyte GLuint GLuint GLuint GLuint GLushort GLushort GLushort GLushort GLboolean const GLdouble const GLfloat const GLint const GLshort const GLbyte const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLdouble const GLfloat const GLfloat const GLint const GLint const GLshort const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort GLenum GLenum GLenum GLfloat GLenum GLint GLenum GLenum GLenum GLfloat GLenum GLenum GLint GLenum GLfloat GLenum GLint GLint GLushort GLenum GLenum GLfloat GLenum GLenum GLint GLfloat const GLubyte GLenum GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLint GLint GLsizei GLsizei GLint GLenum GLenum const GLvoid GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLenum const GLdouble GLenum GLenum const GLfloat GLenum GLenum const GLint GLsizei GLuint GLfloat GLuint GLbitfield GLfloat GLint GLuint GLboolean GLenum GLfloat GLenum GLbitfield GLenum GLfloat GLfloat GLint GLint const GLfloat GLenum GLfloat GLfloat GLint GLint GLfloat GLfloat GLint GLint const GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat const GLdouble const GLfloat const GLdouble const GLfloat GLint i
Definition: glfuncs.h:248
LONG WINAPI RegDeleteValueW(HKEY hKey, LPCWSTR lpValueName)
Definition: reg.c:2355
static BOOL op_delete_key
Definition: delete.c:21
ACCESS_MASK REGSAM
Definition: winreg.h:69
#define NULL
Definition: types.h:112
#define STRING_KEY_NONEXIST
Definition: resource.h:38
static REGSAM sam
Definition: query.c:143
LONG WINAPI RegOpenKeyExW(HKEY hKey, LPCWSTR lpSubKey, DWORD ulOptions, REGSAM samDesired, PHKEY phkResult)
Definition: reg.c:3356
#define towlower(c)
Definition: wctype.h:97
#define malloc
Definition: debug_ros.c:4
#define KEY_WOW64_32KEY
Definition: cmtypes.h:45
BOOL parse_registry_key(const WCHAR *key, HKEY *root, WCHAR **path)
Definition: reg.c:234
#define RegCloseKey(hKey)
Definition: registry.h:47
#define STRING_CANCELLED
Definition: resource.h:37
#define STRING_VALUE_NONEXIST
Definition: resource.h:39