401 lines
9 KiB
C
401 lines
9 KiB
C
|
/*******************************************************************************
|
||
|
*
|
||
|
* (C) COPYRIGHT MICROSOFT CORP., 1993-1994
|
||
|
*
|
||
|
* TITLE: REGMAIN.C
|
||
|
*
|
||
|
* VERSION: 4.01
|
||
|
*
|
||
|
* AUTHOR: Tracy Sharpe
|
||
|
*
|
||
|
* DATE: 05 Mar 1994
|
||
|
*
|
||
|
*******************************************************************************/
|
||
|
|
||
|
#include "pch.h"
|
||
|
#include <regstr.h>
|
||
|
#include "regedit.h"
|
||
|
#include "regfile.h"
|
||
|
#include "regbined.h"
|
||
|
#include "regresid.h"
|
||
|
|
||
|
// Instance handle of this application.
|
||
|
HINSTANCE g_hInstance;
|
||
|
|
||
|
// TRUE if accelerator table should not be used, such as during a rename
|
||
|
// operation.
|
||
|
BOOL g_fDisableAccelerators = FALSE;
|
||
|
|
||
|
TCHAR g_KeyNameBuffer[MAXKEYNAME];
|
||
|
TCHAR g_ValueNameBuffer[MAXVALUENAME_LENGTH];
|
||
|
|
||
|
COLORREF g_clrWindow;
|
||
|
COLORREF g_clrWindowText;
|
||
|
COLORREF g_clrHighlight;
|
||
|
COLORREF g_clrHighlightText;
|
||
|
|
||
|
HWND g_hRegEditWnd;
|
||
|
|
||
|
PTSTR g_pHelpFileName;
|
||
|
|
||
|
TCHAR g_NullString[] = TEXT("");
|
||
|
|
||
|
#define PARSERET_CONTINUE 0
|
||
|
#define PARSERET_REFRESH 1
|
||
|
#define PARSERET_EXIT 2
|
||
|
|
||
|
UINT
|
||
|
PASCAL
|
||
|
ParseCommandLine(
|
||
|
VOID
|
||
|
);
|
||
|
|
||
|
BOOL
|
||
|
PASCAL
|
||
|
IsRegistryToolDisabled(
|
||
|
VOID
|
||
|
);
|
||
|
|
||
|
int
|
||
|
PASCAL
|
||
|
ModuleEntry(
|
||
|
VOID
|
||
|
)
|
||
|
{
|
||
|
|
||
|
HWND hPopupWnd;
|
||
|
HACCEL hRegEditAccel;
|
||
|
MSG Msg;
|
||
|
USHORT wLanguageId = LANGIDFROMLCID(GetThreadLocale());
|
||
|
INITCOMMONCONTROLSEX icce;
|
||
|
|
||
|
g_hInstance = GetModuleHandle(NULL);
|
||
|
|
||
|
icce.dwSize = sizeof(icce);
|
||
|
icce.dwICC = ICC_ALL_CLASSES;
|
||
|
InitCommonControlsEx(&icce);
|
||
|
|
||
|
g_hRegEditWnd = FindWindow(g_RegEditClassName, NULL);
|
||
|
|
||
|
//
|
||
|
// To prevent users from corrupting their registries,
|
||
|
// administrators can set a policy switch to prevent editing. Check that
|
||
|
// switch now.
|
||
|
//
|
||
|
|
||
|
if (IsRegistryToolDisabled())
|
||
|
{
|
||
|
InternalMessageBox(g_hInstance, NULL, MAKEINTRESOURCE(IDS_REGEDITDISABLED),
|
||
|
MAKEINTRESOURCE(IDS_REGEDIT), MB_ICONERROR | MB_OK);
|
||
|
|
||
|
goto ModuleExit;
|
||
|
}
|
||
|
|
||
|
//
|
||
|
// Check if we were given a commandline and handle if appropriate.
|
||
|
//
|
||
|
|
||
|
switch (ParseCommandLine()) {
|
||
|
|
||
|
case PARSERET_REFRESH:
|
||
|
if (g_hRegEditWnd != NULL)
|
||
|
PostMessage(g_hRegEditWnd, WM_COMMAND, ID_REFRESH, 0);
|
||
|
// FALL THROUGH
|
||
|
|
||
|
case PARSERET_EXIT:
|
||
|
goto ModuleExit;
|
||
|
|
||
|
}
|
||
|
|
||
|
//
|
||
|
// Allow only one instance of the Registry Editor.
|
||
|
//
|
||
|
|
||
|
if (g_hRegEditWnd != NULL) {
|
||
|
|
||
|
if (IsIconic(g_hRegEditWnd))
|
||
|
ShowWindow(g_hRegEditWnd, SW_RESTORE);
|
||
|
|
||
|
else {
|
||
|
|
||
|
BringWindowToTop(g_hRegEditWnd);
|
||
|
|
||
|
if ((hPopupWnd = GetLastActivePopup(g_hRegEditWnd)) != g_hRegEditWnd)
|
||
|
BringWindowToTop(hPopupWnd);
|
||
|
|
||
|
SetForegroundWindow(hPopupWnd);
|
||
|
|
||
|
}
|
||
|
|
||
|
goto ModuleExit;
|
||
|
|
||
|
}
|
||
|
|
||
|
//
|
||
|
// Initialize and create an instance of the Registry Editor window.
|
||
|
//
|
||
|
|
||
|
if ((g_pHelpFileName = LoadDynamicString(IDS_HELPFILENAME)) == NULL)
|
||
|
goto ModuleExit;
|
||
|
|
||
|
if (!RegisterRegEditClass() || !RegisterHexEditClass())
|
||
|
goto ModuleExit;
|
||
|
|
||
|
if ((hRegEditAccel = LoadAccelerators(g_hInstance,
|
||
|
MAKEINTRESOURCE(IDACCEL_REGEDIT))) == NULL)
|
||
|
goto ModuleExit;
|
||
|
|
||
|
if ((g_hRegEditWnd = CreateRegEditWnd()) != NULL) {
|
||
|
|
||
|
while (GetMessage(&Msg, NULL, 0, 0)) {
|
||
|
|
||
|
if (g_fDisableAccelerators || !TranslateAccelerator(g_hRegEditWnd,
|
||
|
hRegEditAccel, &Msg)) {
|
||
|
|
||
|
TranslateMessage(&Msg);
|
||
|
DispatchMessage(&Msg);
|
||
|
|
||
|
}
|
||
|
|
||
|
}
|
||
|
|
||
|
}
|
||
|
|
||
|
ModuleExit:
|
||
|
ExitProcess(0);
|
||
|
|
||
|
return 0;
|
||
|
|
||
|
}
|
||
|
|
||
|
/*******************************************************************************
|
||
|
*
|
||
|
* ParseCommandline
|
||
|
*
|
||
|
* DESCRIPTION:
|
||
|
*
|
||
|
* PARAMETERS:
|
||
|
* (returns), TRUE to continuing loading, else FALSE to stop immediately.
|
||
|
*
|
||
|
*******************************************************************************/
|
||
|
|
||
|
UINT
|
||
|
PASCAL
|
||
|
ParseCommandLine(
|
||
|
VOID
|
||
|
)
|
||
|
{
|
||
|
|
||
|
BOOL fSilentMode;
|
||
|
BOOL fExportMode;
|
||
|
LPTSTR lpCmdLine;
|
||
|
LPTSTR lpFileName;
|
||
|
LPTSTR lpSelectedPath;
|
||
|
|
||
|
fSilentMode = FALSE;
|
||
|
fExportMode = FALSE;
|
||
|
|
||
|
lpCmdLine = GetCommandLine();
|
||
|
|
||
|
//
|
||
|
// Skip past the application pathname. Be sure to handle long filenames
|
||
|
// correctly.
|
||
|
//
|
||
|
|
||
|
if (*lpCmdLine == TEXT('\"')) {
|
||
|
|
||
|
do
|
||
|
lpCmdLine = CharNext(lpCmdLine);
|
||
|
while (*lpCmdLine != 0 && *lpCmdLine != TEXT('\"'));
|
||
|
|
||
|
if (*lpCmdLine == TEXT('\"'))
|
||
|
lpCmdLine = CharNext(lpCmdLine);
|
||
|
|
||
|
}
|
||
|
|
||
|
else {
|
||
|
|
||
|
while (*lpCmdLine > TEXT(' '))
|
||
|
lpCmdLine = CharNext(lpCmdLine);
|
||
|
|
||
|
}
|
||
|
|
||
|
while (*lpCmdLine != 0 && *lpCmdLine <= TEXT(' '))
|
||
|
lpCmdLine = CharNext(lpCmdLine);
|
||
|
|
||
|
while (TRUE) {
|
||
|
|
||
|
while (*lpCmdLine == TEXT(' '))
|
||
|
lpCmdLine = CharNext(lpCmdLine);
|
||
|
|
||
|
if (*lpCmdLine != TEXT('/') && *lpCmdLine != TEXT('-'))
|
||
|
break;
|
||
|
|
||
|
lpCmdLine = CharNext(lpCmdLine);
|
||
|
|
||
|
while (*lpCmdLine != 0 && *lpCmdLine != TEXT(' ')) {
|
||
|
|
||
|
switch (*lpCmdLine) {
|
||
|
|
||
|
case TEXT('m'):
|
||
|
case TEXT('M'):
|
||
|
//
|
||
|
// Allow multiple instances mode. Pretend we are the only
|
||
|
// copy of regedit running.
|
||
|
//
|
||
|
g_hRegEditWnd = NULL;
|
||
|
break;
|
||
|
|
||
|
//
|
||
|
// Specifies the location of the SYSTEM.DAT and USER.DAT
|
||
|
// files in real-mode. We don't use these switches, but
|
||
|
// we do need to bump past the filename.
|
||
|
//
|
||
|
case TEXT('l'):
|
||
|
case TEXT('L'):
|
||
|
case TEXT('r'):
|
||
|
case TEXT('R'):
|
||
|
return PARSERET_EXIT;
|
||
|
|
||
|
case TEXT('e'):
|
||
|
case TEXT('E'):
|
||
|
fExportMode = TRUE;
|
||
|
break;
|
||
|
|
||
|
case TEXT('a'):
|
||
|
case TEXT('A'):
|
||
|
fExportMode = TRUE;
|
||
|
g_RegEditData.uExportFormat = FILE_TYPE_REGEDIT4;
|
||
|
break;
|
||
|
|
||
|
case TEXT('s'):
|
||
|
case TEXT('S'):
|
||
|
//
|
||
|
// Silent mode where we don't show any dialogs when we
|
||
|
// import a registry file script.
|
||
|
//
|
||
|
fSilentMode = TRUE;
|
||
|
break;
|
||
|
|
||
|
case TEXT('v'):
|
||
|
case TEXT('V'):
|
||
|
//
|
||
|
// With the Windows 3.1 Registry Editor, this brought up
|
||
|
// the tree-style view. Now we always show the tree so
|
||
|
// nothing to do here!
|
||
|
//
|
||
|
// FALL THROUGH
|
||
|
|
||
|
case TEXT('u'):
|
||
|
case TEXT('U'):
|
||
|
//
|
||
|
// Update, don't overwrite existing path entries in
|
||
|
// shell\open\command or shell\open\print. This isn't even
|
||
|
// used by the Windows 3.1 Registry Editor!
|
||
|
//
|
||
|
// FALL THROUGH
|
||
|
|
||
|
default:
|
||
|
break;
|
||
|
|
||
|
}
|
||
|
|
||
|
lpCmdLine = CharNext(lpCmdLine);
|
||
|
|
||
|
}
|
||
|
|
||
|
}
|
||
|
|
||
|
if (!fExportMode) {
|
||
|
|
||
|
if (*lpCmdLine == 0)
|
||
|
return PARSERET_CONTINUE;
|
||
|
|
||
|
else {
|
||
|
|
||
|
lpFileName = GetNextSubstring(lpCmdLine);
|
||
|
|
||
|
while (lpFileName != NULL) {
|
||
|
|
||
|
RegEdit_ImportRegFile(NULL, fSilentMode, lpFileName, NULL);
|
||
|
lpFileName = GetNextSubstring(NULL);
|
||
|
|
||
|
}
|
||
|
|
||
|
return PARSERET_REFRESH;
|
||
|
|
||
|
}
|
||
|
|
||
|
}
|
||
|
|
||
|
else {
|
||
|
|
||
|
lpFileName = GetNextSubstring(lpCmdLine);
|
||
|
lpSelectedPath = GetNextSubstring(NULL);
|
||
|
|
||
|
if (GetNextSubstring(NULL) == NULL)
|
||
|
RegEdit_ExportRegFile(NULL, fSilentMode, lpFileName, lpSelectedPath);
|
||
|
|
||
|
return PARSERET_EXIT;
|
||
|
|
||
|
}
|
||
|
|
||
|
}
|
||
|
|
||
|
/*******************************************************************************
|
||
|
*
|
||
|
* IsRegistryToolDisabled
|
||
|
*
|
||
|
* DESCRIPTION:
|
||
|
* Checks the policy section of the registry to see if registry editing
|
||
|
* tools should be disabled. This switch is set by administrators to
|
||
|
* protect novice users.
|
||
|
*
|
||
|
* The Registry Editor is disabled if and only if this value exists and is
|
||
|
* set.
|
||
|
*
|
||
|
* PARAMETERS:
|
||
|
* (returns), TRUE if registry tool should not be run, else FALSE.
|
||
|
*
|
||
|
*******************************************************************************/
|
||
|
|
||
|
BOOL
|
||
|
PASCAL
|
||
|
IsRegistryToolDisabled(
|
||
|
VOID
|
||
|
)
|
||
|
{
|
||
|
|
||
|
BOOL fRegistryToolDisabled;
|
||
|
HKEY hKey;
|
||
|
DWORD Type;
|
||
|
DWORD ValueBuffer;
|
||
|
DWORD cbValueBuffer;
|
||
|
|
||
|
fRegistryToolDisabled = FALSE;
|
||
|
|
||
|
if (RegOpenKey(HKEY_CURRENT_USER,
|
||
|
REGSTR_PATH_POLICIES TEXT("\\") REGSTR_KEY_SYSTEM,
|
||
|
&hKey) == ERROR_SUCCESS)
|
||
|
{
|
||
|
|
||
|
cbValueBuffer = sizeof(DWORD);
|
||
|
|
||
|
if (RegEdit_QueryValueEx(hKey, REGSTR_VAL_DISABLEREGTOOLS, NULL, &Type,
|
||
|
(LPSTR) &ValueBuffer, &cbValueBuffer) == ERROR_SUCCESS)
|
||
|
{
|
||
|
|
||
|
if (Type == REG_DWORD && cbValueBuffer == sizeof(DWORD) &&
|
||
|
ValueBuffer != FALSE)
|
||
|
fRegistryToolDisabled = TRUE;
|
||
|
|
||
|
}
|
||
|
|
||
|
RegCloseKey(hKey);
|
||
|
|
||
|
}
|
||
|
|
||
|
return fRegistryToolDisabled;
|
||
|
|
||
|
}
|