373 lines
7.1 KiB
C++
373 lines
7.1 KiB
C++
/*++
|
|
|
|
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;
|
|
|
|
}
|