xref: /aosp_15_r20/external/mdnsresponder/mDNSWindows/DLL/dllmain.c (revision 48a54d368dc4fa860885eef7b70b6c53499e7c25)
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