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