238 lines
5.6 KiB
C
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
|