Source code of Windows XP (NT5)
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

245 lines
4.5 KiB

/*++
Copyright (c) 1997 Microsoft Corporation
Module Name:
main.cxx
Abstract:
Server Instance Controller.
Author:
Keith Moore (keithmo) 05-Feb-1997
Revision History:
--*/
#include "precomp.hxx"
#pragma hdrstop
//
// Private constants.
//
#define TEST_HRESULT(api,hr,fatal) \
if( FAILED(hr) ) { \
\
wprintf( \
L"%S:%lu failed, error %lx %S\n", \
(api), \
__LINE__, \
(result), \
(fatal) \
? "ABORTING" \
: "CONTINUING" \
); \
\
if( fatal ) { \
\
goto cleanup; \
\
} \
\
} else
//
// Private types.
//
//
// Private globals.
//
COMMAND_TABLE CommandTable[] =
{
{ L"Start", &StartCommand },
{ L"Stop", &StopCommand },
{ L"Pause", &PauseCommand },
{ L"Continue", &ContinueCommand },
{ L"Query", &QueryCommand }
};
#define NUM_COMMANDS ( sizeof(CommandTable) / sizeof(CommandTable[0]) )
//
// Private prototypes.
//
VOID
Usage(
VOID
);
//
// Public functions.
//
INT
__cdecl
wmain(
IN INT argc,
IN LPWSTR argv[]
)
{
HRESULT result;
ADMIN_SINK * sink;
IMSAdminBase * admCom;
DWORD i;
PCOMMAND_TABLE command;
//
// Setup locals so we know how to cleanup on exit.
//
admCom = NULL;
sink = NULL;
//
// Validate the arguments.
//
if( argc == 1 ) {
Usage();
return 1;
}
for( i = 0, command = CommandTable ;
i < NUM_COMMANDS ;
i++, command++ ) {
if( !_wcsicmp( argv[1], command->Name ) ) {
break;
}
}
if( i == NUM_COMMANDS ) {
Usage();
return 1;
}
argc -= 2; // Skip the program name...
argv += 2; // ...and the command name.
//
// Initialize COM.
//
result = CoInitializeEx(
NULL,
COINIT_MULTITHREADED
);
TEST_HRESULT( "CoInitializeEx()", result, TRUE );
//
// Get the admin object.
//
result = MdGetAdminObject( &admCom );
TEST_HRESULT( "MdGetAdminObject()", result, TRUE );
//
// Setup the advise sink.
//
sink = new ADMIN_SINK();
if( sink == NULL ) {
result = HRESULT_FROM_WIN32( ERROR_NOT_ENOUGH_MEMORY );
} else {
sink->AddRef();
result = sink->Initialize( (IUnknown *)admCom );
}
TEST_HRESULT( "sink->Initialize()", result, TRUE );
//
// Let the command handler do the dirty work.
//
command->Handler(
admCom,
sink,
argc,
argv
);
cleanup:
if( sink != NULL ) {
sink->Unadvise();
sink->Release();
}
//
// Release the admin object.
//
if( admCom != NULL ) {
result = MdReleaseAdminObject( admCom );
TEST_HRESULT( "MdReleaseAdminObject()", result, FALSE );
}
//
// Shutdown COM.
//
CoUninitialize();
return 0;
} // main
//
// Private functions.
//
VOID
Usage(
VOID
)
{
wprintf(
L"Use: iisnet operation service/instance\n"
L"\n"
L"Valid operations are:\n"
L"\n"
L" start\n"
L" stop\n"
L" pause\n"
L" continue\n"
L" query\n"
L"\n"
L"For example:\n"
L"\n"
L" iisnet pause w3svc/1\n"
);
} // Usage