xref: /aosp_15_r20/external/mdnsresponder/mDNSWindows/SystemService/Firewall.cpp (revision 48a54d368dc4fa860885eef7b70b6c53499e7c25)
1*48a54d36SAndroid Build Coastguard Worker /* -*- Mode: C; tab-width: 4 -*-
2*48a54d36SAndroid Build Coastguard Worker  *
3*48a54d36SAndroid Build Coastguard Worker  * Copyright (c) 2003-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 // <rdar://problem/4278931> Doesn't compile correctly with latest Platform SDK
19*48a54d36SAndroid Build Coastguard Worker 
20*48a54d36SAndroid Build Coastguard Worker #if !defined(_WIN32_DCOM)
21*48a54d36SAndroid Build Coastguard Worker #	define _WIN32_DCOM
22*48a54d36SAndroid Build Coastguard Worker #endif
23*48a54d36SAndroid Build Coastguard Worker 
24*48a54d36SAndroid Build Coastguard Worker 
25*48a54d36SAndroid Build Coastguard Worker #include "Firewall.h"
26*48a54d36SAndroid Build Coastguard Worker #include <windows.h>
27*48a54d36SAndroid Build Coastguard Worker #include <crtdbg.h>
28*48a54d36SAndroid Build Coastguard Worker #include <netfw.h>
29*48a54d36SAndroid Build Coastguard Worker #include <objbase.h>
30*48a54d36SAndroid Build Coastguard Worker #include <oleauto.h>
31*48a54d36SAndroid Build Coastguard Worker 
32*48a54d36SAndroid Build Coastguard Worker 
33*48a54d36SAndroid Build Coastguard Worker static const int kMaxTries			= 30;
34*48a54d36SAndroid Build Coastguard Worker static const int kRetrySleepPeriod	= 1 * 1000; // 1 second
35*48a54d36SAndroid Build Coastguard Worker 
36*48a54d36SAndroid Build Coastguard Worker 
37*48a54d36SAndroid Build Coastguard Worker static OSStatus
mDNSFirewallInitialize(OUT INetFwProfile ** fwProfile)38*48a54d36SAndroid Build Coastguard Worker mDNSFirewallInitialize(OUT INetFwProfile ** fwProfile)
39*48a54d36SAndroid Build Coastguard Worker {
40*48a54d36SAndroid Build Coastguard Worker 	INetFwMgr		*	fwMgr		= NULL;
41*48a54d36SAndroid Build Coastguard Worker 	INetFwPolicy	*	fwPolicy	= NULL;
42*48a54d36SAndroid Build Coastguard Worker 	int					numRetries	= 0;
43*48a54d36SAndroid Build Coastguard Worker 	HRESULT				err			= kNoErr;
44*48a54d36SAndroid Build Coastguard Worker 
45*48a54d36SAndroid Build Coastguard Worker 	_ASSERT(fwProfile != NULL);
46*48a54d36SAndroid Build Coastguard Worker 
47*48a54d36SAndroid Build Coastguard Worker     *fwProfile = NULL;
48*48a54d36SAndroid Build Coastguard Worker 
49*48a54d36SAndroid Build Coastguard Worker 	// Use COM to get a reference to the firewall settings manager.  This
50*48a54d36SAndroid Build Coastguard Worker 	// call will fail on anything other than XP SP2
51*48a54d36SAndroid Build Coastguard Worker 
52*48a54d36SAndroid Build Coastguard Worker 	err = CoCreateInstance( __uuidof(NetFwMgr), NULL, CLSCTX_INPROC_SERVER, __uuidof(INetFwMgr), (void**)&fwMgr );
53*48a54d36SAndroid Build Coastguard Worker 	require(SUCCEEDED(err) && ( fwMgr != NULL ), exit);
54*48a54d36SAndroid Build Coastguard Worker 
55*48a54d36SAndroid Build Coastguard Worker 	// Use the reference to get the local firewall policy
56*48a54d36SAndroid Build Coastguard Worker 
57*48a54d36SAndroid Build Coastguard Worker 	err = fwMgr->get_LocalPolicy(&fwPolicy);
58*48a54d36SAndroid Build Coastguard Worker 	require(SUCCEEDED(err) && ( fwPolicy != NULL ), exit);
59*48a54d36SAndroid Build Coastguard Worker 
60*48a54d36SAndroid Build Coastguard Worker 	// Use the reference to get the extant profile. Empirical evidence
61*48a54d36SAndroid Build Coastguard Worker 	// suggests that there is the potential for a race condition when a system
62*48a54d36SAndroid Build Coastguard Worker 	// service whose startup type is automatic calls this method.
63*48a54d36SAndroid Build Coastguard Worker 	// This is true even when the service declares itself to be dependent
64*48a54d36SAndroid Build Coastguard Worker 	// on the firewall service. Re-trying the method will succeed within
65*48a54d36SAndroid Build Coastguard Worker 	// a few seconds.
66*48a54d36SAndroid Build Coastguard Worker 
67*48a54d36SAndroid Build Coastguard Worker 	do
68*48a54d36SAndroid Build Coastguard Worker 	{
69*48a54d36SAndroid Build Coastguard Worker     	err = fwPolicy->get_CurrentProfile(fwProfile);
70*48a54d36SAndroid Build Coastguard Worker 
71*48a54d36SAndroid Build Coastguard Worker 		if (err)
72*48a54d36SAndroid Build Coastguard Worker 		{
73*48a54d36SAndroid Build Coastguard Worker 			Sleep(kRetrySleepPeriod);
74*48a54d36SAndroid Build Coastguard Worker 		}
75*48a54d36SAndroid Build Coastguard Worker 	}
76*48a54d36SAndroid Build Coastguard Worker 	while (err && (numRetries++ < kMaxTries));
77*48a54d36SAndroid Build Coastguard Worker 
78*48a54d36SAndroid Build Coastguard Worker 	require(SUCCEEDED(err), exit);
79*48a54d36SAndroid Build Coastguard Worker 
80*48a54d36SAndroid Build Coastguard Worker 	err = kNoErr;
81*48a54d36SAndroid Build Coastguard Worker 
82*48a54d36SAndroid Build Coastguard Worker exit:
83*48a54d36SAndroid Build Coastguard Worker 
84*48a54d36SAndroid Build Coastguard Worker 	// Release temporary COM objects
85*48a54d36SAndroid Build Coastguard Worker 
86*48a54d36SAndroid Build Coastguard Worker     if (fwPolicy != NULL)
87*48a54d36SAndroid Build Coastguard Worker     {
88*48a54d36SAndroid Build Coastguard Worker         fwPolicy->Release();
89*48a54d36SAndroid Build Coastguard Worker     }
90*48a54d36SAndroid Build Coastguard Worker 
91*48a54d36SAndroid Build Coastguard Worker     if (fwMgr != NULL)
92*48a54d36SAndroid Build Coastguard Worker     {
93*48a54d36SAndroid Build Coastguard Worker         fwMgr->Release();
94*48a54d36SAndroid Build Coastguard Worker     }
95*48a54d36SAndroid Build Coastguard Worker 
96*48a54d36SAndroid Build Coastguard Worker     return err;
97*48a54d36SAndroid Build Coastguard Worker }
98*48a54d36SAndroid Build Coastguard Worker 
99*48a54d36SAndroid Build Coastguard Worker 
100*48a54d36SAndroid Build Coastguard Worker static void
mDNSFirewallCleanup(IN INetFwProfile * fwProfile)101*48a54d36SAndroid Build Coastguard Worker mDNSFirewallCleanup
102*48a54d36SAndroid Build Coastguard Worker 			(
103*48a54d36SAndroid Build Coastguard Worker 			IN INetFwProfile	*	fwProfile
104*48a54d36SAndroid Build Coastguard Worker 			)
105*48a54d36SAndroid Build Coastguard Worker {
106*48a54d36SAndroid Build Coastguard Worker 	// Call Release on the COM reference.
107*48a54d36SAndroid Build Coastguard Worker 
108*48a54d36SAndroid Build Coastguard Worker     if (fwProfile != NULL)
109*48a54d36SAndroid Build Coastguard Worker     {
110*48a54d36SAndroid Build Coastguard Worker         fwProfile->Release();
111*48a54d36SAndroid Build Coastguard Worker     }
112*48a54d36SAndroid Build Coastguard Worker }
113*48a54d36SAndroid Build Coastguard Worker 
114*48a54d36SAndroid Build Coastguard Worker 
115*48a54d36SAndroid Build Coastguard Worker static OSStatus
mDNSFirewallAppIsEnabled(IN INetFwProfile * fwProfile,IN const wchar_t * fwProcessImageFileName,OUT BOOL * fwAppEnabled)116*48a54d36SAndroid Build Coastguard Worker mDNSFirewallAppIsEnabled
117*48a54d36SAndroid Build Coastguard Worker 			(
118*48a54d36SAndroid Build Coastguard Worker 			IN INetFwProfile	*	fwProfile,
119*48a54d36SAndroid Build Coastguard Worker 			IN const wchar_t	*	fwProcessImageFileName,
120*48a54d36SAndroid Build Coastguard Worker 			OUT BOOL			*	fwAppEnabled
121*48a54d36SAndroid Build Coastguard Worker 			)
122*48a54d36SAndroid Build Coastguard Worker {
123*48a54d36SAndroid Build Coastguard Worker 	BSTR							fwBstrProcessImageFileName = NULL;
124*48a54d36SAndroid Build Coastguard Worker 	VARIANT_BOOL					fwEnabled;
125*48a54d36SAndroid Build Coastguard Worker 	INetFwAuthorizedApplication	*	fwApp	= NULL;
126*48a54d36SAndroid Build Coastguard Worker 	INetFwAuthorizedApplications*	fwApps	= NULL;
127*48a54d36SAndroid Build Coastguard Worker 	OSStatus						err		= kNoErr;
128*48a54d36SAndroid Build Coastguard Worker 
129*48a54d36SAndroid Build Coastguard Worker 	_ASSERT(fwProfile != NULL);
130*48a54d36SAndroid Build Coastguard Worker 	_ASSERT(fwProcessImageFileName != NULL);
131*48a54d36SAndroid Build Coastguard Worker 	_ASSERT(fwAppEnabled != NULL);
132*48a54d36SAndroid Build Coastguard Worker 
133*48a54d36SAndroid Build Coastguard Worker     *fwAppEnabled = FALSE;
134*48a54d36SAndroid Build Coastguard Worker 
135*48a54d36SAndroid Build Coastguard Worker 	// Get the list of authorized applications
136*48a54d36SAndroid Build Coastguard Worker 
137*48a54d36SAndroid Build Coastguard Worker 	err = fwProfile->get_AuthorizedApplications(&fwApps);
138*48a54d36SAndroid Build Coastguard Worker 	require(SUCCEEDED(err) && ( fwApps != NULL ), exit);
139*48a54d36SAndroid Build Coastguard Worker 
140*48a54d36SAndroid Build Coastguard Worker     fwBstrProcessImageFileName = SysAllocString(fwProcessImageFileName);
141*48a54d36SAndroid Build Coastguard Worker 	require_action( ( fwProcessImageFileName != NULL ) && ( SysStringLen(fwBstrProcessImageFileName) > 0 ), exit, err = kNoMemoryErr);
142*48a54d36SAndroid Build Coastguard Worker 
143*48a54d36SAndroid Build Coastguard Worker 	// Look for us
144*48a54d36SAndroid Build Coastguard Worker 
145*48a54d36SAndroid Build Coastguard Worker     err = fwApps->Item(fwBstrProcessImageFileName, &fwApp);
146*48a54d36SAndroid Build Coastguard Worker 
147*48a54d36SAndroid Build Coastguard Worker     if (SUCCEEDED(err) && ( fwApp != NULL ) )
148*48a54d36SAndroid Build Coastguard Worker     {
149*48a54d36SAndroid Build Coastguard Worker         // It's listed, but is it enabled?
150*48a54d36SAndroid Build Coastguard Worker 
151*48a54d36SAndroid Build Coastguard Worker 		err = fwApp->get_Enabled(&fwEnabled);
152*48a54d36SAndroid Build Coastguard Worker 		require(SUCCEEDED(err), exit);
153*48a54d36SAndroid Build Coastguard Worker 
154*48a54d36SAndroid Build Coastguard Worker         if (fwEnabled != VARIANT_FALSE)
155*48a54d36SAndroid Build Coastguard Worker         {
156*48a54d36SAndroid Build Coastguard Worker 			// Yes, it's enabled
157*48a54d36SAndroid Build Coastguard Worker 
158*48a54d36SAndroid Build Coastguard Worker             *fwAppEnabled = TRUE;
159*48a54d36SAndroid Build Coastguard Worker 		}
160*48a54d36SAndroid Build Coastguard Worker 	}
161*48a54d36SAndroid Build Coastguard Worker 
162*48a54d36SAndroid Build Coastguard Worker 	err = kNoErr;
163*48a54d36SAndroid Build Coastguard Worker 
164*48a54d36SAndroid Build Coastguard Worker exit:
165*48a54d36SAndroid Build Coastguard Worker 
166*48a54d36SAndroid Build Coastguard Worker 	// Deallocate the BSTR
167*48a54d36SAndroid Build Coastguard Worker 
168*48a54d36SAndroid Build Coastguard Worker 	if ( fwBstrProcessImageFileName != NULL )
169*48a54d36SAndroid Build Coastguard Worker 	{
170*48a54d36SAndroid Build Coastguard Worker 		SysFreeString(fwBstrProcessImageFileName);
171*48a54d36SAndroid Build Coastguard Worker 	}
172*48a54d36SAndroid Build Coastguard Worker 
173*48a54d36SAndroid Build Coastguard Worker 	// Release the COM objects
174*48a54d36SAndroid Build Coastguard Worker 
175*48a54d36SAndroid Build Coastguard Worker     if (fwApp != NULL)
176*48a54d36SAndroid Build Coastguard Worker     {
177*48a54d36SAndroid Build Coastguard Worker         fwApp->Release();
178*48a54d36SAndroid Build Coastguard Worker     }
179*48a54d36SAndroid Build Coastguard Worker 
180*48a54d36SAndroid Build Coastguard Worker     if (fwApps != NULL)
181*48a54d36SAndroid Build Coastguard Worker     {
182*48a54d36SAndroid Build Coastguard Worker         fwApps->Release();
183*48a54d36SAndroid Build Coastguard Worker     }
184*48a54d36SAndroid Build Coastguard Worker 
185*48a54d36SAndroid Build Coastguard Worker     return err;
186*48a54d36SAndroid Build Coastguard Worker }
187*48a54d36SAndroid Build Coastguard Worker 
188*48a54d36SAndroid Build Coastguard Worker 
189*48a54d36SAndroid Build Coastguard Worker static OSStatus
mDNSFirewallAddApp(IN INetFwProfile * fwProfile,IN const wchar_t * fwProcessImageFileName,IN const wchar_t * fwName)190*48a54d36SAndroid Build Coastguard Worker mDNSFirewallAddApp
191*48a54d36SAndroid Build Coastguard Worker 			(
192*48a54d36SAndroid Build Coastguard Worker             IN INetFwProfile	*	fwProfile,
193*48a54d36SAndroid Build Coastguard Worker             IN const wchar_t	*	fwProcessImageFileName,
194*48a54d36SAndroid Build Coastguard Worker             IN const wchar_t	*	fwName
195*48a54d36SAndroid Build Coastguard Worker             )
196*48a54d36SAndroid Build Coastguard Worker {
197*48a54d36SAndroid Build Coastguard Worker 	BOOL							fwAppEnabled;
198*48a54d36SAndroid Build Coastguard Worker 	BSTR							fwBstrName = NULL;
199*48a54d36SAndroid Build Coastguard Worker 	BSTR							fwBstrProcessImageFileName = NULL;
200*48a54d36SAndroid Build Coastguard Worker 	INetFwAuthorizedApplication	*	fwApp = NULL;
201*48a54d36SAndroid Build Coastguard Worker 	INetFwAuthorizedApplications*	fwApps = NULL;
202*48a54d36SAndroid Build Coastguard Worker 	OSStatus						err = S_OK;
203*48a54d36SAndroid Build Coastguard Worker 
204*48a54d36SAndroid Build Coastguard Worker 	_ASSERT(fwProfile != NULL);
205*48a54d36SAndroid Build Coastguard Worker     _ASSERT(fwProcessImageFileName != NULL);
206*48a54d36SAndroid Build Coastguard Worker     _ASSERT(fwName != NULL);
207*48a54d36SAndroid Build Coastguard Worker 
208*48a54d36SAndroid Build Coastguard Worker     // First check to see if the application is already authorized.
209*48a54d36SAndroid Build Coastguard Worker 	err = mDNSFirewallAppIsEnabled( fwProfile, fwProcessImageFileName, &fwAppEnabled );
210*48a54d36SAndroid Build Coastguard Worker 	require_noerr(err, exit);
211*48a54d36SAndroid Build Coastguard Worker 
212*48a54d36SAndroid Build Coastguard Worker 	// Only add the application if it isn't enabled
213*48a54d36SAndroid Build Coastguard Worker 
214*48a54d36SAndroid Build Coastguard Worker 	if (!fwAppEnabled)
215*48a54d36SAndroid Build Coastguard Worker 	{
216*48a54d36SAndroid Build Coastguard Worker 		// Get the list of authorized applications
217*48a54d36SAndroid Build Coastguard Worker 
218*48a54d36SAndroid Build Coastguard Worker         err = fwProfile->get_AuthorizedApplications(&fwApps);
219*48a54d36SAndroid Build Coastguard Worker 		require(SUCCEEDED(err) && ( fwApps != NULL ), exit);
220*48a54d36SAndroid Build Coastguard Worker 
221*48a54d36SAndroid Build Coastguard Worker         // Create an instance of an authorized application.
222*48a54d36SAndroid Build Coastguard Worker 
223*48a54d36SAndroid Build Coastguard Worker 		err = CoCreateInstance( __uuidof(NetFwAuthorizedApplication), NULL, CLSCTX_INPROC_SERVER, __uuidof(INetFwAuthorizedApplication), (void**)&fwApp );
224*48a54d36SAndroid Build Coastguard Worker 		require(SUCCEEDED(err) && ( fwApp != NULL ), exit);
225*48a54d36SAndroid Build Coastguard Worker 
226*48a54d36SAndroid Build Coastguard Worker         fwBstrProcessImageFileName = SysAllocString(fwProcessImageFileName);
227*48a54d36SAndroid Build Coastguard Worker 		require_action(( fwProcessImageFileName != NULL ) && ( SysStringLen(fwBstrProcessImageFileName) > 0 ), exit, err = kNoMemoryErr);
228*48a54d36SAndroid Build Coastguard Worker 
229*48a54d36SAndroid Build Coastguard Worker 		// Set the executable file name
230*48a54d36SAndroid Build Coastguard Worker 
231*48a54d36SAndroid Build Coastguard Worker 		err = fwApp->put_ProcessImageFileName(fwBstrProcessImageFileName);
232*48a54d36SAndroid Build Coastguard Worker 		require(SUCCEEDED(err), exit);
233*48a54d36SAndroid Build Coastguard Worker 
234*48a54d36SAndroid Build Coastguard Worker 		fwBstrName = SysAllocString(fwName);
235*48a54d36SAndroid Build Coastguard Worker 		require_action( ( fwBstrName != NULL ) && ( SysStringLen(fwBstrName) > 0 ), exit, err = kNoMemoryErr);
236*48a54d36SAndroid Build Coastguard Worker 
237*48a54d36SAndroid Build Coastguard Worker 		// Set the friendly name
238*48a54d36SAndroid Build Coastguard Worker 
239*48a54d36SAndroid Build Coastguard Worker         err = fwApp->put_Name(fwBstrName);
240*48a54d36SAndroid Build Coastguard Worker 		require(SUCCEEDED(err), exit);
241*48a54d36SAndroid Build Coastguard Worker 
242*48a54d36SAndroid Build Coastguard Worker 		// Now add the application
243*48a54d36SAndroid Build Coastguard Worker 
244*48a54d36SAndroid Build Coastguard Worker         err = fwApps->Add(fwApp);
245*48a54d36SAndroid Build Coastguard Worker 		require(SUCCEEDED(err), exit);
246*48a54d36SAndroid Build Coastguard Worker 	}
247*48a54d36SAndroid Build Coastguard Worker 
248*48a54d36SAndroid Build Coastguard Worker 	err = kNoErr;
249*48a54d36SAndroid Build Coastguard Worker 
250*48a54d36SAndroid Build Coastguard Worker exit:
251*48a54d36SAndroid Build Coastguard Worker 
252*48a54d36SAndroid Build Coastguard Worker 	// Deallocate the BSTR objects
253*48a54d36SAndroid Build Coastguard Worker 
254*48a54d36SAndroid Build Coastguard Worker 	if ( fwBstrName != NULL )
255*48a54d36SAndroid Build Coastguard Worker 	{
256*48a54d36SAndroid Build Coastguard Worker 		SysFreeString(fwBstrName);
257*48a54d36SAndroid Build Coastguard Worker 	}
258*48a54d36SAndroid Build Coastguard Worker 
259*48a54d36SAndroid Build Coastguard Worker 	if ( fwBstrProcessImageFileName != NULL )
260*48a54d36SAndroid Build Coastguard Worker 	{
261*48a54d36SAndroid Build Coastguard Worker 		SysFreeString(fwBstrProcessImageFileName);
262*48a54d36SAndroid Build Coastguard Worker 	}
263*48a54d36SAndroid Build Coastguard Worker 
264*48a54d36SAndroid Build Coastguard Worker     // Release the COM objects
265*48a54d36SAndroid Build Coastguard Worker 
266*48a54d36SAndroid Build Coastguard Worker     if (fwApp != NULL)
267*48a54d36SAndroid Build Coastguard Worker     {
268*48a54d36SAndroid Build Coastguard Worker         fwApp->Release();
269*48a54d36SAndroid Build Coastguard Worker     }
270*48a54d36SAndroid Build Coastguard Worker 
271*48a54d36SAndroid Build Coastguard Worker     if (fwApps != NULL)
272*48a54d36SAndroid Build Coastguard Worker     {
273*48a54d36SAndroid Build Coastguard Worker         fwApps->Release();
274*48a54d36SAndroid Build Coastguard Worker     }
275*48a54d36SAndroid Build Coastguard Worker 
276*48a54d36SAndroid Build Coastguard Worker     return err;
277*48a54d36SAndroid Build Coastguard Worker }
278*48a54d36SAndroid Build Coastguard Worker 
279*48a54d36SAndroid Build Coastguard Worker 
280*48a54d36SAndroid Build Coastguard Worker 
281*48a54d36SAndroid Build Coastguard Worker 
282*48a54d36SAndroid Build Coastguard Worker 
283*48a54d36SAndroid Build Coastguard Worker static OSStatus
284*48a54d36SAndroid Build Coastguard Worker 
mDNSFirewallIsFileAndPrintSharingEnabled(IN INetFwProfile * fwProfile,OUT BOOL * fwServiceEnabled)285*48a54d36SAndroid Build Coastguard Worker mDNSFirewallIsFileAndPrintSharingEnabled
286*48a54d36SAndroid Build Coastguard Worker 
287*48a54d36SAndroid Build Coastguard Worker 	(
288*48a54d36SAndroid Build Coastguard Worker 
289*48a54d36SAndroid Build Coastguard Worker 	IN INetFwProfile	* fwProfile,
290*48a54d36SAndroid Build Coastguard Worker 
291*48a54d36SAndroid Build Coastguard Worker 	OUT BOOL			* fwServiceEnabled
292*48a54d36SAndroid Build Coastguard Worker 
293*48a54d36SAndroid Build Coastguard Worker 	)
294*48a54d36SAndroid Build Coastguard Worker 
295*48a54d36SAndroid Build Coastguard Worker {
296*48a54d36SAndroid Build Coastguard Worker 
297*48a54d36SAndroid Build Coastguard Worker     VARIANT_BOOL fwEnabled;
298*48a54d36SAndroid Build Coastguard Worker 
299*48a54d36SAndroid Build Coastguard Worker     INetFwService* fwService = NULL;
300*48a54d36SAndroid Build Coastguard Worker 
301*48a54d36SAndroid Build Coastguard Worker     INetFwServices* fwServices = NULL;
302*48a54d36SAndroid Build Coastguard Worker 
303*48a54d36SAndroid Build Coastguard Worker 	OSStatus err = S_OK;
304*48a54d36SAndroid Build Coastguard Worker 
305*48a54d36SAndroid Build Coastguard Worker 
306*48a54d36SAndroid Build Coastguard Worker 
307*48a54d36SAndroid Build Coastguard Worker     _ASSERT(fwProfile != NULL);
308*48a54d36SAndroid Build Coastguard Worker 
309*48a54d36SAndroid Build Coastguard Worker     _ASSERT(fwServiceEnabled != NULL);
310*48a54d36SAndroid Build Coastguard Worker 
311*48a54d36SAndroid Build Coastguard Worker 
312*48a54d36SAndroid Build Coastguard Worker 
313*48a54d36SAndroid Build Coastguard Worker     *fwServiceEnabled = FALSE;
314*48a54d36SAndroid Build Coastguard Worker 
315*48a54d36SAndroid Build Coastguard Worker 
316*48a54d36SAndroid Build Coastguard Worker 
317*48a54d36SAndroid Build Coastguard Worker     // Retrieve the globally open ports collection.
318*48a54d36SAndroid Build Coastguard Worker 
319*48a54d36SAndroid Build Coastguard Worker     err = fwProfile->get_Services(&fwServices);
320*48a54d36SAndroid Build Coastguard Worker 
321*48a54d36SAndroid Build Coastguard Worker 	require( SUCCEEDED( err ), exit );
322*48a54d36SAndroid Build Coastguard Worker 
323*48a54d36SAndroid Build Coastguard Worker 
324*48a54d36SAndroid Build Coastguard Worker 
325*48a54d36SAndroid Build Coastguard Worker     // Attempt to retrieve the globally open port.
326*48a54d36SAndroid Build Coastguard Worker 
327*48a54d36SAndroid Build Coastguard Worker     err = fwServices->Item(NET_FW_SERVICE_FILE_AND_PRINT, &fwService);
328*48a54d36SAndroid Build Coastguard Worker 
329*48a54d36SAndroid Build Coastguard Worker 	require( SUCCEEDED( err ), exit );
330*48a54d36SAndroid Build Coastguard Worker 
331*48a54d36SAndroid Build Coastguard Worker 
332*48a54d36SAndroid Build Coastguard Worker 
333*48a54d36SAndroid Build Coastguard Worker 	// Find out if the globally open port is enabled.
334*48a54d36SAndroid Build Coastguard Worker 
335*48a54d36SAndroid Build Coastguard Worker     err = fwService->get_Enabled(&fwEnabled);
336*48a54d36SAndroid Build Coastguard Worker 
337*48a54d36SAndroid Build Coastguard Worker 	require( SUCCEEDED( err ), exit );
338*48a54d36SAndroid Build Coastguard Worker 
339*48a54d36SAndroid Build Coastguard Worker 	if (fwEnabled != VARIANT_FALSE)
340*48a54d36SAndroid Build Coastguard Worker 
341*48a54d36SAndroid Build Coastguard Worker 	{
342*48a54d36SAndroid Build Coastguard Worker 
343*48a54d36SAndroid Build Coastguard Worker 		*fwServiceEnabled = TRUE;
344*48a54d36SAndroid Build Coastguard Worker 
345*48a54d36SAndroid Build Coastguard Worker 	}
346*48a54d36SAndroid Build Coastguard Worker 
347*48a54d36SAndroid Build Coastguard Worker 
348*48a54d36SAndroid Build Coastguard Worker 
349*48a54d36SAndroid Build Coastguard Worker exit:
350*48a54d36SAndroid Build Coastguard Worker 
351*48a54d36SAndroid Build Coastguard Worker 
352*48a54d36SAndroid Build Coastguard Worker 
353*48a54d36SAndroid Build Coastguard Worker     // Release the globally open port.
354*48a54d36SAndroid Build Coastguard Worker 
355*48a54d36SAndroid Build Coastguard Worker     if (fwService != NULL)
356*48a54d36SAndroid Build Coastguard Worker 
357*48a54d36SAndroid Build Coastguard Worker     {
358*48a54d36SAndroid Build Coastguard Worker 
359*48a54d36SAndroid Build Coastguard Worker         fwService->Release();
360*48a54d36SAndroid Build Coastguard Worker 
361*48a54d36SAndroid Build Coastguard Worker     }
362*48a54d36SAndroid Build Coastguard Worker 
363*48a54d36SAndroid Build Coastguard Worker 
364*48a54d36SAndroid Build Coastguard Worker 
365*48a54d36SAndroid Build Coastguard Worker     // Release the globally open ports collection.
366*48a54d36SAndroid Build Coastguard Worker 
367*48a54d36SAndroid Build Coastguard Worker     if (fwServices != NULL)
368*48a54d36SAndroid Build Coastguard Worker 
369*48a54d36SAndroid Build Coastguard Worker     {
370*48a54d36SAndroid Build Coastguard Worker 
371*48a54d36SAndroid Build Coastguard Worker         fwServices->Release();
372*48a54d36SAndroid Build Coastguard Worker 
373*48a54d36SAndroid Build Coastguard Worker     }
374*48a54d36SAndroid Build Coastguard Worker 
375*48a54d36SAndroid Build Coastguard Worker 
376*48a54d36SAndroid Build Coastguard Worker 
377*48a54d36SAndroid Build Coastguard Worker     return err;
378*48a54d36SAndroid Build Coastguard Worker 
379*48a54d36SAndroid Build Coastguard Worker }
380*48a54d36SAndroid Build Coastguard Worker 
381*48a54d36SAndroid Build Coastguard Worker 
382*48a54d36SAndroid Build Coastguard Worker OSStatus
mDNSAddToFirewall(LPWSTR executable,LPWSTR name)383*48a54d36SAndroid Build Coastguard Worker mDNSAddToFirewall
384*48a54d36SAndroid Build Coastguard Worker 		(
385*48a54d36SAndroid Build Coastguard Worker 		LPWSTR	executable,
386*48a54d36SAndroid Build Coastguard Worker 		LPWSTR	name
387*48a54d36SAndroid Build Coastguard Worker 		)
388*48a54d36SAndroid Build Coastguard Worker {
389*48a54d36SAndroid Build Coastguard Worker 	INetFwProfile	*	fwProfile	= NULL;
390*48a54d36SAndroid Build Coastguard Worker 	HRESULT				comInit		= E_FAIL;
391*48a54d36SAndroid Build Coastguard Worker 	OSStatus			err			= kNoErr;
392*48a54d36SAndroid Build Coastguard Worker 
393*48a54d36SAndroid Build Coastguard Worker 	// Initialize COM.
394*48a54d36SAndroid Build Coastguard Worker 
395*48a54d36SAndroid Build Coastguard Worker 	comInit = CoInitializeEx( 0, COINIT_APARTMENTTHREADED | COINIT_DISABLE_OLE1DDE );
396*48a54d36SAndroid Build Coastguard Worker 
397*48a54d36SAndroid Build Coastguard Worker 	// Ignore this case. RPC_E_CHANGED_MODE means that COM has already been
398*48a54d36SAndroid Build Coastguard Worker 	// initialized with a different mode.
399*48a54d36SAndroid Build Coastguard Worker 
400*48a54d36SAndroid Build Coastguard Worker 	if (comInit != RPC_E_CHANGED_MODE)
401*48a54d36SAndroid Build Coastguard Worker 	{
402*48a54d36SAndroid Build Coastguard Worker 		err = comInit;
403*48a54d36SAndroid Build Coastguard Worker 		require(SUCCEEDED(err), exit);
404*48a54d36SAndroid Build Coastguard Worker 	}
405*48a54d36SAndroid Build Coastguard Worker 
406*48a54d36SAndroid Build Coastguard Worker 	// Connect to the firewall
407*48a54d36SAndroid Build Coastguard Worker 
408*48a54d36SAndroid Build Coastguard Worker 	err = mDNSFirewallInitialize(&fwProfile);
409*48a54d36SAndroid Build Coastguard Worker 	require( SUCCEEDED( err ) && ( fwProfile != NULL ), exit);
410*48a54d36SAndroid Build Coastguard Worker 
411*48a54d36SAndroid Build Coastguard Worker 	// Add us to the list of exempt programs
412*48a54d36SAndroid Build Coastguard Worker 
413*48a54d36SAndroid Build Coastguard Worker 	err = mDNSFirewallAddApp( fwProfile, executable, name );
414*48a54d36SAndroid Build Coastguard Worker 	require_noerr(err, exit);
415*48a54d36SAndroid Build Coastguard Worker 
416*48a54d36SAndroid Build Coastguard Worker exit:
417*48a54d36SAndroid Build Coastguard Worker 
418*48a54d36SAndroid Build Coastguard Worker 	// Disconnect from the firewall
419*48a54d36SAndroid Build Coastguard Worker 
420*48a54d36SAndroid Build Coastguard Worker 	if ( fwProfile != NULL )
421*48a54d36SAndroid Build Coastguard Worker 	{
422*48a54d36SAndroid Build Coastguard Worker 		mDNSFirewallCleanup(fwProfile);
423*48a54d36SAndroid Build Coastguard Worker 	}
424*48a54d36SAndroid Build Coastguard Worker 
425*48a54d36SAndroid Build Coastguard Worker 	// De-initialize COM
426*48a54d36SAndroid Build Coastguard Worker 
427*48a54d36SAndroid Build Coastguard Worker 	if (SUCCEEDED(comInit))
428*48a54d36SAndroid Build Coastguard Worker     {
429*48a54d36SAndroid Build Coastguard Worker         CoUninitialize();
430*48a54d36SAndroid Build Coastguard Worker     }
431*48a54d36SAndroid Build Coastguard Worker 
432*48a54d36SAndroid Build Coastguard Worker 	return err;
433*48a54d36SAndroid Build Coastguard Worker }
434*48a54d36SAndroid Build Coastguard Worker 
435*48a54d36SAndroid Build Coastguard Worker 
436*48a54d36SAndroid Build Coastguard Worker BOOL
mDNSIsFileAndPrintSharingEnabled(BOOL * retry)437*48a54d36SAndroid Build Coastguard Worker mDNSIsFileAndPrintSharingEnabled( BOOL * retry )
438*48a54d36SAndroid Build Coastguard Worker {
439*48a54d36SAndroid Build Coastguard Worker 	INetFwProfile	*	fwProfile					= NULL;
440*48a54d36SAndroid Build Coastguard Worker 	HRESULT				comInit						= E_FAIL;
441*48a54d36SAndroid Build Coastguard Worker 	BOOL				enabled						= FALSE;
442*48a54d36SAndroid Build Coastguard Worker 	OSStatus			err							= kNoErr;
443*48a54d36SAndroid Build Coastguard Worker 
444*48a54d36SAndroid Build Coastguard Worker 	// Initialize COM.
445*48a54d36SAndroid Build Coastguard Worker 
446*48a54d36SAndroid Build Coastguard Worker 	*retry = FALSE;
447*48a54d36SAndroid Build Coastguard Worker 	comInit = CoInitializeEx( 0, COINIT_APARTMENTTHREADED | COINIT_DISABLE_OLE1DDE );
448*48a54d36SAndroid Build Coastguard Worker 
449*48a54d36SAndroid Build Coastguard Worker 	// Ignore this case. RPC_E_CHANGED_MODE means that COM has already been
450*48a54d36SAndroid Build Coastguard Worker 	// initialized with a different mode.
451*48a54d36SAndroid Build Coastguard Worker 
452*48a54d36SAndroid Build Coastguard Worker 	if (comInit != RPC_E_CHANGED_MODE)
453*48a54d36SAndroid Build Coastguard Worker 	{
454*48a54d36SAndroid Build Coastguard Worker 		*retry = TRUE;
455*48a54d36SAndroid Build Coastguard Worker 		err = comInit;
456*48a54d36SAndroid Build Coastguard Worker 		require(SUCCEEDED(err), exit);
457*48a54d36SAndroid Build Coastguard Worker 	}
458*48a54d36SAndroid Build Coastguard Worker 
459*48a54d36SAndroid Build Coastguard Worker 	// Connect to the firewall
460*48a54d36SAndroid Build Coastguard Worker 
461*48a54d36SAndroid Build Coastguard Worker 	err = mDNSFirewallInitialize(&fwProfile);
462*48a54d36SAndroid Build Coastguard Worker 	require( SUCCEEDED( err ) && ( fwProfile != NULL ), exit);
463*48a54d36SAndroid Build Coastguard Worker 
464*48a54d36SAndroid Build Coastguard Worker 	err = mDNSFirewallIsFileAndPrintSharingEnabled( fwProfile, &enabled );
465*48a54d36SAndroid Build Coastguard Worker 	require_noerr( err, exit );
466*48a54d36SAndroid Build Coastguard Worker 
467*48a54d36SAndroid Build Coastguard Worker exit:
468*48a54d36SAndroid Build Coastguard Worker 
469*48a54d36SAndroid Build Coastguard Worker 	// Disconnect from the firewall
470*48a54d36SAndroid Build Coastguard Worker 
471*48a54d36SAndroid Build Coastguard Worker 	if ( fwProfile != NULL )
472*48a54d36SAndroid Build Coastguard Worker 	{
473*48a54d36SAndroid Build Coastguard Worker 		mDNSFirewallCleanup(fwProfile);
474*48a54d36SAndroid Build Coastguard Worker 	}
475*48a54d36SAndroid Build Coastguard Worker 
476*48a54d36SAndroid Build Coastguard Worker 	// De-initialize COM
477*48a54d36SAndroid Build Coastguard Worker 
478*48a54d36SAndroid Build Coastguard Worker 	if (SUCCEEDED(comInit))
479*48a54d36SAndroid Build Coastguard Worker     {
480*48a54d36SAndroid Build Coastguard Worker         CoUninitialize();
481*48a54d36SAndroid Build Coastguard Worker     }
482*48a54d36SAndroid Build Coastguard Worker 
483*48a54d36SAndroid Build Coastguard Worker 	return enabled;
484*48a54d36SAndroid Build Coastguard Worker }
485