/*++ 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 // DNS_STATUS Dns_SendServiceControl( IN PWSTR pwsServiceName, IN DWORD Access, IN DWORD Control ) { DWORD status = ERROR_INVALID_PARAMETER; SC_HANDLE hmanager = NULL; SC_HANDLE hservice = NULL; SERVICE_STATUS serviceStatus; DNSDBG( ANY, ( "Dns_SendServiceControl( %S, %08x, %08x )\n", pwsServiceName, Access, Control )); hmanager = OpenSCManagerW( NULL, NULL, SC_MANAGER_CONNECT ); if ( !hmanager ) { DNSDBG( ANY, ( "ERROR: OpenSCManager( SC_MANAGER_CONNECT ) failed %d\n", GetLastError() )); goto Cleanup; } hservice = OpenServiceW( hmanager, pwsServiceName, Access ); if ( !hservice ) { DNSDBG( ANY, ( "ERROR: OpenService( %S, %08x ) failed %d\n", pwsServiceName, Access, GetLastError() )); goto Cleanup; } if ( !ControlService( hservice, Control, &serviceStatus ) ) { DNSDBG( ANY, ( "ERROR: ControlService( %08x ) failed %d\n", Control, GetLastError() )); goto Cleanup; } status = NO_ERROR; Cleanup: if ( status != NO_ERROR ) { status = GetLastError(); } if ( hservice ) { CloseServiceHandle( hservice ); } if ( hmanager ) { CloseServiceHandle( hmanager ); } DNSDBG( ANY, ( "Leave Dns_SendServiceControl( %S, %08x, %08x ) => %d\n", pwsServiceName, Access, Control, status )); 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 // Dns_SendServiceControl( DNS_RESOLVER_SERVICE, SERVICE_USER_DEFINED_CONTROL, 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 ); Dns_SendServiceControl( DNS_SERVER_SERVICE, SERVICE_USER_DEFINED_CONTROL, SERVICE_CONTROL_PARAMCHANGE ); } } // // End srvcntl.c //