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.
113 lines
2.4 KiB
113 lines
2.4 KiB
/* -*- Mode: C; tab-width: 4 -*-
|
|
*
|
|
* Copyright (c) 2004 Apple Computer, Inc. All rights reserved.
|
|
*
|
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
* you may not use this file except in compliance with the License.
|
|
* You may obtain a copy of the License at
|
|
*
|
|
* http://www.apache.org/licenses/LICENSE-2.0
|
|
*
|
|
* Unless required by applicable law or agreed to in writing, software
|
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
* See the License for the specific language governing permissions and
|
|
* limitations under the License.
|
|
*/
|
|
|
|
#include <windows.h>
|
|
#include <DebugServices.h>
|
|
|
|
BOOL APIENTRY DllMain( HANDLE inModule, DWORD inReason, LPVOID inReserved )
|
|
{
|
|
(void) inModule;
|
|
(void) inReserved;
|
|
|
|
switch( inReason )
|
|
{
|
|
case DLL_PROCESS_ATTACH:
|
|
case DLL_THREAD_ATTACH:
|
|
case DLL_THREAD_DETACH:
|
|
case DLL_PROCESS_DETACH:
|
|
break;
|
|
}
|
|
return( TRUE );
|
|
}
|
|
|
|
|
|
BOOL
|
|
IsSystemServiceDisabled()
|
|
{
|
|
ENUM_SERVICE_STATUS * lpService = NULL;
|
|
SC_HANDLE sc;
|
|
BOOL ret = FALSE;
|
|
BOOL ok;
|
|
DWORD bytesNeeded = 0;
|
|
DWORD srvCount;
|
|
DWORD resumeHandle = 0;
|
|
DWORD srvType;
|
|
DWORD srvState;
|
|
DWORD dwBytes = 0;
|
|
DWORD i;
|
|
OSStatus err;
|
|
|
|
sc = OpenSCManager( NULL, NULL, SC_MANAGER_ENUMERATE_SERVICE );
|
|
err = translate_errno( sc, GetLastError(), kUnknownErr );
|
|
require_noerr( err, exit );
|
|
|
|
srvType = SERVICE_WIN32;
|
|
srvState = SERVICE_STATE_ALL;
|
|
|
|
for ( ;; )
|
|
{
|
|
// Call EnumServicesStatus using the handle returned by OpenSCManager
|
|
|
|
ok = EnumServicesStatus ( sc, srvType, srvState, lpService, dwBytes, &bytesNeeded, &srvCount, &resumeHandle );
|
|
|
|
if ( ok || ( GetLastError() != ERROR_MORE_DATA ) )
|
|
{
|
|
break;
|
|
}
|
|
|
|
if ( lpService )
|
|
{
|
|
free( lpService );
|
|
}
|
|
|
|
dwBytes = bytesNeeded;
|
|
|
|
lpService = ( ENUM_SERVICE_STATUS* ) malloc( dwBytes );
|
|
require_action( lpService, exit, ret = FALSE );
|
|
}
|
|
|
|
err = translate_errno( ok, GetLastError(), kUnknownErr );
|
|
require_noerr( err, exit );
|
|
|
|
for ( i = 0; i < srvCount; i++ )
|
|
{
|
|
if ( strcmp( lpService[i].lpServiceName, "Bonjour Service" ) == 0 )
|
|
{
|
|
if ( ( lpService[i].ServiceStatus.dwCurrentState == SERVICE_PAUSED ) || ( lpService[i].ServiceStatus.dwCurrentState == SERVICE_STOPPED ) )
|
|
{
|
|
ret = TRUE;
|
|
}
|
|
|
|
break;
|
|
}
|
|
}
|
|
|
|
exit:
|
|
|
|
if ( lpService )
|
|
{
|
|
free( lpService );
|
|
}
|
|
|
|
if ( sc )
|
|
{
|
|
CloseServiceHandle ( sc );
|
|
}
|
|
|
|
return ret;
|
|
}
|