mirror of https://github.com/lianthony/NT4.0
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.
344 lines
9.6 KiB
344 lines
9.6 KiB
/*++
|
|
|
|
Copyright (c) 1992 Microsoft Corporation
|
|
|
|
Module Name:
|
|
|
|
ConfBld.c
|
|
|
|
Abstract:
|
|
|
|
BUGBUG
|
|
|
|
Author:
|
|
|
|
John Rogers (JohnRo) 14-Mar-1992
|
|
|
|
Environment:
|
|
|
|
Portable to any flat, 32-bit environment. (Uses Win32 typedefs.)
|
|
Requires ANSI C extensions: slash-slash comments, long external names.
|
|
|
|
Revision History:
|
|
|
|
14-Mar-1992 JohnRo
|
|
Cut and pasted this code from examples/netcnfg.c and netlib/conffake.c.
|
|
16-Mar-1992 JohnRo
|
|
Removed dependency on NetApi.DLL (it needs registry to init!)
|
|
20-Mar-1992 JohnRo
|
|
I forgot to _close some handles, which caused some sections disappear.
|
|
29-Mar-1992 JohnRo
|
|
Added kludge code to convert ASCII command-line arguments to UNICODE.
|
|
31-Mar-1992 JohnRo
|
|
Flush the registry after each create/_write.
|
|
Changed default domain to NtProj and set up equates for defaults.
|
|
07-Apr-1992 JohnRo
|
|
Fix UNICODE problems.
|
|
Create alerter section.
|
|
29-Apr-1992 JohnRo
|
|
REG_SZ now implies a UNICODE string, so we can't use REG_USZ anymore.
|
|
21-May-1992 JohnRo
|
|
Title index field is now reserved.
|
|
|
|
--*/
|
|
|
|
|
|
#define DEFAULT_DOMAIN L"NtProj"
|
|
#define DEFAULT_MACHINE L"JohnRoX"
|
|
|
|
|
|
// These must be included first:
|
|
|
|
#include <windows.h> // Needed by <configp.h> and <winreg.h>
|
|
#include <lmcons.h> // NET_API_STATUS.
|
|
|
|
// These may be included in any order:
|
|
|
|
#include <assert.h> // assert().
|
|
#include <confname.h> // SECT_NT_ equates.
|
|
#include <ctype.h> // tolower(), etc.
|
|
#include <netdebug.h> // FORMAT_ equates only.
|
|
#include <stdio.h> // fprintf().
|
|
#include <stdlib.h> // exit(), EXIT_SUCCESS, etc.
|
|
#include <tstring.h> // WCSSIZE().
|
|
|
|
|
|
#define DEBUG_PRINT (void) printf
|
|
|
|
|
|
#define MAKE_SURE_NODE_EXISTS( ParentKey, ChildKey, ChildNameT ) \
|
|
{ \
|
|
LONG Error; \
|
|
Error = RegCreateKeyEx( \
|
|
ParentKey, \
|
|
ChildNameT, \
|
|
0, /* reserved (was title index) */ \
|
|
WIN31_CLASS, \
|
|
REG_OPTION_NON_VOLATILE, \
|
|
KEY_ALL_ACCESS, /* desired: everything but SYNCHRONIZE */ \
|
|
NULL, /* no security attr */ \
|
|
& ChildKey, \
|
|
NULL /* don't need disp */ \
|
|
); \
|
|
DEBUG_PRINT( "ConfBld: RegCreateKeyEx(subkey '" \
|
|
FORMAT_LPTSTR "') ret " FORMAT_LONG ".\n", \
|
|
ChildNameT, Error ); \
|
|
assert( Error == ERROR_SUCCESS ); /* BUGBUG */ \
|
|
Error = RegFlushKey( ChildKey ); \
|
|
assert( Error == ERROR_SUCCESS ); /* BUGBUG */ \
|
|
}
|
|
|
|
#define OPEN_READ_ONLY_KEY( ParentKey, ChildKey, ChildNameT ) \
|
|
{ \
|
|
LONG Error; \
|
|
Error = RegOpenKeyEx ( \
|
|
ParentKey, \
|
|
ChildNameT, \
|
|
REG_OPTION_NON_VOLATILE, /* options */ \
|
|
KEY_READ, /* desired access */ \
|
|
& ChildKey ); \
|
|
DEBUG_PRINT( "ConfBld: RegOpenKeyEx(" FORMAT_LPTSTR ") returned " \
|
|
FORMAT_LONG ".\n", ChildNameT, Error ); \
|
|
assert( Error == ERROR_SUCCESS ); \
|
|
}
|
|
|
|
//
|
|
// Set a value for a keyword. Be prepared for the UNICODE switch-over
|
|
// by storing only UNICODE in the registry. Note that RegSetValue()
|
|
// doesn't handle UNICODE REG_SZ, so we use RegSetValueEx().
|
|
//
|
|
#define SET_VALUE_FOR_KEYWORD( KeyForSection, ParamNameT, ValueStringW ) \
|
|
{ \
|
|
LONG Error; \
|
|
assert( ValueStringW != NULL ); /* BUGBUG */ \
|
|
DEBUG_PRINT( "Setting " FORMAT_LPTSTR " to '" FORMAT_LPWSTR "'...\n", \
|
|
ParamNameT, ValueStringW ); \
|
|
Error = RegSetValueEx( \
|
|
KeyForSection, /* key handle */ \
|
|
ParamNameT, /* subkey */ \
|
|
0, /* reserved (was title index) */ \
|
|
REG_SZ, /* type = UNICODE only */ \
|
|
(LPSTR) ValueStringW, /* data */ \
|
|
WCSSIZE( ValueStringW ) ); /* data byte count */ \
|
|
DEBUG_PRINT( "ConfBld: RegSetValue(param '" \
|
|
FORMAT_LPTSTR "' value '" FORMAT_LPWSTR "') ret " \
|
|
FORMAT_LONG ".\n", \
|
|
ParamNameT, ValueStringW, Error ); \
|
|
/* assert( Error == ERROR_SUCCESS ); */ /* BUGBUG */ \
|
|
Error = RegFlushKey( KeyForSection ); \
|
|
assert( Error == ERROR_SUCCESS ); /* BUGBUG */ \
|
|
}
|
|
|
|
#define CLOSE_NODE( KeyHandle ) \
|
|
{ \
|
|
LONG Error; \
|
|
Error = RegCloseKey( KeyHandle ); \
|
|
assert( Error == ERROR_SUCCESS ); /* BUGBUG */ \
|
|
}
|
|
|
|
|
|
DBGSTATIC VOID
|
|
KludgeCopyStrToWStr(
|
|
OUT LPWSTR UnicodeDest,
|
|
IN LPSTR AsciiSrc
|
|
);
|
|
|
|
VOID
|
|
MakeEmptySection(
|
|
IN HKEY ServicesKey,
|
|
IN LPTSTR SectionName
|
|
)
|
|
{
|
|
HKEY SectionKey;
|
|
DEBUG_PRINT( "Making section " FORMAT_LPTSTR "...\n", SectionName );
|
|
MAKE_SURE_NODE_EXISTS( ServicesKey, SectionKey, SectionName );
|
|
CLOSE_NODE( SectionKey );
|
|
}
|
|
|
|
|
|
VOID
|
|
SetTransports(
|
|
IN HKEY ServicesKey,
|
|
IN LPTSTR SectionName
|
|
)
|
|
{
|
|
HKEY SectionKey;
|
|
DEBUG_PRINT( "Making section " FORMAT_LPTSTR "...\n", SectionName );
|
|
MAKE_SURE_NODE_EXISTS( ServicesKey, SectionKey, SectionName );
|
|
SET_VALUE_FOR_KEYWORD( SectionKey, TEXT("NET1"), L"\\Device\\Loop" );
|
|
SET_VALUE_FOR_KEYWORD( SectionKey, TEXT("NET2"), L"\\Device\\Nbf" );
|
|
SET_VALUE_FOR_KEYWORD( SectionKey, TEXT("NET3"), L"\\Device\\Xns" );
|
|
CLOSE_NODE( SectionKey );
|
|
}
|
|
|
|
|
|
void Usage (char * pszProgram);
|
|
|
|
int _CRTAPI1
|
|
main (
|
|
int argc,
|
|
char *argv[]
|
|
)
|
|
{
|
|
LPSTR MachineA = ""; // Machine (server) name (ANSI)
|
|
LPSTR DomainA = ""; // Domain name (ANSI)
|
|
int iCount; // Index counter
|
|
HKEY SystemKey, ServicesKey, SectionKey;
|
|
|
|
for (iCount = 1; iCount < argc; iCount++) {
|
|
|
|
if ((*argv[iCount] == '-') || (*argv[iCount] == '/')) {
|
|
|
|
switch (tolower(*(argv[iCount]+1))) { // Process switches
|
|
case 'm': // -m \\servername
|
|
{
|
|
LPSTR UncMachineA = argv[++iCount];
|
|
if ( UncMachineA[0] != '\\' ) {
|
|
Usage(argv[0]);
|
|
}
|
|
if ( UncMachineA[1] != '\\' ) {
|
|
Usage(argv[0]);
|
|
}
|
|
MachineA = &UncMachineA[2];
|
|
}
|
|
break;
|
|
case 'd': // -d domain
|
|
DomainA = argv[++iCount];
|
|
break;
|
|
case 'h':
|
|
default:
|
|
Usage(argv[0]);
|
|
}
|
|
} else {
|
|
Usage(argv[0]);
|
|
}
|
|
|
|
}
|
|
|
|
|
|
DEBUG_PRINT("ConfBld: Setting up Win32 config stuff...\n");
|
|
|
|
|
|
|
|
// Open HKEY_LOCAL_MACHINE\System. (This must be read-only.)
|
|
OPEN_READ_ONLY_KEY( HKEY_LOCAL_MACHINE, SystemKey, TEXT("System") );
|
|
|
|
|
|
// Make sure Services exists under that (it probably doesn't).
|
|
MAKE_SURE_NODE_EXISTS( SystemKey, ServicesKey, TEXT("Services") );
|
|
|
|
|
|
|
|
// Make sure LanmanWorkstation section exists.
|
|
MAKE_SURE_NODE_EXISTS( ServicesKey, SectionKey, SECT_NT_WKSTA );
|
|
|
|
|
|
if (*DomainA != '\0') {
|
|
WCHAR DomainW[DNLEN+1];
|
|
assert( strlen( DomainA ) <= DNLEN );
|
|
KludgeCopyStrToWStr( DomainW, DomainA );
|
|
|
|
SET_VALUE_FOR_KEYWORD( SectionKey, WKSTA_KEYWORD_DOMAIN, DomainW );
|
|
} else {
|
|
SET_VALUE_FOR_KEYWORD( SectionKey, WKSTA_KEYWORD_DOMAIN,
|
|
DEFAULT_DOMAIN );
|
|
}
|
|
|
|
|
|
SET_VALUE_FOR_KEYWORD( SectionKey, WKSTA_KEYWORD_DOMAINID,
|
|
L"0 0 0 0 0 0 17 12 4 56" );
|
|
|
|
|
|
if (*MachineA != '\0') {
|
|
WCHAR MachineW[CNLEN+1];
|
|
assert( strlen( MachineA ) <= CNLEN );
|
|
KludgeCopyStrToWStr( MachineW, MachineA );
|
|
|
|
SET_VALUE_FOR_KEYWORD(
|
|
SectionKey, WKSTA_KEYWORD_COMPUTERNAME, MachineW );
|
|
} else {
|
|
SET_VALUE_FOR_KEYWORD(
|
|
SectionKey, WKSTA_KEYWORD_COMPUTERNAME, DEFAULT_MACHINE );
|
|
}
|
|
|
|
|
|
CLOSE_NODE( SectionKey );
|
|
|
|
|
|
MakeEmptySection( ServicesKey, SECT_NT_ALERTER );
|
|
|
|
MakeEmptySection( ServicesKey, SECT_NT_BROWSER_DOMAINS );
|
|
|
|
MakeEmptySection( ServicesKey, SECT_NT_SERVER );
|
|
|
|
MakeEmptySection( ServicesKey, SECT_NT_SERVER_SHARES );
|
|
|
|
SetTransports( ServicesKey, SECT_NT_SERVER_TRANSPORTS );
|
|
|
|
SetTransports( ServicesKey, SECT_NT_WKSTA_TRANSPORTS );
|
|
|
|
|
|
MAKE_SURE_NODE_EXISTS( ServicesKey, SectionKey, SECT_NT_REPLICATOR );
|
|
|
|
// SET_VALUE_FOR_KEYWORD( SectionKey,
|
|
// REPL_KEYWORD_ROLE,
|
|
// REPL_KEYWORD_ROLE_IMPORT ); // BUGBUG
|
|
// SET_VALUE_FOR_KEYWORD( SectionKey,
|
|
// REPL_KEYWORD_EXPPATH,
|
|
// TEXT("\\LanMan.NT\\MyRepl\\Exp") ); // BUGBUG
|
|
// SET_VALUE_FOR_KEYWORD( SectionKey,
|
|
// REPL_KEYWORD_IMPPATH,
|
|
// TEXT("\\LanMan.NT\\MyRepl\\Imp") ); // BUGBUG
|
|
CLOSE_NODE( SectionKey );
|
|
|
|
|
|
MakeEmptySection( ServicesKey, SECT_NT_REPLICATOR_EXPORTS );
|
|
|
|
MakeEmptySection( ServicesKey, SECT_NT_REPLICATOR_IMPORTS );
|
|
|
|
|
|
|
|
CLOSE_NODE( ServicesKey );
|
|
|
|
CLOSE_NODE( SystemKey );
|
|
|
|
DEBUG_PRINT( "ConfBld: Done.\n" );
|
|
|
|
return (EXIT_SUCCESS);
|
|
|
|
} // main
|
|
|
|
|
|
DBGSTATIC VOID
|
|
KludgeCopyStrToWStr(
|
|
OUT LPWSTR UnicodeDest,
|
|
IN LPSTR AsciiSrc
|
|
)
|
|
{
|
|
|
|
WCHAR UnicodeChar;
|
|
|
|
do {
|
|
|
|
// BUGBUG: This is kludge code, for ASCII only!!!!
|
|
UnicodeChar = (WCHAR) ( *AsciiSrc );
|
|
|
|
*UnicodeDest++ = UnicodeChar;
|
|
|
|
++AsciiSrc;
|
|
|
|
} while (UnicodeChar != L'\0' );
|
|
|
|
} // KludgeCopyStrToWStr
|
|
|
|
|
|
void Usage (char * pszProgram)
|
|
{
|
|
fprintf(stderr, "Usage: %s [-m \\\\machine] [-d domain]\n", pszProgram);
|
|
fprintf(stderr,
|
|
"where machine defaults to " FORMAT_LPWSTR " and domain to "
|
|
FORMAT_LPWSTR ".\n",
|
|
DEFAULT_MACHINE, DEFAULT_DOMAIN );
|
|
|
|
exit(EXIT_FAILURE);
|
|
}
|