windows-nt/Source/XPSP1/NT/com/ole32/olecnfg/main.c
2020-09-26 16:20:57 +08:00

375 lines
9.3 KiB
C

//
//
//
#include "olecnfg.h"
const char * GlobalKeyNames[] =
{
0,
"EnableDCOM",
"DefaultLaunchPermission",
"DefaultAccessPermission",
"LegacyAuthenticationLevel"
};
const char * ClsidKeyNames[] =
{
0,
"InprocHandler32",
"InprocServer32",
"LocalServer32",
"LocalService",
"RemoteServerName",
"RunAs",
"ActivateAtStorage",
"LaunchPermission",
"AccessPermission"
};
int ArgsLeft;
char ** Args;
HKEY hRegOle = 0;
HKEY hRegClsid = 0;
#define IsDigit(c) (IsCharAlphaNumeric(c) && !IsCharAlpha(c))
void __cdecl main(int argc, char **argv)
{
int GlobalKeys[GLOBAL_KEYS+1];
int Key;
int n;
DWORD Disposition;
long RegStatus;
memset( GlobalKeys, 0, sizeof(GlobalKeys) );
ArgsLeft = argc - 1;
Args = argv + 1;
if ( (argc > 1) &&
((strcmp( "/?", argv[1] ) == 0) || (strcmp( "-?", argv[1] ) == 0)) )
{
DisplayHelp();
return;
}
//
// With no arguments, display the global registry activation values.
//
if ( ArgsLeft == 0 )
{
DisplayGlobalSettings();
return;
}
//
// Look for specified global registry keys and operations
//
for ( ; ArgsLeft > 0; )
{
if ( _stricmp( *Args, "EnableDCOM" ) == 0 )
Key = ENABLE_NETWORK_OLE;
else if ( _stricmp( *Args, "DefaultLaunchPermission" ) == 0 )
Key = DEFAULT_LAUNCH_PERMISSION;
else if ( _stricmp( *Args, "DefaultAccessPermission" ) == 0 )
Key = DEFAULT_ACCESS_PERMISSION;
else if ( _stricmp( *Args, "LegacyAuthenticationLevel" ) == 0 )
Key = LEGACY_AUTHENTICATION_LEVEL;
else
break;
EAT_ARG();
if ( Key >= 100 )
{
if ( Key == MERGE )
{
MergeHives( );
}
else if ( Key == SAVE_USER )
{
SaveChangesToUser( );
}
else if ( Key == SAVE_COMMON )
{
SaveChangesToCommon( );
}
continue;
}
if ( Key == DEFAULT_ACCESS_PERMISSION )
{
GlobalKeys[Key] = YES;
continue;
}
if ( Key == LEGACY_AUTHENTICATION_LEVEL )
{
if ( ! IsDigit(**Args) || (**Args < '1') || (**Args > '6') )
{
printf( "LegacyAuthenticationLevel must be followed by a 1 to 6.\n" );
return;
}
GlobalKeys[Key] = **Args;
}
else if ( (GlobalKeys[Key] = ReadYesOrNo()) == INVALID )
{
printf( "%s must be followed by 'y' or 'n'\n", Args[-1] );
return;
}
EAT_ARG();
}
//
// Set global keys on or off.
//
for ( Key = 1; Key < sizeof(GlobalKeys)/sizeof(int); Key++ )
{
if ( (Key == LEGACY_AUTHENTICATION_LEVEL) && (GlobalKeys[Key] != 0) )
{
if ( ! SetGlobalKey( Key, GlobalKeys[Key] - '0' ) )
return;
continue;
}
if ( (GlobalKeys[Key] == YES) || (GlobalKeys[Key] == NO) )
if ( ! SetGlobalKey( Key, GlobalKeys[Key] ) )
return;
}
//
// Process any CLSID/ProgID specification.
//
ParseClsidProgId();
if ( hRegOle )
RegCloseKey( hRegOle );
if ( hRegClsid )
RegCloseKey( hRegClsid );
}
void ParseClsidProgId()
{
CLSID_INFO ClsidInfo;
BOOL NoKeys;
int ClsidKey;
if ( ArgsLeft == 0 )
return;
memset( &ClsidInfo, 0, sizeof(CLSID_INFO) );
NoKeys = TRUE;
if ( (ArgsLeft > 0) && (**Args != '{') )
{
ClsidInfo.ProgId = *Args;
EAT_ARG();
if ( (ArgsLeft > 0) &&
(**Args != '{') &&
(NextClsidKey() == UNKNOWN) )
{
ClsidInfo.ProgIdDescription = *Args;
EAT_ARG();
}
}
if ( (ArgsLeft > 0) && (**Args == '{') )
{
ClsidInfo.Clsid = *Args;
EAT_ARG();
if ( (ArgsLeft > 0) &&
(NextClsidKey() == UNKNOWN) )
{
ClsidInfo.ClsidDescription = *Args;
EAT_ARG();
}
}
for (; ArgsLeft > 0;)
{
ClsidKey = NextClsidKey();
if ( (1 <= ClsidKey) && (ClsidKey <= CLSID_KEYS) )
NoKeys = FALSE;
EAT_ARG();
switch ( ClsidKey )
{
case LAUNCH_PERMISSION :
if ( (ClsidInfo.LaunchPermission = ReadYesOrNo()) == INVALID )
{
printf( "%s must be followed by 'y' or 'n'\n",
ClsidKeyNames[LAUNCH_PERMISSION] );
goto ErrorReturn;
}
EAT_ARG();
break;
case ACCESS_PERMISSION :
ClsidInfo.AccessPermission = YES;
break;
case ACTIVATE_AT_STORAGE :
if ( (ClsidInfo.ActivateAtStorage = ReadYesOrNo()) == INVALID )
{
printf( "%s must be followed by 'y' or 'n'\n",
ClsidKeyNames[ACTIVATE_AT_STORAGE] );
goto ErrorReturn;
}
EAT_ARG();
break;
case INPROC_HANDLER32 :
case INPROC_SERVER32 :
case LOCAL_SERVER32 :
case LOCAL_SERVICE :
if ( NextClsidKey() == UNKNOWN )
{
ClsidInfo.ServerPaths[ClsidKey] = *Args;
EAT_ARG();
}
else
{
ClsidInfo.ServerPaths[ClsidKey] = "";
}
break;
case REMOTE_SERVER_NAME :
if ( NextClsidKey() == UNKNOWN )
{
ClsidInfo.RemoteServerName = *Args;
EAT_ARG();
}
else
{
ClsidInfo.RemoteServerName = "";
}
break;
case RUN_AS :
if ( NextClsidKey() == UNKNOWN )
{
ClsidInfo.RunAsUserName = *Args;
EAT_ARG();
if ( _stricmp(ClsidInfo.RunAsUserName,"Interactive User") == 0 )
break;
if ( _stricmp(ClsidInfo.RunAsUserName,"Interactive") == 0 )
{
if ( (ArgsLeft > 0) && (_stricmp(*Args,"User") == 0) )
{
EAT_ARG();
ClsidInfo.RunAsUserName = "Interactive User";
break;
}
}
if ( NextClsidKey() != UNKNOWN )
{
printf( "RunAs password or '*' must follow the user name.\n" );
goto ErrorReturn;
}
ClsidInfo.RunAsPassword = *Args;
EAT_ARG();
}
else
{
ClsidInfo.RunAsUserName = "";
}
break;
default :
printf( "Invalid CLSID/ProgID specification given (%s)\n", Args[-1] );
goto ErrorReturn;
break;
} // switch
} // for
//
// Display current CLSID/ProgID settings if no keys were specified and
// only a CLSID or ProgID (but not both) was given.
//
if ( NoKeys &&
(ClsidInfo.ProgIdDescription == 0) &&
(ClsidInfo.ClsidDescription == 0) &&
((ClsidInfo.Clsid == 0) || (ClsidInfo.ProgId == 0)) )
DisplayClsidKeys( &ClsidInfo );
else
UpdateClsidKeys( &ClsidInfo );
return;
ErrorReturn:
printf( "No CLSID/ProgID entries were modified\n" );
}
int NextClsidKey()
{
if ( ArgsLeft == 0 )
return END_OF_ARGS;
if ( _stricmp( *Args, "InprocHandler32" ) == 0 )
return INPROC_HANDLER32;
if ( _stricmp( *Args, "InprocServer32" ) == 0 )
return INPROC_SERVER32;
if ( _stricmp( *Args, "LocalServer32" ) == 0 )
return LOCAL_SERVER32;
if ( _stricmp( *Args, "LocalService" ) == 0 )
return LOCAL_SERVICE;
if ( _stricmp( *Args, "RemoteServerName" ) == 0 )
return REMOTE_SERVER_NAME;
if ( _stricmp( *Args, "RunAs" ) == 0 )
return RUN_AS;
if ( _stricmp( *Args, "ActivateAtStorage" ) == 0 )
return ACTIVATE_AT_STORAGE;
if ( _stricmp( *Args, "LaunchPermission" ) == 0 )
return LAUNCH_PERMISSION;
if ( _stricmp( *Args, "AccessPermission" ) == 0 )
return ACCESS_PERMISSION;
return UNKNOWN;
}
int ReadYesOrNo()
{
if ( ArgsLeft == 0 )
return INVALID;
if ( (char)CharUpperA((LPSTR)**Args) == 'Y' )
return YES;
if ( (char)CharUpperA((LPSTR)**Args) == 'N' )
return NO;
return INVALID;
}
void DisplayHelp()
{
puts( "\nolecnfg\n"
"\t[EnableDCOM <y,n>]\n"
"\t[DefaultLaunchPermission <y,n>]\n"
"\t[DefaultAccessPermission]\n"
"\t[LegacyAuthenticationLevel <1,2,3,4,5,6>]\n" );
puts( "\t[[ProgID [Description]] [CLSID [Description]]\n"
"\t\t[InprocHandler32 [Path]]\n"
"\t\t[InprocServer32 [Path]]\n"
"\t\t[LocalServer32 [Path]]\n"
"\t\t[LocalService [Path]]\n"
"\t\t[RemoteServerName [MachineName]]\n"
"\t\t[RunAs [UserName Password]] ]\n"
"\t\t[ActivateAtStorage <y,n>]\n"
"\t\t[LaunchPermission <y,n>]\n"
"\t\t[AccessPermission]\n"
"\t]\n" );
}