1*48a54d36SAndroid Build Coastguard Worker /* -*- Mode: C; tab-width: 4 -*-
2*48a54d36SAndroid Build Coastguard Worker *
3*48a54d36SAndroid Build Coastguard Worker * Copyright (c) 2004 Apple Computer, Inc. All rights reserved.
4*48a54d36SAndroid Build Coastguard Worker *
5*48a54d36SAndroid Build Coastguard Worker * Licensed under the Apache License, Version 2.0 (the "License");
6*48a54d36SAndroid Build Coastguard Worker * you may not use this file except in compliance with the License.
7*48a54d36SAndroid Build Coastguard Worker * You may obtain a copy of the License at
8*48a54d36SAndroid Build Coastguard Worker *
9*48a54d36SAndroid Build Coastguard Worker * http://www.apache.org/licenses/LICENSE-2.0
10*48a54d36SAndroid Build Coastguard Worker *
11*48a54d36SAndroid Build Coastguard Worker * Unless required by applicable law or agreed to in writing, software
12*48a54d36SAndroid Build Coastguard Worker * distributed under the License is distributed on an "AS IS" BASIS,
13*48a54d36SAndroid Build Coastguard Worker * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14*48a54d36SAndroid Build Coastguard Worker * See the License for the specific language governing permissions and
15*48a54d36SAndroid Build Coastguard Worker * limitations under the License.
16*48a54d36SAndroid Build Coastguard Worker */
17*48a54d36SAndroid Build Coastguard Worker
18*48a54d36SAndroid Build Coastguard Worker #include <windows.h>
19*48a54d36SAndroid Build Coastguard Worker #include <DebugServices.h>
20*48a54d36SAndroid Build Coastguard Worker
DllMain(HANDLE inModule,DWORD inReason,LPVOID inReserved)21*48a54d36SAndroid Build Coastguard Worker BOOL APIENTRY DllMain( HANDLE inModule, DWORD inReason, LPVOID inReserved )
22*48a54d36SAndroid Build Coastguard Worker {
23*48a54d36SAndroid Build Coastguard Worker (void) inModule;
24*48a54d36SAndroid Build Coastguard Worker (void) inReserved;
25*48a54d36SAndroid Build Coastguard Worker
26*48a54d36SAndroid Build Coastguard Worker switch( inReason )
27*48a54d36SAndroid Build Coastguard Worker {
28*48a54d36SAndroid Build Coastguard Worker case DLL_PROCESS_ATTACH:
29*48a54d36SAndroid Build Coastguard Worker case DLL_THREAD_ATTACH:
30*48a54d36SAndroid Build Coastguard Worker case DLL_THREAD_DETACH:
31*48a54d36SAndroid Build Coastguard Worker case DLL_PROCESS_DETACH:
32*48a54d36SAndroid Build Coastguard Worker break;
33*48a54d36SAndroid Build Coastguard Worker }
34*48a54d36SAndroid Build Coastguard Worker return( TRUE );
35*48a54d36SAndroid Build Coastguard Worker }
36*48a54d36SAndroid Build Coastguard Worker
37*48a54d36SAndroid Build Coastguard Worker
38*48a54d36SAndroid Build Coastguard Worker BOOL
IsSystemServiceDisabled()39*48a54d36SAndroid Build Coastguard Worker IsSystemServiceDisabled()
40*48a54d36SAndroid Build Coastguard Worker {
41*48a54d36SAndroid Build Coastguard Worker ENUM_SERVICE_STATUS * lpService = NULL;
42*48a54d36SAndroid Build Coastguard Worker SC_HANDLE sc;
43*48a54d36SAndroid Build Coastguard Worker BOOL ret = FALSE;
44*48a54d36SAndroid Build Coastguard Worker BOOL ok;
45*48a54d36SAndroid Build Coastguard Worker DWORD bytesNeeded = 0;
46*48a54d36SAndroid Build Coastguard Worker DWORD srvCount;
47*48a54d36SAndroid Build Coastguard Worker DWORD resumeHandle = 0;
48*48a54d36SAndroid Build Coastguard Worker DWORD srvType;
49*48a54d36SAndroid Build Coastguard Worker DWORD srvState;
50*48a54d36SAndroid Build Coastguard Worker DWORD dwBytes = 0;
51*48a54d36SAndroid Build Coastguard Worker DWORD i;
52*48a54d36SAndroid Build Coastguard Worker OSStatus err;
53*48a54d36SAndroid Build Coastguard Worker
54*48a54d36SAndroid Build Coastguard Worker sc = OpenSCManager( NULL, NULL, SC_MANAGER_ENUMERATE_SERVICE );
55*48a54d36SAndroid Build Coastguard Worker err = translate_errno( sc, GetLastError(), kUnknownErr );
56*48a54d36SAndroid Build Coastguard Worker require_noerr( err, exit );
57*48a54d36SAndroid Build Coastguard Worker
58*48a54d36SAndroid Build Coastguard Worker srvType = SERVICE_WIN32;
59*48a54d36SAndroid Build Coastguard Worker srvState = SERVICE_STATE_ALL;
60*48a54d36SAndroid Build Coastguard Worker
61*48a54d36SAndroid Build Coastguard Worker for ( ;; )
62*48a54d36SAndroid Build Coastguard Worker {
63*48a54d36SAndroid Build Coastguard Worker // Call EnumServicesStatus using the handle returned by OpenSCManager
64*48a54d36SAndroid Build Coastguard Worker
65*48a54d36SAndroid Build Coastguard Worker ok = EnumServicesStatus ( sc, srvType, srvState, lpService, dwBytes, &bytesNeeded, &srvCount, &resumeHandle );
66*48a54d36SAndroid Build Coastguard Worker
67*48a54d36SAndroid Build Coastguard Worker if ( ok || ( GetLastError() != ERROR_MORE_DATA ) )
68*48a54d36SAndroid Build Coastguard Worker {
69*48a54d36SAndroid Build Coastguard Worker break;
70*48a54d36SAndroid Build Coastguard Worker }
71*48a54d36SAndroid Build Coastguard Worker
72*48a54d36SAndroid Build Coastguard Worker if ( lpService )
73*48a54d36SAndroid Build Coastguard Worker {
74*48a54d36SAndroid Build Coastguard Worker free( lpService );
75*48a54d36SAndroid Build Coastguard Worker }
76*48a54d36SAndroid Build Coastguard Worker
77*48a54d36SAndroid Build Coastguard Worker dwBytes = bytesNeeded;
78*48a54d36SAndroid Build Coastguard Worker
79*48a54d36SAndroid Build Coastguard Worker lpService = ( ENUM_SERVICE_STATUS* ) malloc( dwBytes );
80*48a54d36SAndroid Build Coastguard Worker require_action( lpService, exit, ret = FALSE );
81*48a54d36SAndroid Build Coastguard Worker }
82*48a54d36SAndroid Build Coastguard Worker
83*48a54d36SAndroid Build Coastguard Worker err = translate_errno( ok, GetLastError(), kUnknownErr );
84*48a54d36SAndroid Build Coastguard Worker require_noerr( err, exit );
85*48a54d36SAndroid Build Coastguard Worker
86*48a54d36SAndroid Build Coastguard Worker for ( i = 0; i < srvCount; i++ )
87*48a54d36SAndroid Build Coastguard Worker {
88*48a54d36SAndroid Build Coastguard Worker if ( strcmp( lpService[i].lpServiceName, "Bonjour Service" ) == 0 )
89*48a54d36SAndroid Build Coastguard Worker {
90*48a54d36SAndroid Build Coastguard Worker if ( ( lpService[i].ServiceStatus.dwCurrentState == SERVICE_PAUSED ) || ( lpService[i].ServiceStatus.dwCurrentState == SERVICE_STOPPED ) )
91*48a54d36SAndroid Build Coastguard Worker {
92*48a54d36SAndroid Build Coastguard Worker ret = TRUE;
93*48a54d36SAndroid Build Coastguard Worker }
94*48a54d36SAndroid Build Coastguard Worker
95*48a54d36SAndroid Build Coastguard Worker break;
96*48a54d36SAndroid Build Coastguard Worker }
97*48a54d36SAndroid Build Coastguard Worker }
98*48a54d36SAndroid Build Coastguard Worker
99*48a54d36SAndroid Build Coastguard Worker exit:
100*48a54d36SAndroid Build Coastguard Worker
101*48a54d36SAndroid Build Coastguard Worker if ( lpService )
102*48a54d36SAndroid Build Coastguard Worker {
103*48a54d36SAndroid Build Coastguard Worker free( lpService );
104*48a54d36SAndroid Build Coastguard Worker }
105*48a54d36SAndroid Build Coastguard Worker
106*48a54d36SAndroid Build Coastguard Worker if ( sc )
107*48a54d36SAndroid Build Coastguard Worker {
108*48a54d36SAndroid Build Coastguard Worker CloseServiceHandle ( sc );
109*48a54d36SAndroid Build Coastguard Worker }
110*48a54d36SAndroid Build Coastguard Worker
111*48a54d36SAndroid Build Coastguard Worker return ret;
112*48a54d36SAndroid Build Coastguard Worker }
113