1 /*
2 * regexpl - Console Registry Explorer
3 *
4 * Copyright (C) 2000-2005 Nedko Arnaudov <nedko@users.sourceforge.net>
5 *
6 * This program is free software; you can redistribute it and/or modify
7 * it under the terms of the GNU General Public License as published by
8 * the Free Software Foundation; either version 2 of the License, or
9 * (at your option) any later version.
10 *
11 * This program is distributed in the hope that it will be useful,
12 * but WITHOUT ANY WARRANTY; without even the implied warranty of
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 * GNU General Public License for more details.
15 *
16 * You should have received a copy of the GNU General Public License
17 * along with this program; see the file COPYING. If not, write to
18 * the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
19 * Boston, MA 02111-1307, USA.
20 */
21
22 // ShellCommandDOKA.cpp: implementation of the CShellCommandDOKA class.
23 //
24 //////////////////////////////////////////////////////////////////////
25
26 #include "ph.h"
27 #include "ShellCommandDOKA.h"
28 #include "RegistryExplorer.h"
29 #include "SecurityDescriptor.h"
30
31 #define DOKA_CMD _T("DOKA")
32 #define DOKA_CMD_SHORT_DESC DOKA_CMD _T(" command is used to view/edit Desired Open Key Access.\n")
33
34 //////////////////////////////////////////////////////////////////////
35 // Construction/Destruction
36 //////////////////////////////////////////////////////////////////////
37
CShellCommandDOKA(CRegistryTree & rTree)38 CShellCommandDOKA::CShellCommandDOKA(CRegistryTree& rTree):m_rTree(rTree)
39 {
40 }
41
~CShellCommandDOKA()42 CShellCommandDOKA::~CShellCommandDOKA()
43 {
44 }
45
Match(const TCHAR * pchCommand)46 BOOL CShellCommandDOKA::Match(const TCHAR *pchCommand)
47 {
48 return _tcsicmp(pchCommand,DOKA_CMD) == 0;
49 }
50
Execute(CConsole & rConsole,CArgumentParser & rArguments)51 int CShellCommandDOKA::Execute(CConsole &rConsole, CArgumentParser& rArguments)
52 {
53 REGSAM Access = m_rTree.GetDesiredOpenKeyAccess();
54 const TCHAR *pchParameter;
55 BOOL blnBadParameter = FALSE;
56 BOOL blnHelp = FALSE;
57
58 while((pchParameter = rArguments.GetNextArgument()) != NULL)
59 {
60 blnBadParameter = FALSE;
61 // Console.Write(_T("Processing parameter: \")");
62 // Console.Write(pchParameter);
63 // Console.Write(_T("\")\n");
64 if ((_tcsicmp(pchParameter,_T("/?")) == 0)
65 ||(_tcsicmp(pchParameter,_T("-?")) == 0))
66 {
67 blnHelp = TRUE;
68 }
69 else if (*pchParameter == _T('-'))
70 {
71 TCHAR a = *(pchParameter+1);
72 if (a == 0)
73 {
74 Access = 0;
75 }
76 else
77 {
78 if (*(pchParameter+2) != 0)
79 {
80 blnBadParameter = TRUE;
81 }
82 else
83 {
84 switch(a)
85 {
86 case _T('l'): // KEY_CREATE_LINK
87 case _T('L'):
88 Access &= ~KEY_CREATE_LINK;
89 break;
90 case _T('c'): // KEY_CREATE_SUB_KEY
91 case _T('C'):
92 Access &= ~KEY_CREATE_SUB_KEY;
93 break;
94 case _T('e'): // KEY_ENUMERATE_SUB_KEYS
95 case _T('E'):
96 Access &= ~KEY_ENUMERATE_SUB_KEYS;
97 break;
98 case _T('n'): // KEY_NOTIFY
99 case _T('N'):
100 Access &= ~KEY_NOTIFY;
101 break;
102 case _T('q'): // KEY_QUERY_VALUE
103 case _T('Q'):
104 Access &= ~KEY_QUERY_VALUE;
105 break;
106 case _T('s'): // KEY_SET_VALUE
107 case _T('S'):
108 Access &= ~KEY_SET_VALUE;
109 break;
110 default:
111 blnBadParameter = TRUE;
112 } // switch
113 } // else (*(pchParameter+2) != 0)
114 } // else (a == 0)
115 } // if (*pchParameter == _T('-'))
116 else if (*pchParameter == _T('+'))
117 {
118 TCHAR a = *(pchParameter+1);
119 if (a == 0)
120 {
121 blnBadParameter = TRUE;
122 }
123 else
124 {
125 if (*(pchParameter+2) != 0)
126 {
127 blnBadParameter = TRUE;
128 }
129 else
130 {
131 switch(a)
132 {
133 case _T('a'): // KEY_ALL_ACCESS
134 case _T('A'):
135 Access |= KEY_ALL_ACCESS;
136 break;
137 case _T('l'): // KEY_CREATE_LINK
138 case _T('L'):
139 Access |= KEY_CREATE_LINK;
140 break;
141 case _T('c'): // KEY_CREATE_SUB_KEY
142 case _T('C'):
143 Access |= KEY_CREATE_SUB_KEY;
144 break;
145 case _T('e'): // KEY_ENUMERATE_SUB_KEYS
146 case _T('E'):
147 Access |= KEY_ENUMERATE_SUB_KEYS;
148 break;
149 case _T('n'): // KEY_NOTIFY
150 case _T('N'):
151 Access |= KEY_NOTIFY;
152 break;
153 case _T('q'): // KEY_QUERY_VALUE
154 case _T('Q'):
155 Access |= KEY_QUERY_VALUE;
156 break;
157 case _T('s'): // KEY_SET_VALUE
158 case _T('S'):
159 Access |= KEY_SET_VALUE;
160 break;
161 // case _T('X'): // KEY_EXECUTE
162 // case _T('x'):
163 // Access |= KEY_EXECUTE;
164 // break;
165 case _T('R'): // KEY_READ
166 case _T('r'):
167 Access |= KEY_READ;
168 break;
169 default:
170 blnBadParameter = TRUE;
171 } // switch
172 } // else (*(pchParameter+2) != 0)
173 } // else (a == 0)
174 } // if (*pchParameter == _T('-'))
175 else
176 {
177 blnBadParameter = TRUE;
178 }
179
180 if (blnBadParameter)
181 {
182 rConsole.Write(_T("Bad parameter: "));
183 rConsole.Write(pchParameter);
184 rConsole.Write(_T("\n"));
185 blnHelp = TRUE;
186 }
187 } // while((pchParameter = Parser.GetNextArgument()) != NULL)
188
189 if (blnHelp)
190 {
191 rConsole.Write(GetHelpString());
192 }
193 else
194 {
195 m_rTree.SetDesiredOpenKeyAccess(Access);
196 rConsole.Write(_T("Desired open key access:\n"));
197 REGSAM Access = m_rTree.GetDesiredOpenKeyAccess();
198 if (Access & KEY_CREATE_LINK)
199 {
200 rConsole.Write(_T("\tKEY_CREATE_LINK - Permission to create a symbolic link.\n"));
201 }
202 if (Access & KEY_CREATE_SUB_KEY)
203 {
204 rConsole.Write(_T("\tKEY_CREATE_SUB_KEY - Permission to create subkeys.\n"));
205 }
206 if (Access & KEY_ENUMERATE_SUB_KEYS)
207 {
208 rConsole.Write(_T("\tKEY_ENUMERATE_SUB_KEYS - Permission to enumerate subkeys.\n"));
209 }
210 if (Access & KEY_NOTIFY)
211 {
212 rConsole.Write(_T("\tKEY_NOTIFY - Permission for change notification.\n"));
213 }
214 if (Access & KEY_QUERY_VALUE)
215 {
216 rConsole.Write(_T("\tKEY_QUERY_VALUE - Permission to query subkey data.\n"));
217 }
218 if (Access & KEY_SET_VALUE)
219 {
220 rConsole.Write(_T("\tKEY_SET_VALUE - Permission to set subkey data.\n"));
221 }
222 }
223 return 0;
224 }
225
GetHelpString()226 const TCHAR * CShellCommandDOKA::GetHelpString()
227 {
228 return DOKA_CMD_SHORT_DESC
229 _T("Syntax: ") DOKA_CMD _T(" [Switches] [/?]\n\n")
230 _T(" /? - This help.\n\n")
231 _T("Switches are:\n")
232 _T(" - - Reset all permisions.\n")
233 _T(" -l - Reset permission to create a symbolic link.\n")
234 _T(" -c - Reset permission to create subkeys.\n")
235 _T(" -e - Reset permission to enumerate subkeys.\n")
236 _T(" -n - Reset permission for change notification.\n")
237 _T(" -q - Reset permission to query subkey data.\n")
238 _T(" -s - Reset permission to set subkey data.\n")
239 _T(" +a - Set all permisions.\n")
240 _T(" +l - Set permission to create a symbolic link.\n")
241 _T(" +c - Set permission to create subkeys.\n")
242 _T(" +e - Set permission to enumerate subkeys.\n")
243 _T(" +n - Set permission for change notification.\n")
244 _T(" +q - Set permission to query subkey data.\n")
245 _T(" +s - Set permission to set subkey data.\n")
246 _T(" +r - Equivalent to combination of +q , +e and +n\n\n")
247 _T("Without parameters, command displays current Desired Open Key Access.\n");
248 }
249
GetHelpShortDescriptionString()250 const TCHAR * CShellCommandDOKA::GetHelpShortDescriptionString()
251 {
252 return DOKA_CMD_SHORT_DESC;
253 }
254