168 lines
3.6 KiB
C
168 lines
3.6 KiB
C
/*++
|
||
|
||
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
|
||
//
|