windows-nt/Source/XPSP1/NT/ds/security/tools/ksetup/main.cxx

373 lines
7.1 KiB
C++
Raw Permalink Normal View History

2020-09-26 03:20:57 -05:00
/*++
MAIN.CXX
Copyright (C) 1999 Microsoft Corporation, all rights reserved.
DESCRIPTION: main() for ksetup
Created, May 21, 1999 by DavidCHR.
--*/
#define EXTERN // nothing
#include "everything.hxx"
extern
CommandPair Commands[ ANYSIZE_ARRAY ];
extern
ULONG cCommands;
extern TestFunc DumpState;
extern NTSTATUS
OpenLsa( VOID ); // in support.cxx
BOOL
FindCommand( IN LPWSTR CommandName,
OUT PULONG pulCommandId ) {
ULONG iCommand;
for (iCommand = 0; iCommand < cCommands ; iCommand++ ) {
if ( 0 == lstrcmpi( CommandName,
Commands[iCommand].Name) ) {
// found the command.
DEBUGPRINT( DEBUG_OPTIONS,
( "Found %ws (command %ld)",
CommandName,
iCommand ) );
*pulCommandId = iCommand;
return TRUE;
}
}
printf( "%ws: no such argument.\n",
CommandName );
return FALSE;
}
BOOL
StoreArguments( IN ULONG iArg,
IN LPWSTR *argv,
OUT PULONG piArg,
IN OUT PAction pAction ) {
ULONG iCommand = pAction->CommandNumber;
PCommandPair pCommand = Commands + iCommand;
ULONG iParam = 0;
BOOL ret = TRUE;
BOOL KeepParsing = FALSE;
DEBUGPRINT( DEBUG_OPTIONS, ( "Building %ld-arg array.\n",
Commands[ iCommand ].Parameter ) );
if ( pCommand->Parameter != 0 ) {
/* this command has required parameters.
Copy them as we go. */
for ( iParam = 0;
ret && argv[ iArg ] && ( iParam < MAX_COMMANDS -1 );
iArg++, iParam ++ ) {
ASSERT( argv[ iArg ] != NULL );
DEBUGPRINT( DEBUG_OPTIONS,
( "Evaluating iParam=%ld, iArg=%ld, \"%ws\"\n",
iParam,
iArg,
argv[ iArg ] ) );
if ( argv[ iArg ][ 0 ] == L'/' ) {
// this parameter is a switch. We're done.
break;
}
// if we don't need any more arguments, don't consume this one.
if ( ( iParam > pCommand->Parameter ) &&
!( pCommand->flags & CAN_HAVE_MORE_ARGUMENTS ) ) {
printf( "%ws only takes %ld arguments.\n",
pCommand->Name,
pCommand->Parameter );
ret = FALSE;
break;
}
// at this point, the options are consumable.
pAction->Parameter[ iParam ] = argv[ iArg ];
DEBUGPRINT( DEBUG_OPTIONS,
( "%ws's arg %ld is %ws\n",
pCommand->Name,
iParam,
pAction->Parameter[ iParam ] ) );
} // for loop
if ( ret ) {
// left the loop without error
if ( ( iParam < pCommand->Parameter ) &&
!( pCommand->flags &
CAN_HAVE_FEWER_ARGUMENTS ) ) {
// too few options.
printf( "%ws requires %ld options (only %ld supplied).\n",
pCommand->Name,
pCommand->Parameter,
iParam );
ret = FALSE;
}
}
} // parameter count check.
if ( ret ) {
pAction->Parameter[ iParam ] = NULL; /* null-terminate
in all success cases. */
*piArg = iArg;
#if DBG
DEBUGPRINT( DEBUG_OPTIONS,
( "Leaving StoreOptions-- %ws with iArg=%ld. %ld args:\n",
pCommand->Name,
iArg,
iParam ));
for ( iParam = 0;
pAction->Parameter[ iParam ] != NULL ;
iParam++ ) {
DEBUGPRINT( DEBUG_OPTIONS,
( "arg %ld: %ws\n",
iParam,
pAction->Parameter[ iParam ] ) );
}
#endif
}
return ret;
}
/*++**************************************************************
NAME: main()
main() function, the primary entry point into the program.
When this function exits, the program exits.
TAKES: argc : count of string entries in argv
argv : array of space-delimited strings on the command line
RETURNS: the exit code (or errorlevel) for the process
CALLED BY: the system
FREE WITH: n/a
**************************************************************--*/
extern "C"
int __cdecl
wmain(ULONG argc,
LPWSTR argv[]) {
ULONG Command = 0;
ULONG iAction, iArg, iCommand, iParam ;
BOOLEAN Found;
NTSTATUS Status;
PAction Actions;
ULONG ActionCount = 0;
BOOL StuffToDo = FALSE; // used only for debugging
// GlobalDebugFlags = 0xFF;
// lazy way to do this.
Actions = (PAction) malloc( argc * sizeof( *Actions ) );
if ( !Actions ) {
printf( "Failed to allocate array.\n" );
return -1;
}
for (iArg = 1; iArg < argc ; ) // iArg++ )
{
Found = FALSE;
DEBUGPRINT( DEBUG_OPTIONS,
( "Searching for iArg=%ld, %ws..\n",
iArg,
argv[ iArg ] ) );
// first, find the command.
if ( FindCommand( argv[ iArg ],
&iCommand ) ) {
iArg++;
Actions[ActionCount].CommandNumber = iCommand;
if ( StoreArguments( iArg, // starting here
argv,
&iArg, // moves past last arg
&Actions[ ActionCount ] ) ) {
if ( Commands[iCommand].flags & DO_COMMAND_IMMEDIATELY ) {
DEBUGPRINT( DEBUG_LAUNCH,
( "Doing %ws immediately:\n",
Commands[ iCommand ].Name ) );
Status = Commands[iCommand].Function(
Actions[ActionCount].Parameter );
DEBUGPRINT( DEBUG_OPTIONS,
( "%ws returned 0x%x\n",
Commands[ iCommand ].Name,
Status ) );
if ( NT_SUCCESS( Status ) ) {
if ( Commands[ iCommand ].ConfirmationText ) {
printf( "NOTE: %ws %hs\n",
Commands[ iCommand ].Name,
Commands[ iCommand ].ConfirmationText );
}
} else {
printf( "%ws failed: 0x%x.\n",
Commands[iCommand].Name,
Status);
goto Cleanup;
}
} else {
// need to do this command later.
StuffToDo = TRUE;
ActionCount++;
}
} else { // StoreArgs
printf( "use %ws /? for help.\n",
argv[ 0 ] );
return -1;
}
} else {
printf( "use %ws /? for help.\n",
argv[ 0 ] );
return -1;
}
} // argument loop.
Status = OpenLsa();
if (!NT_SUCCESS(Status))
{
printf("Failed to open lsa: 0x%x\n",Status);
goto Cleanup;
}
if ( StuffToDo ) {
DEBUGPRINT( DEBUG_OPTIONS,
( "------------------ %hs -------------------\n",
"performing delayed actions now" ) );
}
for (iAction = 0; iAction < ActionCount ; iAction++ )
{
if (!( Commands[Actions[iAction].CommandNumber].flags &
DO_COMMAND_IMMEDIATELY ))
{
DEBUGPRINT( DEBUG_LAUNCH,
( "Doing %ws:\n",
Commands[ Actions[ iAction ].CommandNumber ].Name ) );
Status = Commands[Actions[iAction].CommandNumber].Function(
Actions[iAction].Parameter);
DEBUGPRINT( DEBUG_OPTIONS,
( "%ws: 0x%x\n",
Commands[ Actions[ iAction ].CommandNumber ].Name,
Status ) );
if (!NT_SUCCESS(Status))
{
printf("Failed %ws : 0x%x\n",
Commands[Actions[iAction].CommandNumber].Name,
Status);
goto Cleanup;
} else {
if ( Commands[ iCommand ].ConfirmationText ) {
printf( "NOTE: %ws %hs\n",
Commands[ iCommand ].Name,
Commands[ iCommand ].ConfirmationText );
}
}
}
}
if (ActionCount == 0)
{
DumpState(NULL);
}
Cleanup:
if (LsaHandle != NULL)
{
Status = LsaClose(LsaHandle);
if (!NT_SUCCESS(Status))
{
printf("Failed to close handle: 0x%x\n",Status);
}
}
return 0;
}