windows-nt/Source/XPSP1/NT/inetsrv/iis/ui/admin/pws/servcntr.cpp
2020-09-26 16:20:57 +08:00

209 lines
5.9 KiB
C++

// a small object to query and control the state of the w3 server
// created 4/14/97 BoydM
#include "stdafx.h"
#include "resource.h"
#include "ServCntr.h"
#include "mbobjs.h"
#include "pwsctrl.h"
#include <isvctrl.h>
#define SERVER_WINDOWCLASS_NAME INET_SERVER_WINDOW_CLASS
#define REGKEY_STP _T("SOFTWARE\\Microsoft\\INetStp")
#define REGKEY_INSTALLKEY _T("InstallPath")
extern BOOL g_fShutdownMode;
//------------------------------------------------------------------------
CW3ServerControl::CW3ServerControl()
{
OSVERSIONINFO info_os;
info_os.dwOSVersionInfoSize = sizeof(info_os);
// record what sort of operating system we are running on
m_fIsWinNT = FALSE;
if ( GetVersionEx( &info_os ) )
{
if ( info_os.dwPlatformId == VER_PLATFORM_WIN32_NT )
m_fIsWinNT = TRUE;
}
}
//------------------------------------------------------------------------
int CW3ServerControl::GetServerState()
{
CWrapMetaBase mb;
DWORD dw;
// if the service is totally shut down, return stopped
if ( g_fShutdownMode )
return MD_SERVER_STATE_STOPPED;
// see if inetinfo is running - win95 only
if ( !m_fIsWinNT && !IsInetinfoRunning() )
return MD_SERVER_STATE_STOPPED;
// init the mb object. If it fails then the server app is probably not running
if ( !mb.FInit() )
{
return MD_SERVER_STATE_STOPPED;
}
// open the metabase so we can get the current state
if ( !mb.Open(MB_SERVER_KEY_UPDATE) )
{
return MD_SERVER_STATE_STOPPED;
}
// get the server status flag
if ( !mb.GetDword( _T(""), MD_SERVER_STATE, IIS_MD_UT_SERVER, &dw ) )
{
DWORD err = GetLastError( );
if ( err == RPC_E_SERVERCALL_RETRYLATER )
{
mb.Close();
return STATE_TRY_AGAIN;
}
}
// close the metabase object
mb.Close();
// return the obtained state
return dw;
}
//------------------------------------------------------------------------
BOOL CW3ServerControl::SetServerState( DWORD dwControlCode )
{
CWrapMetaBase mb;
BOOL fSuccess = FALSE;
CString sz;
DWORD err;
// if the metabase doesn't init, then the app isn't running - lauch it
if ( !mb.FInit() )
return FALSE;
// open the metabase object
if ( !mb.Open(SZ_MB_INSTANCE_OBJECT, METADATA_PERMISSION_WRITE) )
{
err = GetLastError();
sz.LoadString( IDS_MetaError );
sz.Format( _T("%s\nError = %d"), sz, err );
AfxMessageBox( sz );
return FALSE;
}
// set the verb into the metabase
if ( !mb.SetDword( _T(""), MD_SERVER_COMMAND, IIS_MD_UT_SERVER, dwControlCode ) )
{
err = GetLastError();
sz.LoadString( IDS_MetaError );
sz.Format( _T("%s\nError = %d"), sz, err );
AfxMessageBox( sz );
}
else
fSuccess = TRUE;
// close the object
mb.Close();
// return the success flag
return fSuccess;
}
//------------------------------------------------------------------------
BOOL CW3ServerControl::StartServer( BOOL fOutputCommandLineInfo )
{
// just set the state in the metabase to do our thing
return SetServerState( MD_SERVER_COMMAND_START );
}
//------------------------------------------------------------------------
BOOL CW3ServerControl::W95LaunchInetInfo()
{
// start it
return W95StartW3SVC();
}
//------------------------------------------------------------------------
BOOL CW3ServerControl::StopServer( BOOL fOutputCommandLineInfo )
{
// just set the state in the metabase to do our thing
return SetServerState( MD_SERVER_COMMAND_STOP );
}
//------------------------------------------------------------------------
BOOL CW3ServerControl::PauseServer()
{
// note that inetinfo must be running for this to work
// in either case, we now just pause the server
return SetServerState( MD_SERVER_COMMAND_PAUSE );
}
//------------------------------------------------------------------------
BOOL CW3ServerControl::ContinueServer()
{
// note that inetinfo must be running for this to work
// in either case, we now just pause the server
return SetServerState( MD_SERVER_COMMAND_CONTINUE );
}
//------------------------------------------------------------------------
// get the inetinfo path
BOOL CW3ServerControl::GetServerDirectory( CString &sz )
{
HKEY hKey;
TCHAR chBuff[MAX_PATH+1];
DWORD err, type;
DWORD cbBuff;
// get the server install path from the registry
// open the registry key, if it exists
err = RegOpenKeyEx(
HKEY_LOCAL_MACHINE, // handle of open key
REGKEY_STP, // address of name of subkey to open
0, // reserved
KEY_READ, // security access mask
&hKey // address of handle of open key
);
// if we did not open the key for any reason (say... it doesn't exist)
// then leave right away
if ( err != ERROR_SUCCESS )
return FALSE;
cbBuff = sizeof(chBuff);
type = REG_SZ;
err = RegQueryValueEx(
hKey, // handle of key to query
REGKEY_INSTALLKEY, // address of name of value to query
NULL, // reserved
&type, // address of buffer for value type
(PUCHAR)chBuff, // address of data buffer
&cbBuff // address of data buffer size
);
// close the key
RegCloseKey( hKey );
// if we did get the key for any reason (say... it doesn't exist)
// then leave right away
if ( err != ERROR_SUCCESS )
return FALSE;
// set the string
sz = chBuff;
// success
return TRUE;
}