home *** CD-ROM | disk | FTP | other *** search
- /*++
-
- Copyright (c) 1992 Microsoft Corporation
-
- Module Name:
-
- RnrClnt.c
-
- Abstract:
-
- Setup program for installing/removing the "EchoExample" service.
-
- --*/
-
- #include <stdio.h>
- #include <stdlib.h>
- #include <windows.h>
- #include <winsock2.h>
- #include <nspapi.h>
-
- WSADATA WsaData;
-
- #ifndef NS_NTDS
- #define NS_NTDS 9999
- #endif
- //
- // GUID for Echo-Example created with uuidgen:
- // "47da8500-96a1-11cd-901d-204c4f4f5020"
- //
-
- GUID ServiceGuid = { 0x47da8500, 0x96a1, 0x11cd, 0x90, 0x1d,
- 0x20, 0x4c, 0x4f, 0x4f, 0x50, 0x20 };
-
- #define ECHO_SERVICE_TYPE_NAME "EchoExample"
- #define ECHO_SERVICE_SAPID 999
- #define ECHO_SERVICE_TCPPORT 999
- #define RNR_SERVICE_NAME "RnrSvc"
- #define RNR_DISPLAY_NAME "RnrSampleService"
-
- void
- DoServiceSetup(
- char * Path
- )
- {
- SC_HANDLE ServiceManagerHandle;
- SC_HANDLE ServiceHandle;
- LPSTR KeyName = "System\\CurrentControlSet\\Services\\EventLog\\System\\RnrSvc";
- HKEY RnrKey;
- LONG err;
- DWORD Disposition;
-
- //
- // Create the service.
- //
-
- ServiceManagerHandle = OpenSCManager( NULL,
- NULL,
- STANDARD_RIGHTS_REQUIRED
- | SC_MANAGER_CREATE_SERVICE );
-
- if( ServiceManagerHandle == NULL ) {
- printf( "OpenSCManager failed: %ld\n", GetLastError() );
- exit(1);
- }
-
- ServiceHandle = CreateService( ServiceManagerHandle,
- RNR_SERVICE_NAME,
- RNR_DISPLAY_NAME,
- GENERIC_READ | GENERIC_WRITE,
- SERVICE_WIN32_OWN_PROCESS,
- SERVICE_DEMAND_START,
- SERVICE_ERROR_NORMAL,
- Path,
- NULL,
- NULL,
- NULL,
- NULL,
- NULL );
-
- if( ServiceHandle == NULL ) {
- printf( "CreateService failed: %ld\n", GetLastError() );
- CloseServiceHandle( ServiceManagerHandle );
- exit(1);
- }
-
- CloseServiceHandle( ServiceHandle );
- CloseServiceHandle( ServiceManagerHandle );
-
- printf( "%s created with path %s\n",
- RNR_SERVICE_NAME,
- Path );
-
- //
- // 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,
- KeyName,
- 0,
- NULL,
- REG_OPTION_NON_VOLATILE,
- KEY_WRITE,
- NULL,
- &RnrKey,
- &Disposition );
-
- if( err != 0 ) {
- printf( "RegCreateKeyEx failed: %ld\n", err );
- exit(1);
- }
-
- err = RegSetValueEx( RnrKey,
- "EventMessageFile",
- 0,
- REG_EXPAND_SZ,
- Path,
- strlen( Path ) + 1 );
-
- if( err == 0 ) {
- DWORD Value;
-
- Value = EVENTLOG_ERROR_TYPE
- | EVENTLOG_WARNING_TYPE
- | EVENTLOG_INFORMATION_TYPE;
-
- err = RegSetValueEx( RnrKey,
- "TypesSupported",
- 0,
- REG_DWORD,
- (CONST BYTE *)&Value,
- sizeof(Value) );
- }
-
- RegCloseKey( RnrKey );
-
- if( err != 0 ) {
- printf( "RegSetValueEx failed: %ld\n", err );
- exit(1);
- }
-
- exit(0);
- }
-
- void _CRTAPI1
- main (
- int argc,
- char *argv[]
- )
- {
- INT err;
-
- WSASERVICECLASSINFO ServiceClassInfo;
- WSANSCLASSINFO lpNSClassInfo[6];
-
- DWORD Value1 = 1 ;
- DWORD SapValue = ECHO_SERVICE_SAPID ;
- DWORD TcpPortValue = ECHO_SERVICE_TCPPORT ;
- DWORD operation = SERVICE_ADD_TYPE;
-
- //
- // Initilize the Windows Sockets DLL.
- //
-
- err = WSAStartup( 0x0202, &WsaData );
- if ( err == SOCKET_ERROR ) {
- printf( "WSAStartup() failed: %ld\n", GetLastError( ) );
- exit(1);
- }
-
- //
- // Parse command-line arguments.
- //
-
- if (argc > 2) {
- printf( "usage: rnrsetup [/ADD | /DEL | /SVC:path]\n") ;
- exit(1);
- }
-
- if (argc == 2)
- {
- if ( _strnicmp( argv[1], "/add", 4 ) == 0 )
- {
- printf( "\nAdding service types to Rnr name spaces.\n" );
- }
- else if ( _strnicmp( argv[1], "/delete", 4 ) == 0 )
- {
- err = WSARemoveServiceClass( &ServiceGuid );
-
- WSACleanup();
-
- if ( err != NO_ERROR )
- {
- printf( "\nWSARemoveServiceClass failed: %ld\n",
- GetLastError( ) );
- exit(1);
- }
-
- printf( "\nWSARemoveServiceClass succeeded\n" );
-
- exit(0);
- }
- else if ( _strnicmp( argv[1], "/svc:", 5 ) == 0 )
- {
- printf( "\nAdding service entry to service control manager.\n" );
- DoServiceSetup( strchr( argv[1], ':' ) + 1 );
- printf( "Adding service types to Rnr name spaces.\n" );
- }
- else
- {
- printf( "usage: rnrsetup [/ADD | /DEL | /SVC:path]\n") ;
- exit(1);
- }
- }
-
- //
- // Set up information to pass to NSPInstallServiceClass() or
- // NSPRemoveServiceClass() to add or delete this
- // service type.
- //
-
- ServiceClassInfo.lpServiceClassId = &ServiceGuid;
- ServiceClassInfo.lpszServiceClassName = ECHO_SERVICE_TYPE_NAME;
- ServiceClassInfo.dwCount = 6;
- ServiceClassInfo.lpClassInfos = lpNSClassInfo;
-
- //
- // - - - SAP provider setup - - -
- //
- // The first value tells SAP that this is a connection-oriented
- // service.
- //
- lpNSClassInfo[0].lpszName = SERVICE_TYPE_VALUE_CONN ;
- lpNSClassInfo[0].dwNameSpace = NS_SAP ;
- lpNSClassInfo[0].dwValueType = REG_DWORD ;
- lpNSClassInfo[0].dwValueSize = 4 ;
- lpNSClassInfo[0].lpValue = &Value1 ;
-
- //
- // Next, give SAP the object type to use when broadcasting the
- // service name.
- //
- lpNSClassInfo[1].lpszName = SERVICE_TYPE_VALUE_SAPID ;
- lpNSClassInfo[1].dwNameSpace = NS_SAP ;
- lpNSClassInfo[1].dwValueType = REG_DWORD ;
- lpNSClassInfo[1].dwValueSize = sizeof(DWORD) ;
- lpNSClassInfo[1].lpValue = &SapValue ;
-
- //
- // - - - TCPIP provider setup - - -
- //
- // Tell the TCPIP name space provider that we will be using TCP
- // port 0x999.
- //
- lpNSClassInfo[2].lpszName = SERVICE_TYPE_VALUE_TCPPORT ;
- lpNSClassInfo[2].dwNameSpace = NS_DNS ;
- lpNSClassInfo[2].dwValueType = REG_DWORD ;
- lpNSClassInfo[2].dwValueSize = sizeof(DWORD) ;
- lpNSClassInfo[2].lpValue = &TcpPortValue ;
-
- //
- // - - - NTDS provider setup - - -
- //
- // The first value tells SAP that this is a connection-oriented
- // service.
- //
- lpNSClassInfo[3].lpszName = SERVICE_TYPE_VALUE_CONN ;
- lpNSClassInfo[3].dwNameSpace = NS_NTDS ;
- lpNSClassInfo[3].dwValueType = REG_DWORD ;
- lpNSClassInfo[3].dwValueSize = 4 ;
- lpNSClassInfo[3].lpValue = &Value1 ;
-
- //
- // Next, give SAP the object type to use when broadcasting the
- // service name.
- //
- lpNSClassInfo[4].lpszName = SERVICE_TYPE_VALUE_SAPID ;
- lpNSClassInfo[4].dwNameSpace = NS_NTDS ;
- lpNSClassInfo[4].dwValueType = REG_DWORD ;
- lpNSClassInfo[4].dwValueSize = sizeof(DWORD) ;
- lpNSClassInfo[4].lpValue = &SapValue ;
-
- //
- // Tell the NTDS name space provider that we will be using TCP
- // port 0x999.
- //
- lpNSClassInfo[5].lpszName = SERVICE_TYPE_VALUE_TCPPORT ;
- lpNSClassInfo[5].dwNameSpace = NS_NTDS ;
- lpNSClassInfo[5].dwValueType = REG_DWORD ;
- lpNSClassInfo[5].dwValueSize = sizeof(DWORD) ;
- lpNSClassInfo[5].lpValue = &TcpPortValue ;
-
- //
- // Finally, call WSAInstallServiceClass to actually perform the operation.
- //
-
- err = WSAInstallServiceClass( &ServiceClassInfo );
-
- WSACleanup();
-
- if ( err != NO_ERROR )
- {
- printf( "WSAInstallServiceClass failed: %ld\n", GetLastError( ) );
- exit(1);
- }
-
- printf( "WSAInstallServiceClass succeeded\n" );
-
- exit(0);
-
- } // main
-