windows-nt/Source/XPSP1/NT/base/fs/hsm/wsb/wsbsvc.cpp
2020-09-26 16:20:57 +08:00

183 lines
3.5 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 );
}