Source code of Windows XP (NT5)
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.
|
|
/*++
Copyright (c) 1994-2001 Microsoft Corporation
Module Name:
svccntl.c
Abstract:
Domain Name System (DNS) API
Service control routines.
Author:
Glenn Curtis (glennc) 05-Jul-1997
Revision History:
Jim Gilroy (jamesg) March 2000 -- resolver notify
--*/
#include "local.h"
//
// DCR_CLEANUP: identical ServiceControl routine is in resolver
// - should either expose in dnsapi.dll or in dnslib.h
//
DWORD _fastcall SendServiceControl( IN LPWSTR pszServiceName, IN DWORD dwControl ) { DWORD Status = NO_ERROR; SC_HANDLE scManagerHandle = NULL; SC_HANDLE scServiceHandle = NULL; SERVICE_STATUS ServiceStatus;
DNSDBG( ANY, ( "SendServiceControl( %S, %08x )\n", pszServiceName, dwControl ));
scManagerHandle = OpenSCManagerW( NULL, NULL, SC_MANAGER_ALL_ACCESS ); // SC_MANAGER_CONNECT );
if ( !scManagerHandle ) return GetLastError();
scServiceHandle = OpenServiceW( scManagerHandle, pszServiceName, SERVICE_ALL_ACCESS ); // SERVICE_CHANGE_CONFIG );
if ( !scServiceHandle ) { CloseServiceHandle( scManagerHandle ); return GetLastError(); }
if ( !ControlService( scServiceHandle, dwControl, &ServiceStatus ) ) { Status = GetLastError(); }
CloseServiceHandle( scServiceHandle ); CloseServiceHandle( scManagerHandle );
return Status; }
VOID DnsNotifyResolver( IN DWORD Flag, IN PVOID pReserved ) /*++
Routine Description:
Notify resolver of configuration change.
This allows it to wakeup and refresh its informatio and\or dump the cache and rebuild info.
Arguments:
Flag -- unused
pReserved -- unused
Return Value:
None
--*/ { UNREFERENCED_PARAMETER( Flag ); UNREFERENCED_PARAMETER( pReserved );
DNSDBG( ANY, ( "\nDnsNotifyResolver()\n" "\tFlag = %08x\n" "\tpReserved = %p\n" "\tTickCount = %d\n", Flag, pReserved, GetTickCount() ));
//
// wake the resolver
//
SendServiceControl( DNS_RESOLVER_SERVICE, SERVICE_CONTROL_PARAMCHANGE );
//
// DCR: hack for busted resolver permissions
//
// DCR: network change notifications
// this is a poor mechanism for handling notification
// - this should happen directly through SCM
// - it won't work for IPv6 or anything else
// probably need to move to IPHlpApi
//
// notify resolver
// also notify DNS server, but wait briefly to allow resolver
// to handle the changes as i'm not sure that the server
// doesn't call a resolver API to do it's read
// note, the reason the resolver doesn't notify the DNS
// server is that since Jon Schwartz moved the resolver to
// NetworkService account, attempts to open the SCM to
// notify the DNS server all fail
//
// DCR: make sure server calls directly to avoid race
// DCR: make sure g_IsDnsServer is current
//
g_IsDnsServer = Reg_IsMicrosoftDnsServer(); if ( g_IsDnsServer ) { Sleep( 1000 );
SendServiceControl( DNS_SERVER_SERVICE, SERVICE_CONTROL_PARAMCHANGE ); } }
//
// End srvcntl.c
//
|