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.
296 lines
6.7 KiB
296 lines
6.7 KiB
/*++
|
|
|
|
Copyright (c) 1992 Microsoft Corporation
|
|
|
|
Module Name:
|
|
|
|
locator.cxx
|
|
|
|
Abstract:
|
|
|
|
This file contains server initialization and other RPC control
|
|
functions. The server has 3+ threads. The first thread
|
|
initializes the locator and waits forever in ServerListen. The second
|
|
thread listens on a mailslot for a request of GID's from the
|
|
net. The final threads are created & used by the RPC runtime.
|
|
|
|
Author:
|
|
|
|
Steven Zeck (stevez) 07/01/90
|
|
|
|
--*/
|
|
|
|
#ifdef NTENV
|
|
|
|
extern "C"
|
|
{
|
|
#include <nt.h>
|
|
#include <ntrtl.h>
|
|
#include <nturtl.h>
|
|
|
|
#include <windef.h> // Base windows types
|
|
#include <winbase.h>
|
|
}
|
|
|
|
#endif // NTENV
|
|
|
|
|
|
#include "core.hxx"
|
|
#include "locclass.hxx"
|
|
CDEF
|
|
#include "nsisvr.h"
|
|
#include "nsiclt.h"
|
|
#include "nsimgm.h"
|
|
#include "loctoloc.h"
|
|
#include "locsys.h"
|
|
|
|
ENDDEF
|
|
|
|
#if DBG
|
|
ostream *OSdebug; // debug output buffer
|
|
#else
|
|
|
|
const long mainIdle = 0xffffffff;
|
|
|
|
#endif
|
|
|
|
int debug = -1; // debug trace level
|
|
|
|
// Well known endpoint for the locator.
|
|
|
|
#define pipeNameLoc "\\pipe\\locator"
|
|
|
|
MUTEX *pESaccess, *pESnet; // Semaphores for serialized access
|
|
|
|
long waitOnRead = 3000L; // time to wait on reading reply back
|
|
ULONG maxCacheAge = EXPIRATION_DEFAULT; // max cache age, in seconds
|
|
int fService = 1; // running as a service
|
|
int fNet = 1; // enable network functionality
|
|
PUZ OtherDomain; // other domain to look.
|
|
SZ szOtherDomain; // ASCII other domain to look.
|
|
PUZ DomainName; // name of current domain
|
|
PUZ SelfName; // name of this workstation
|
|
|
|
STATICTS perf; // performance statics
|
|
ostream *cout; // console output.
|
|
|
|
SZ szDebugName = "locator.log"; // debug log file name
|
|
|
|
SwitchList aSwitchs = {
|
|
|
|
{"/debug:*", ProcessInt, &debug,},
|
|
{"/logfile:*", ProcessChar, &szDebugName,},
|
|
{"/expirationage:*", ProcessLong, &maxCacheAge,},
|
|
{"/querytimeout:*", ProcessLong, &waitOnRead,},
|
|
{"/noservice", ProcessResetFlag, &fService,},
|
|
{"/nonet", ProcessResetFlag, &fNet,},
|
|
{"/otherdomain:*", ProcessChar, &szOtherDomain,},
|
|
{0}
|
|
};
|
|
|
|
|
|
NATIVE_CLASS_LOCATOR * Locator;
|
|
|
|
|
|
#ifdef NTENV
|
|
int _CRTAPI1
|
|
#else // NTENV
|
|
int
|
|
#endif // NTENV
|
|
main (
|
|
IN int cArgs,
|
|
IN SZ *paSZargs
|
|
)
|
|
/*++
|
|
|
|
Routine Description:
|
|
|
|
Entry point for the locator server, Initialize data
|
|
structures and start the various threads of excution.
|
|
|
|
Arguments:
|
|
|
|
cArgs - number of argument.
|
|
|
|
paSZargs - vector of arguments.
|
|
|
|
Returns:
|
|
|
|
Allows 0
|
|
|
|
--*/
|
|
{
|
|
USED(cArgs);
|
|
SZ badArg;
|
|
int Status = 0;
|
|
unsigned long Role;
|
|
|
|
BUFFER_STREAM_BASE *BuffStreamT;
|
|
|
|
#if DBG
|
|
if (!(BuffStreamT = new DEBUG_STREAM))
|
|
AbortServer("Out of Memory");
|
|
|
|
OSdebug = new ostream(BuffStreamT);
|
|
if (!OSdebug)
|
|
AbortServer("Out of Memory");
|
|
|
|
OSdebug->setBuffer(BUFF_LINE);
|
|
#endif
|
|
|
|
if (!(BuffStreamT = new CONSOLE_STREAM))
|
|
AbortServer("Out of Memory");
|
|
|
|
if (!(cout = new ostream(BuffStreamT)))
|
|
AbortServer("Out of Memory");
|
|
|
|
cout->setBuffer(BUFF_FLUSH);
|
|
|
|
ASSERT(AssertHeap());
|
|
|
|
pESaccess = new MUTEX(&Status);
|
|
if (Status)
|
|
AbortServer("Can create Mutex", Status);
|
|
|
|
pESnet = new MUTEX(&Status);
|
|
if (Status)
|
|
AbortServer("Can create Mutex", Status);
|
|
|
|
EntryDict = new ENTRY_BASE_NODEDict;
|
|
|
|
if (!pESaccess || !pESnet || !EntryDict)
|
|
AbortServer("Out of Memory");
|
|
|
|
ASSERT(AssertHeap());
|
|
|
|
#ifndef NTENV
|
|
|
|
// For OS/2 lose - the initial / on the switch list
|
|
|
|
for (SWitch *pSW = aSwitchs; pSW->name; pSW++)
|
|
pSW->name++;
|
|
|
|
#endif
|
|
|
|
badArg = ProcessArgs(aSwitchs, ++paSZargs);
|
|
|
|
// Bail out on bad arguments.
|
|
|
|
if (badArg) {
|
|
char Buffer[200];
|
|
fService = FALSE;
|
|
|
|
AbortServer((SZ) strcat(strcpy(Buffer, "Command Line Error: "), badArg));
|
|
}
|
|
|
|
if (szOtherDomain)
|
|
if (!(OtherDomain = UZFromSZ(szOtherDomain)))
|
|
AbortServer("Out of Memory");
|
|
|
|
Role = GetSystemType();
|
|
DLIST(3, "..running on " << Role << nl);
|
|
|
|
switch (Role)
|
|
{
|
|
|
|
case ROLE_WKSTA_MEMBER:
|
|
case ROLE_LMNT_BACKUPDC:
|
|
case ROLE_LMNT_PDC:
|
|
|
|
Locator = (NATIVE_CLASS_LOCATOR *)
|
|
new DOMAIN_MACHINE_LOCATOR(Role, &Status);
|
|
break;
|
|
case ROLE_WKSTA_WKGRP:
|
|
|
|
Locator = (NATIVE_CLASS_LOCATOR *)
|
|
new WRKGRP_MACHINE_LOCATOR(Role, &Status);
|
|
break;
|
|
|
|
default:
|
|
;
|
|
};
|
|
|
|
Locator->SetupHelperRoutine();
|
|
|
|
SystemInit();
|
|
return(0);
|
|
}
|
|
|
|
|
|
void
|
|
StartServer(
|
|
)
|
|
|
|
/*++
|
|
|
|
Routine Description:
|
|
|
|
Call the runtime to create the server for the locator, the runtime
|
|
will create it own threads to use to service calls.
|
|
|
|
Returns:
|
|
|
|
Never returns.
|
|
|
|
--*/
|
|
{
|
|
RPC_STATUS result;
|
|
|
|
#ifdef NTENV
|
|
SECURITY_DESCRIPTOR SecurityDescriptor;
|
|
BOOL Bool;
|
|
#endif
|
|
|
|
if (result = RpcServerRegisterIf(NsiS_ServerIfHandle, NIL, NIL))
|
|
AbortServer("RpcServerRegisterIf", (int)result);
|
|
|
|
if (result = RpcServerRegisterIf(NsiC_ServerIfHandle, NIL, NIL))
|
|
AbortServer("RpcServerRegisterIf", (int)result);
|
|
|
|
if (result = RpcServerRegisterIf(NsiM_ServerIfHandle, NIL, NIL))
|
|
AbortServer("RpcServerRegisterIf", (int)result);
|
|
|
|
if (result = RpcServerRegisterIf(LocToLoc_ServerIfHandle, NIL, NIL))
|
|
AbortServer("RpcServerRegisterIf", (int)result);
|
|
|
|
#ifdef NTENV
|
|
//
|
|
// Croft up a security descriptor that will grant everyone
|
|
// all access to the object (basically, no security)
|
|
//
|
|
// We do this by putting in a NULL Dacl.
|
|
//
|
|
// BUGBUG: rpc should copy the security descriptor,
|
|
// Since it currently doesn't, simply allocate it for now and
|
|
// leave it around forever.
|
|
//
|
|
|
|
InitializeSecurityDescriptor(
|
|
&SecurityDescriptor,
|
|
SECURITY_DESCRIPTOR_REVISION
|
|
);
|
|
|
|
Bool = SetSecurityDescriptorDacl (
|
|
&SecurityDescriptor,
|
|
TRUE, // Dacl present
|
|
(PACL)NULL, // NULL Dacl
|
|
FALSE // Not defaulted
|
|
);
|
|
#endif
|
|
|
|
if (result = RpcServerUseProtseqEp((unsigned char *) "ncacn_np",
|
|
1,
|
|
(unsigned char *)pipeNameLoc,
|
|
#ifdef NTENV
|
|
&SecurityDescriptor
|
|
#else
|
|
NULL
|
|
#endif
|
|
))
|
|
{
|
|
AbortServer("RpcServerUseProtseqEp named pipe", (int)result);
|
|
}
|
|
|
|
if (result = RpcServerListen(1, 1000, 1))
|
|
AbortServer("RpcServerListen", (int)result);
|
|
}
|