mirror of https://github.com/tongzx/nt5src
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
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
|
|
|