/******************************************************************************* * * (C) COPYRIGHT MICROSOFT CORP., 1993-1994 * * TITLE: REGMAIN.C * * VERSION: 4.01 * * AUTHOR: Tracy Sharpe * * DATE: 05 Mar 1994 * *******************************************************************************/ #include "pch.h" #include #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; }