|
|
#include <windows.h>
#include <userenv.h>
#include <userenvp.h>
#include <shlwapi.h>
#include "shmgdefs.h"
enum { CMD_W95_TO_SUR, CMD_DAYTONA_CURSORS, CMD_FIX_CURSOR_PATHS, CMD_FIX_SPECIAL_FOLDERS, CMD_FIX_WINDOWS_PROFILE_SECURITY, CMD_FIX_USER_PROFILE_SECURITY, CMD_FIX_POLICIES_SECURITY, CMD_CVT_SCHEMES_TO_MULTIUSER, CMD_UPGRADE_NT4_PROFILE_TO_NT5, CMD_UPGRADE_SCHEMES_AND_NCMETRICS_TO_WIN2000, CMD_UPGRADE_SCHEMES_AND_NCMETRICS_FROM_WIN9X_TO_WIN2000, CMD_FIX_CAPI_DIR_ATTRIBUTES, CMD_MERGE_DESKTOP_AND_NORMAL_STREAMS, CMD_MOVE_AND_ADJUST_ICON_METRICS, CMD_FIX_HTML_HELP, CMD_SET_SCREENSAVER_FRIENDLYUI, CMD_OCINSTALL_FIXUP,
// enums from here down will run within OleInitialize/OleUnitialize
CMD_OLE_REQUIRED_START = 10000, CMD_OCINSTALL_SHOW_IE, CMD_OCINSTALL_REINSTALL_IE, CMD_OCINSTALL_HIDE_IE, CMD_OCINSTALL_USER_CONFIG_IE, CMD_OCINSTALL_SHOW_OE, CMD_OCINSTALL_REINSTALL_OE, CMD_OCINSTALL_HIDE_OE, CMD_OCINSTALL_USER_CONFIG_OE, CMD_OCINSTALL_SHOW_VM, CMD_OCINSTALL_REINSTALL_VM, CMD_OCINSTALL_HIDE_VM, } CMD_VALS;
int mystrcpy( LPTSTR pszOut, LPTSTR pszIn, TCHAR chTerm ) { BOOL fInQuote = FALSE; LPTSTR pszStrt = pszOut;
while( *pszIn && !fInQuote && *pszIn != chTerm ) { if (*pszIn == TEXT('"')) { fInQuote = !fInQuote; } *pszOut++ = *pszIn++; }
*pszOut = TEXT('\0'); return (int)(pszOut - pszStrt); }
BOOL HasPath( LPTSTR pszFilename ) { //
// Special case null string so it won't get changed
//
if (*pszFilename == TEXT('\0')) return TRUE;
for(; *pszFilename; pszFilename++ ) { if (*pszFilename == TEXT(':') || *pszFilename == TEXT('\\') || *pszFilename == TEXT('/')) { return TRUE; } }
return FALSE; }
void HandOffToShell32 (LPCSTR pcszCommand, LPCSTR pcszOptionalArgument)
{ HINSTANCE hInstShell32 = LoadLibrary(TEXT("shell32")); if (hInstShell32 != NULL) { typedef HRESULT (*PFNFirstUserLogon) (LPCSTR pcszCommand, LPCSTR pcszOptionalArgument);
PFNFirstUserLogon pfnFirstUserLogon;
// Call shell32!FirstUserLogon which is Ordinal230 defined in shell32.src.
pfnFirstUserLogon = (PFNFirstUserLogon)GetProcAddress(hInstShell32, (LPCSTR)MAKEINTRESOURCE(230)); if (pfnFirstUserLogon != NULL) pfnFirstUserLogon(pcszCommand, pcszOptionalArgument); FreeLibrary(hInstShell32); } }
/*
* Command Parser */ typedef struct { LPSTR pszCmd; int idCmd; } CMD;
CMD aCmds[] = { { "W", CMD_W95_TO_SUR }, { "Cvt-Curs", CMD_DAYTONA_CURSORS }, { "Fix-Curs", CMD_FIX_CURSOR_PATHS }, { "Fix-Folders", CMD_FIX_SPECIAL_FOLDERS}, { "Fix-Win-Security", CMD_FIX_WINDOWS_PROFILE_SECURITY}, { "Fix-User-Security", CMD_FIX_USER_PROFILE_SECURITY}, { "Fix-Policies-Security", CMD_FIX_POLICIES_SECURITY}, { "Cvt-Mouse-Schemes", CMD_CVT_SCHEMES_TO_MULTIUSER}, { "UpgradeProfileNT4ToNT5", CMD_UPGRADE_NT4_PROFILE_TO_NT5}, { "UpgradeSchemesAndNcMetricsToWin2000", CMD_UPGRADE_SCHEMES_AND_NCMETRICS_TO_WIN2000}, { "UpgradeSchemesAndNcMetricsFromWin9xToWin2000", CMD_UPGRADE_SCHEMES_AND_NCMETRICS_FROM_WIN9X_TO_WIN2000}, { "FixCAPIDirAttrib", CMD_FIX_CAPI_DIR_ATTRIBUTES}, { "MergeDesktopAndNormalStreams", CMD_MERGE_DESKTOP_AND_NORMAL_STREAMS }, { "MoveAndAdjustIconMetrics", CMD_MOVE_AND_ADJUST_ICON_METRICS }, { "Fix-HTML-Help", CMD_FIX_HTML_HELP }, { "Set-Screensaver-On-FriendlyUI", CMD_SET_SCREENSAVER_FRIENDLYUI }, { "OCInstallShowIE", CMD_OCINSTALL_SHOW_IE }, { "OCInstallReinstallIE", CMD_OCINSTALL_REINSTALL_IE }, { "OCInstallHideIE", CMD_OCINSTALL_HIDE_IE }, { "OCInstallUserConfigIE", CMD_OCINSTALL_USER_CONFIG_IE }, { "OCInstallShowOE", CMD_OCINSTALL_SHOW_OE }, { "OCInstallReinstallOE", CMD_OCINSTALL_REINSTALL_OE }, { "OCInstallHideOE", CMD_OCINSTALL_HIDE_OE }, { "OCInstallUserConfigOE", CMD_OCINSTALL_USER_CONFIG_OE }, // { "OCInstallShowVM", CMD_OCINSTALL_SHOW_VM },
{ "OCInstallReinstallVM", CMD_OCINSTALL_REINSTALL_VM }, // { "OCInstallHideVM", CMD_OCINSTALL_HIDE_VM },
{ "OCInstallFixup", CMD_OCINSTALL_FIXUP }, };
#define C_CMDS ARRAYSIZE(aCmds)
void __cdecl main( int cArgs, char **szArg) { int i; HRESULT hrOle = E_FAIL;
SHMGLogErrMsg("main called with args", (DWORD)cArgs);
if (cArgs < 2 || cArgs > 3) ExitProcess(1);
#ifdef SHMG_DBG
for(i=1; i<cArgs; i++) SHMGLogErrMsg(szArg[i], (DWORD)i); #endif
for( i = 0; i < C_CMDS && lstrcmpA( szArg[1], aCmds[i].pszCmd ) != 0; i++ );
if (i >= C_CMDS) ExitProcess(1);
if (aCmds[i].idCmd >= CMD_OLE_REQUIRED_START) { hrOle = OleInitialize(NULL);
if (FAILED(hrOle)) { ExitProcess(1); } }
switch( aCmds[i].idCmd ) {
case CMD_W95_TO_SUR: CvtDeskCPL_Win95ToSUR(); break;
case CMD_DAYTONA_CURSORS: CvtCursorsCPL_DaytonaToSUR(); break;
case CMD_FIX_CURSOR_PATHS: FixupCursorSchemePaths(); break;
case CMD_FIX_SPECIAL_FOLDERS: ResetUserSpecialFolderPaths(); break;
case CMD_FIX_WINDOWS_PROFILE_SECURITY: ASSERT(FALSE); // no longer supported
break;
case CMD_FIX_USER_PROFILE_SECURITY: FixUserProfileSecurity(); break;
case CMD_FIX_POLICIES_SECURITY: FixPoliciesSecurity(); break;
case CMD_CVT_SCHEMES_TO_MULTIUSER: CvtCursorSchemesToMultiuser(); break;
case CMD_UPGRADE_NT4_PROFILE_TO_NT5: MigrateNT4ToNT5(); break;
case CMD_UPGRADE_SCHEMES_AND_NCMETRICS_TO_WIN2000: UpgradeSchemesAndNcMetricsToWin2000(); break;
case CMD_UPGRADE_SCHEMES_AND_NCMETRICS_FROM_WIN9X_TO_WIN2000: UpgradeSchemesAndNcMetricsFromWin9xToWin2000(cArgs > 2 ? szArg[2] : NULL); break;
case CMD_FIX_CAPI_DIR_ATTRIBUTES: SetSystemBitOnCAPIDir(); break;
case CMD_MERGE_DESKTOP_AND_NORMAL_STREAMS: case CMD_MOVE_AND_ADJUST_ICON_METRICS: HandOffToShell32(szArg[1], cArgs > 2 ? szArg[2] : NULL); break;
case CMD_FIX_HTML_HELP: FixHtmlHelp(); break;
case CMD_SET_SCREENSAVER_FRIENDLYUI: SetScreensaverOnFriendlyUI(); break;
case CMD_OCINSTALL_FIXUP: FixupOptionalComponents(); break;
case CMD_OCINSTALL_SHOW_IE: ShowHideIE(TRUE, FALSE, TRUE); break; case CMD_OCINSTALL_REINSTALL_IE: ShowHideIE(TRUE, TRUE, TRUE); break; case CMD_OCINSTALL_HIDE_IE: ShowHideIE(FALSE, FALSE, TRUE); break; case CMD_OCINSTALL_USER_CONFIG_IE: UserConfigIE(); break; case CMD_OCINSTALL_SHOW_OE: ShowHideOE(TRUE, FALSE, TRUE); break; case CMD_OCINSTALL_REINSTALL_OE: ShowHideOE(TRUE, TRUE, TRUE); break; case CMD_OCINSTALL_HIDE_OE: ShowHideOE(FALSE, FALSE, TRUE); break; case CMD_OCINSTALL_USER_CONFIG_OE: UserConfigOE(); break; case CMD_OCINSTALL_SHOW_VM: // Do nothing...
break; case CMD_OCINSTALL_REINSTALL_VM: ReinstallVM(); break; case CMD_OCINSTALL_HIDE_VM: // Do nothing...
break;
default: ExitProcess(2); }
if (SUCCEEDED(hrOle)) { OleUninitialize(); }
ExitProcess(0); }
#ifdef SHMG_DBG
/***************************************************************************\
* * FUNCTION: FmtSprintf( DWORD id, ... ); * * PURPOSE: sprintf but it gets the pattern string from the message rc. * * History: * 03-May-1993 JonPa Created it. \***************************************************************************/ TCHAR g_szDbgBuffer[16384]; char g_szDbgBufA[16384]; void Dprintf( LPTSTR pszFmt, ... ) { DWORD cb; LPVOID psz = g_szDbgBuffer; va_list marker;
va_start( marker, pszFmt );
StringCchVPrintf(g_szDbgBuffer, ARRAYSIZE(g_szDbgBuffer), pszFmt, marker); OutputDebugString(g_szDbgBuffer);
#ifdef UNICODE
cb = WideCharToMultiByte(CP_ACP, 0, g_szDbgBuffer, -1, g_szDbgBufA, sizeof(g_szDbgBufA), NULL, NULL); psz = g_szDbgBufA; #else
cb = lstrlen(g_szDbgBuffer) * sizeof(TCHAR); #endif
WriteFile(GetStdHandle(STD_OUTPUT_HANDLE), psz, cb, &cb, NULL);
va_end( marker ); } #endif
|