183 lines
3.7 KiB
C++
183 lines
3.7 KiB
C++
/*++
|
|
|
|
Copyright (c) 1997 Microsoft Corporation
|
|
© 1998 Seagate Software, Inc. All rights reserved
|
|
|
|
Module Name:
|
|
|
|
WsbSvc.cpp
|
|
|
|
Abstract:
|
|
|
|
This is the implementation of service helper functions.
|
|
|
|
Author:
|
|
|
|
Art Bragg 5/29/97
|
|
|
|
Revision History:
|
|
|
|
--*/
|
|
|
|
|
|
#include "stdafx.h"
|
|
#include "ntsecapi.h"
|
|
|
|
HRESULT
|
|
WsbCheckService(
|
|
IN const OLECHAR * Computer,
|
|
IN GUID GuidApp
|
|
)
|
|
/*++
|
|
|
|
Routine Description:
|
|
|
|
Arguments:
|
|
|
|
computer - NULL if local computer
|
|
guidApp - app id of the service to check.
|
|
|
|
|
|
Return Value:
|
|
|
|
S_OK - Success - service is running
|
|
S_FALSE - Success - service is not running
|
|
|
|
E_* - Problem occured, error passed down.
|
|
|
|
--*/
|
|
{
|
|
HRESULT hr = S_OK;
|
|
|
|
try {
|
|
|
|
//
|
|
// Get the service status
|
|
//
|
|
DWORD serviceState;
|
|
WsbAffirmHr( WsbGetServiceStatus( Computer, GuidApp, &serviceState ) );
|
|
|
|
//
|
|
// Is the service running?
|
|
//
|
|
if( SERVICE_RUNNING != serviceState ) WsbThrow( S_FALSE );
|
|
|
|
} WsbCatch( hr );
|
|
|
|
return( hr );
|
|
}
|
|
|
|
HRESULT
|
|
WsbGetServiceStatus(
|
|
IN const OLECHAR *Computer,
|
|
IN GUID GuidApp,
|
|
OUT DWORD *ServiceStatus
|
|
)
|
|
/*++
|
|
|
|
Routine Description:
|
|
|
|
Arguments:
|
|
|
|
Computer - NULL if local computer
|
|
GuidApp - app id of the service to check.
|
|
ServiceStatus - status of the service
|
|
|
|
|
|
Return Value:
|
|
|
|
S_OK - Success - service is running
|
|
S_FALSE - Success - service is not running
|
|
|
|
E_* - Problem occured, error passed down.
|
|
|
|
--*/
|
|
{
|
|
HRESULT hr = S_OK;
|
|
|
|
SC_HANDLE hSCM = 0;
|
|
SC_HANDLE hService = 0;
|
|
SERVICE_STATUS serviceStatusStruct;
|
|
try {
|
|
|
|
//
|
|
// Find the service in the registry
|
|
//
|
|
|
|
CWsbStringPtr regPath = L"SOFTWARE\\Classes\\AppID\\";
|
|
regPath.Append( CWsbStringPtr( GuidApp ) );
|
|
|
|
//
|
|
// Get the name of the service
|
|
//
|
|
|
|
OLECHAR serviceName[WSB_MAX_SERVICE_NAME];
|
|
WsbAffirmHr( WsbGetRegistryValueString( Computer, regPath, L"LocalService", serviceName, WSB_MAX_SERVICE_NAME, 0 ) );
|
|
|
|
//
|
|
// Setup the service to run under the account
|
|
//
|
|
|
|
hSCM = OpenSCManager( Computer, 0, GENERIC_READ );
|
|
WsbAffirmStatus( 0 != hSCM );
|
|
|
|
hService = OpenService( hSCM, serviceName, SERVICE_QUERY_STATUS );
|
|
WsbAffirmStatus( 0 != hService );
|
|
|
|
// Get the service status
|
|
WsbAffirmStatus( QueryServiceStatus( hService, &serviceStatusStruct ) );
|
|
|
|
*ServiceStatus = serviceStatusStruct.dwCurrentState;
|
|
|
|
} WsbCatch( hr );
|
|
|
|
if( hSCM ) CloseServiceHandle( hSCM );
|
|
if( hService ) CloseServiceHandle( hService );
|
|
|
|
return( hr );
|
|
}
|
|
|
|
HRESULT
|
|
WsbGetServiceName(
|
|
IN const OLECHAR *computer,
|
|
IN GUID guidApp,
|
|
IN DWORD cSize,
|
|
OUT OLECHAR *serviceName
|
|
)
|
|
/*++
|
|
|
|
Routine Description:
|
|
|
|
Arguments:
|
|
|
|
computer - NULL if local computer
|
|
guidApp - app id of the service whose name to get.
|
|
|
|
|
|
Return Value:
|
|
|
|
S_OK - Success
|
|
E_* - Problem occured, error passed down.
|
|
|
|
--*/
|
|
{
|
|
HRESULT hr = S_OK;
|
|
try {
|
|
|
|
//
|
|
// Find the service in the registry
|
|
//
|
|
|
|
CWsbStringPtr regPath = L"SOFTWARE\\Classes\\AppID\\";
|
|
regPath.Append( CWsbStringPtr( guidApp ) );
|
|
|
|
//
|
|
// Get the name of the service
|
|
//
|
|
|
|
WsbAffirmHr( WsbGetRegistryValueString( computer, regPath, L"LocalService", serviceName, cSize, 0 ) );
|
|
|
|
} WsbCatch( hr );
|
|
return( hr );
|
|
}
|