ReactOS  0.4.14-dev-552-g2fad488
RegistryExplorer.cpp
Go to the documentation of this file.
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 // RegistryExplorer.cpp : Defines the entry point for the Regiistry Explorer.
23 //
24 
25 #include "ph.h"
26 #include "RegistryExplorer.h"
27 #include "Console.h"
28 #include "RegistryKey.h"
29 #include "RegistryTree.h"
30 #include "SecurityDescriptor.h"
31 #include "ArgumentParser.h"
33 #include "ShellCommandExit.h"
34 #include "ShellCommandVersion.h"
35 #include "ShellCommandHelp.h"
36 #include "ShellCommandDir.h"
37 #include "ShellCommandChangeKey.h"
38 #include "ShellCommandValue.h"
39 #include "ShellCommandOwner.h"
40 #include "ShellCommandDACL.h"
41 #include "ShellCommandSACL.h"
42 //#include "ShellCommandDOKA.h"
43 #include "ShellCommandConnect.h"
44 #include "ShellCommandNewKey.h"
45 #include "ShellCommandDeleteKey.h"
46 #include "ShellCommandSetValue.h"
48 #include "Prompt.h"
49 #include "Settings.h"
50 
52 
55 
57 
59 {
60  switch(dwCtrlType)
61  {
62  case CTRL_C_EVENT:
63  case CTRL_BREAK_EVENT:
65  {
66 /* Beep(1000,100);
67  Beep(2000,100);
68  Beep(3000,100);
69  Beep(4000,100);
70  Beep(5000,100);
71  Beep(4000,100);
72  Beep(3000,100);
73  Beep(2000,100);
74  Beep(1000,100);*/
75  Console.Write(_T("\n"));
77  }
78  return TRUE;
79  default:
80  return FALSE;
81  }
82 }
83 
84 //int _tmain(/*int argc, TCHAR* argv[], TCHAR* envp[]*/)
85 int main ()
86 {
87  int nRetCode = 0;
88 
89  HRESULT hr;
90 
91  CSettings *pSettings = NULL;
92  CPrompt *pPrompt = NULL;
93 
94  CShellCommandsLinkedList CommandsList(Console);
95 
96  CShellCommandExit ExitCommand;
97  CommandsList.AddCommand(&ExitCommand);
98 
99  CShellCommandVersion VersionCommand;
100  CommandsList.AddCommand(&VersionCommand);
101 
102  CShellCommandHelp HelpCommand(CommandsList);
103  CommandsList.AddCommand(&HelpCommand);
104 
105  CShellCommandDir DirCommand(Tree);
106  CommandsList.AddCommand(&DirCommand);
107 
108  CShellCommandChangeKey ChangeKeyCommand(Tree);
109  CommandsList.AddCommand(&ChangeKeyCommand);
110 
111  CShellCommandValue ValueCommand(Tree);
112  CommandsList.AddCommand(&ValueCommand);
113 
114  CShellCommandOwner OwnerCommand(Tree);
115  CommandsList.AddCommand(&OwnerCommand);
116 
117  CShellCommandDACL DACLCommand(Tree);
118  CommandsList.AddCommand(&DACLCommand);
119 
120  CShellCommandSACL SACLCommand(Tree);
121  CommandsList.AddCommand(&SACLCommand);
122 
123  CShellCommandConnect ConnectCommand(Tree);
124  CommandsList.AddCommand(&ConnectCommand);
125 
126  CShellCommandNewKey NewKeyCommand(Tree);
127  CommandsList.AddCommand(&NewKeyCommand);
128 
129  CShellCommandDeleteKey DeleteKeyCommand(Tree);
130  CommandsList.AddCommand(&DeleteKeyCommand);
131 
132  CShellCommandSetValue SetValueCommand(Tree);
133  CommandsList.AddCommand(&SetValueCommand);
134 
135  CShellCommandDeleteValue DeleteValueCommand(Tree);
136  CommandsList.AddCommand(&DeleteValueCommand);
137 
138  CArgumentParser Parser;
139 
140  pSettings = new (std::nothrow) CSettings();
141  if (!pSettings)
142  {
143  _ftprintf(stderr,_T("Cannot initialize settings. Out of memory.\n"));
144  goto Abort;
145  }
146 
147  hr = pSettings->Load(SETTINGS_REGISTRY_KEY);
148  if (FAILED(hr))
149  {
150  _ftprintf(stderr,_T("Cannot load settings. Error is 0x%X.\n"),(unsigned int)hr);
151  goto Abort;
152  }
153 
154  pPrompt = new (std::nothrow) CPrompt(Tree,hr);
155  if (!pPrompt)
156  {
157  _ftprintf(stderr,_T("Cannot initialize prompt. Out of memory.\n"));
158  goto Abort;
159  }
160 
161  if (FAILED(hr))
162  {
163  _ftprintf(stderr,_T("Cannot initialize prompt. Error is 0x%X.\n"),(unsigned int)hr);
164  goto Abort;
165  }
166 
167 // input buffer size in chars
168 #define INPUT_BUFFER_SIZE 1024
169 //#define INPUT_BUFFER_SIZE 128
170 //#define INPUT_BUFFER_SIZE 10
171 
172  TCHAR *pchCommand;
173 
174  pchCommand = Console.Init(INPUT_BUFFER_SIZE,10);
175  if (pchCommand == NULL)
176  {
177  _ftprintf(stderr,_T("Cannot initialize console.\n"));
178  nRetCode = 1;
179  goto Exit;
180  }
181 
183 
184  WORD wOldConsoleAttribute;
185  if (!Console.GetTextAttribute(wOldConsoleAttribute)) goto Abort;
186 
187  Console.SetTitle(_T("Registry Explorer"));
189 
191 
192  if (!Console.Write(HELLO_MSG
193  //(_L(__TIMESTAMP__))
194  )) goto Abort;
195 
196  //Tree.SetDesiredOpenKeyAccess(KEY_READ);
197 
198  hr = pPrompt->SetPrompt(pSettings->GetPrompt());
199  if (FAILED(hr))
200  {
201  _ftprintf(stderr,_T("Cannot initialize prompt. Error is 0x%X.\n"),(unsigned int)hr);
202  goto Abort;
203  }
204 
205 GetCommand:
206  // prompt
207  // TODO: make prompt user-customizable
209  pPrompt->ShowPrompt(Console);
211 
213 
214  // Set command line color
216  if (!Console.ReadLine())
217  goto Abort;
218 
219  // Set normal color
221 
224 
225  // Parse command line (1st step - convert to multi sz)
226  Parser.SetArgumentList(pchCommand);
227 
228  int nCommandReturnValue;
229  switch(CommandsList.Execute(Parser,nCommandReturnValue))
230  {
231  case -1: // not recognized command
232  {
233  Parser.ResetArgumentIteration();
234  TCHAR *pchCommandItself = Parser.GetNextArgument();
235  size_t cmdlen = _tcslen(pchCommandItself);
236  if ((!cmdlen)||
237  (pchCommandItself[cmdlen-1] != _T('\\'))||
238  (Parser.GetNextArgument())||
239  (!Tree.ChangeCurrentKey(pchCommandItself)))
240  {
241  Console.Write(_T("Unknown command \""));
242  Console.Write(pchCommandItself);
243  Console.Write(_T("\"\n"));
244  }
245  }
246  case -2: // empty line
247  goto GetCommand;
248  case 0: // exit command
249  nRetCode = 0;
250  Console.SetTextAttribute(wOldConsoleAttribute);
251  goto Exit;
252  default:
253  Console.Write(_T("\n"));
254  goto GetCommand;
255  }
256 
257 Abort:
258  _ftprintf(stderr,_T("Abnormal program termination.\nPlease report bugs to ") EMAIL _T("\n"));
259  nRetCode = 1;
260 
261 Exit:
262 
263  if (pSettings)
264  delete pSettings;
265 
266  if (pPrompt)
267  delete pPrompt;
268 
269  return nRetCode;
270 }
void DisableWrite()
Definition: Console.cpp:1064
HRESULT SetPrompt(LPCTSTR pszPrompt)
Definition: Prompt.cpp:44
#define TRUE
Definition: types.h:120
#define CTRL_BREAK_EVENT
Definition: wincon.h:66
BOOL ReadLine()
Definition: Console.cpp:249
void SetArgumentList(TCHAR *pchArguments)
HRESULT hr
Definition: shlfolder.c:183
void ShowPrompt(CConsole &rConsole)
Definition: Prompt.cpp:67
WORD GetCommandTextAttributes()
Definition: Settings.cpp:142
CRegistryTree Tree
void EnableWrite()
Definition: Console.cpp:1080
int Execute(CArgumentParser &rArgumentParser, int &nReturnValue)
void BeginScrollingOperation()
Definition: Console.cpp:1007
#define CTRL_C_EVENT
Definition: wincon.h:65
TCHAR pchCurrentKey[PROMPT_BUFFER_SIZE]
#define PROMPT_BUFFER_SIZE
BOOL SetTitle(const TCHAR *p)
Definition: Console.cpp:222
#define HELLO_MSG
BOOL SetTextAttribute(WORD wAttributes)
Definition: Console.cpp:227
BOOL ChangeCurrentKey(const TCHAR *pchRelativePath)
unsigned int BOOL
Definition: ntddk_ex.h:94
BOOL WINAPI DECLSPEC_HOTPATCH SetConsoleCtrlHandler(PHANDLER_ROUTINE HandlerRoutine, BOOL Add)
Definition: console.c:2111
TCHAR * GetNextArgument()
void ResetArgumentIteration()
size_t __cdecl _tcslen(const _TCHAR *str)
Definition: tcslen.h:9
smooth NULL
Definition: ftsmooth.c:416
BOOL blnCommandExecutionInProgress
LPCTSTR GetPrompt()
Definition: Settings.cpp:132
BOOL FlushInputBuffer()
Definition: Console.cpp:243
Definition: Prompt.h:7
#define _ftprintf
Definition: tchar.h:518
BOOL GetTextAttribute(WORD &rwAttributes)
Definition: Console.cpp:858
char TCHAR
Definition: xmlstorage.h:189
#define _T(x)
Definition: vfdio.h:22
LONG HRESULT
Definition: typedefs.h:77
static void Exit(void)
Definition: sock.c:1331
#define WINAPI
Definition: msvc.h:8
#define INPUT_BUFFER_SIZE
unsigned short WORD
Definition: ntddk_ex.h:93
#define VERIFY(e)
Definition: ph.h:34
unsigned long DWORD
Definition: ntddk_ex.h:95
#define EMAIL
WORD GetNormalTextAttributes()
Definition: Settings.cpp:137
void SetReplaceCompletionCallback(ReplaceCompletionCallback pfCallback)
Definition: Console.cpp:1058
HRESULT Load(LPCTSTR pszLoadKey)
Definition: Settings.cpp:56
BOOL Write(const TCHAR *p, DWORD dwChars=0)
Definition: Console.cpp:90
BOOL WINAPI HandlerRoutine(DWORD dwCtrlType)
TCHAR * Init(DWORD dwBufferSize, DWORD dwMaxHistoryLines=0)
Definition: Console.cpp:870
CConsole Console
int main()
#define SETTINGS_REGISTRY_KEY
FILE * stderr
const TCHAR * CompletionCallback(unsigned __int64 &rnIndex, const BOOL *pblnForward, const TCHAR *pszContext, const TCHAR *pszBegin)
Definition: Completion.cpp:439
BOOL(CALLBACK * PHANDLER_ROUTINE)(_In_ DWORD)
Definition: wincon.h:222
void AddCommand(CShellCommand *pCommand)