mirror of https://github.com/tongzx/nt5src
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.
167 lines
3.6 KiB
167 lines
3.6 KiB
/*++
|
|
|
|
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
|
|
//
|