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

238 lines
5.6 KiB
C

/*++
Copyright (c) 1992 Microsoft Corporation
Module Name:
DnsClnt.c
Abstract:
Setup program for installing/removing the "EchoExample" service.
Author:
David Treadwell (davidtr) 30-June-1994
Revision History:
Chuck Y. Chan (chuckc) 17-July-1994
Misc cleanup. Pointer based blobs.
Charles K. Moore (keithmo) 27-July-1994
Added RrnSvc service setup option.
--*/
#include <stdio.h>
#include <stdlib.h>
#include <windows.h>
#define DNS_SERVICE_NAME "DNS"
#define DNS_DISPLAY_NAME "Domain Name Server"
#define SERVICES_KEY_NAME "System\\CurrentControlSet\\Services"
#define EVENTLOG_KEY_NAME SERVICES_KEY_NAME "\\EventLog\\System\\"
#define DNS_EVENT_KEY_NAME EVENTLOG_KEY_NAME DNS_SERVICE_NAME
#define DNS_EXE_PATH "%SystemRoot%\\system32\\dns.exe"
#define START_AUTOMATICALLY 0x2
#define START_MANUALLY 0x3
#define SERVICE_DEPENDENCY_LIST ("TcpIp\0Afd\0NetBT\0RpcSs\0NtLmSsp\0\0")
void
DnsServiceSetup(
VOID
)
{
SC_HANDLE ServiceManagerHandle;
SC_HANDLE ServiceHandle;
HKEY DnsKey;
LONG err;
DWORD Disposition;
DWORD Startval;
//
// open service manager
//
ServiceManagerHandle = OpenSCManager(
NULL,
NULL,
SC_MANAGER_ALL_ACCESS );
if( ServiceManagerHandle == NULL )
{
printf( "OpenSCManager failed: %ld\n", GetLastError() );
exit(1);
}
//
// create the service
//
ServiceHandle = CreateService(
ServiceManagerHandle,
DNS_SERVICE_NAME,
DNS_DISPLAY_NAME,
GENERIC_READ | GENERIC_WRITE,
SERVICE_WIN32_SHARE_PROCESS,
SERVICE_DEMAND_START,
SERVICE_ERROR_NORMAL,
DNS_EXE_PATH,
NULL,
NULL,
SERVICE_DEPENDENCY_LIST,
NULL,
NULL );
if( ServiceHandle == NULL )
{
//
// Service already exists?
//
if ( ( GetLastError() & 0xFFFF ) == ERROR_SERVICE_EXISTS )
{
printf( "Updating previously installed DNS service.\n" );
ServiceHandle = OpenService(
ServiceManagerHandle,
DNS_SERVICE_NAME,
GENERIC_READ | GENERIC_WRITE );
if ( ServiceHandle == NULL )
{
printf( "OpenService failed: %ld\n", GetLastError() );
CloseServiceHandle( ServiceManagerHandle );
exit(1);
}
if ( !ChangeServiceConfig(
ServiceHandle,
SERVICE_WIN32_SHARE_PROCESS,
SERVICE_DEMAND_START,
SERVICE_ERROR_NORMAL,
DNS_EXE_PATH,
NULL,
NULL,
SERVICE_DEPENDENCY_LIST,
NULL,
NULL,
DNS_DISPLAY_NAME ) )
{
printf(
"ERROR: Could not change services configuration.\n"
"\tError = %ld\n"
"The DNS services may not be installed properly.\n",
GetLastError() );
}
}
else
{
printf( "CreateService failed: %ld\n", GetLastError() );
CloseServiceHandle( ServiceManagerHandle );
exit(1);
}
}
else
{
//
// successful creation of service
//
printf(
"%s created with path %s\n",
DNS_SERVICE_NAME,
DNS_EXE_PATH );
}
CloseServiceHandle( ServiceHandle );
CloseServiceHandle( ServiceManagerHandle );
//
// Add the data to the EventLog's registry key so that the
// log insertion strings may be found by the Event Viewer.
//
err = RegCreateKeyEx(
HKEY_LOCAL_MACHINE,
DNS_EVENT_KEY_NAME,
0,
NULL,
REG_OPTION_NON_VOLATILE,
KEY_WRITE,
NULL,
&DnsKey,
&Disposition );
if( err != ERROR_SUCCESS )
{
printf( "RegCreateKeyEx failed: %ld\n", err );
exit(1);
}
err = RegSetValueEx(
DnsKey,
"EventMessageFile",
0,
REG_EXPAND_SZ,
DNS_EXE_PATH,
strlen( DNS_EXE_PATH ) + 1 );
if( err == ERROR_SUCCESS )
{
DWORD Value;
Value = EVENTLOG_ERROR_TYPE
| EVENTLOG_WARNING_TYPE
| EVENTLOG_INFORMATION_TYPE;
err = RegSetValueEx(
DnsKey,
"TypesSupported",
0,
REG_DWORD,
(CONST BYTE *)&Value,
sizeof(Value) );
}
RegCloseKey( DnsKey );
if( err != 0 )
{
printf( "RegSetValueEx failed: %ld\n", err );
exit(1);
}
//
// Add the data to the EventLog's registry key so that the
// log insertion strings may be found by the Event Viewer.
//
RegCloseKey( DnsKey );
if( err != 0 )
{
printf( "RegSetValueEx (%s) failed: %ld\n", "Start", err );
exit(1);
}
exit(0);
}
void __cdecl
main (
int argc,
CHAR *argv[]
)
{
DnsServiceSetup();
exit(0);
} // main