/*++ 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 ); }