windows-nt/Source/XPSP1/NT/ds/dns/dnsapi/svccntl.c
2020-09-26 16:20:57 +08:00

168 lines
3.6 KiB
C
Raw Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

/*++
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
//