Leaked source code of windows server 2003
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.
 
 
 
 
 
 

396 lines
10 KiB

//+-------------------------------------------------------------------------
//
// Function: main
//
// Arguments:
// argc, argv: the passed in argument list.
//
// Description: This routine initializes the dfs server, and creates
// a worker thread that will be responsible for periodic
// work (such as scavenging and refreshing). It then calls
// into the RPC code to start processing client requests.
//
//--------------------------------------------------------------------------
#include <nt.h>
#include <ntrtl.h>
#include <nturtl.h>
#include <windows.h>
#include <stdio.h>
#include <stdlib.h>
#include <stddef.h>
#include <shellapi.h>
#include "ReferralTest.hxx"
#include "DfsReferralData.h"
#include <DfsServerLibrary.hxx>
#include "dfswmi.h"
#define WPP_BIT_CLI_DRV 0x01
#define WPP_LEVEL_FLAGS_LOGGER(lvl,flags) WPP_LEVEL_LOGGER(flags)
#define WPP_LEVEL_FLAGS_ENABLED(lvl, flags) (WPP_LEVEL_ENABLED(flags) && WPP_CONTROL(WPP_BIT_CLI_DRV ).Level >= lvl)
#define WPP_LEVEL_ERROR_FLAGS_LOGGER(lvl, error, flags) WPP_LEVEL_LOGGER(flags)
#define WPP_LEVEL_ERROR_FLAGS_ENABLED(lvl, error, flags) \
((!NT_SUCCESS(error) || WPP_LEVEL_ENABLED(flags)) && WPP_CONTROL(WPP_BIT_CLI_DRV ).Level >= lvl)
#include "referraltest.tmh"
extern
void
SetReferralControl(WPP_CB_TYPE * Control);
DWORD
RpcInit();
DFSSTATUS
ProcessCommandLineArg( LPWSTR Arg );
VOID
ReferralServerUsage();
VOID
TestLinks();
DWORD
DfsTestThread(LPVOID TData );
#define UNICODE_PATH_SEP L'\\'
ULONG MaxLinks = sizeof(DfsTestLinks) /sizeof(struct _DFS_TEST_LINK);
INT64 TotalRef = 0;
#define MAKEARG(x) \
WCHAR Arg##x[] = L"/" L#x L":"; \
LONG ArgLen##x = (sizeof(Arg##x) / sizeof(WCHAR)) - 1; \
BOOLEAN fArg##x;
#define SWITCH(x) \
WCHAR Switch##x[] = L"/" L#x ; \
BOOLEAN fSwitch##x;
//
// The arguments we accept at commandline.
//
MAKEARG(Name);
SWITCH(L);
SWITCH(D);
SWITCH(M);
SWITCH(Trace);
ULONG Flags;
_cdecl
main(int argc, char *argv[])
{
UNREFERENCED_PARAMETER(argv);
UNREFERENCED_PARAMETER(argc);
LPWSTR CommandLine;
LPWSTR *argvw;
DFSSTATUS Status = ERROR_SUCCESS;
int argcw,i;
WPP_CB_TYPE *pLogger = NULL;
pLogger = &WPP_CB[WPP_CTRL_NO(WPP_BIT_CLI_DRV)];
WPP_INIT_TRACING(L"referralTest");
SetReferralControl(pLogger);
//
// Get the command line in Unicode
//
CommandLine = GetCommandLine();
argvw = CommandLineToArgvW(CommandLine, &argcw);
//
// Process each argument on the command line.
//
for (i = 1; i < argcw; i++) {
Status = ProcessCommandLineArg(argvw[i]);
if (fArgName == TRUE && fSwitchL == TRUE)
{
printf("/L and /Name: are mutually exclusive");
Status = ERROR_INVALID_PARAMETER;
}
if (Status != ERROR_SUCCESS)
{
ReferralServerUsage();
break;
}
}
if (Status == ERROR_SUCCESS)
{
//
// Initialize the server.
//
Status = DfsServerInitialize( Flags );
if (Status != ERROR_SUCCESS) {
printf("Cannot continue: dfs server init error %d\n", Status);
exit(-1);
}
}
Sleep(200);
for (i = 0; i < 10; i++) {
if (Status == ERROR_SUCCESS) {
HANDLE THandle;
DWORD Tid;
THandle = CreateThread (
NULL,
0,
DfsTestThread,
0,
0,
&Tid);
if (THandle != NULL) {
CloseHandle(THandle);
printf("Created Test thread tid %d\n", Tid);
}
else {
printf("Unable to create test thread\n");
Status = GetLastError();
}
}
}
while (1) {
Sleep(300000000);
}
WPP_CLEANUP();
}
//+-------------------------------------------------------------------------
//
// Function: ProcessCommandLineArg - process the command line
//
// Arguments: Arg - the argument to process
//
// Returns: Status
// ERROR_SUCCESS on success
// ERROR status code otherwise
//
//
// Description: This routine inteprets the passed in argument and
// sets appropriate flags with which the server should
// be initialized.
//
//--------------------------------------------------------------------------
DFSSTATUS
ProcessCommandLineArg( LPWSTR Arg )
{
LONG ArgLen;
DFSSTATUS Status = ERROR_SUCCESS;
LPWSTR NameSpace;
if (Arg == NULL) {
Status = ERROR_INVALID_PARAMETER;
}
if (Status == ERROR_SUCCESS)
{
ArgLen = wcslen(Arg);
if (_wcsnicmp(Arg, ArgName, ArgLenName) == 0)
{
fArgName = TRUE;
NameSpace = &Arg[ArgLenName];
if (wcslen(NameSpace) == 0)
{
Status = ERROR_INVALID_PARAMETER;
}
else {
Status = DfsAddHandledNamespace( NameSpace, TRUE );
}
}
else if (_wcsicmp(Arg, SwitchTrace) == 0)
{
fSwitchTrace = TRUE;
}
else if (_wcsicmp(Arg, SwitchL) == 0)
{
fSwitchL = TRUE;
Flags |= DFS_LOCAL_NAMESPACE;
}
else if (_wcsicmp(Arg, SwitchD) == 0)
{
Flags |= DFS_CREATE_DIRECTORIES;
}
else if (_wcsicmp(Arg, SwitchM) == 0)
{
Flags |= DFS_MIGRATE;
}
else {
Status = STATUS_INVALID_PARAMETER;
}
}
return Status;
}
//
// Function: ReferralServerUsage. Usage printout for the referral server.
//
VOID
ReferralServerUsage()
{
printf("Usage:\n");
printf("/D - Create directories\n");
printf("/L - Run on the local root server\n");
printf("/M - Migrate existing DFS to allow multiple roots\n");
printf("/Name:<Namespace> - Handle referrals to the specified namespace\n");
return;
}
DWORD
DfsTestThread(LPVOID TData )
{
srand( (unsigned)GetCurrentThreadId());
INT64 TotalThreadRef = 0;
INT64 y;
UNREFERENCED_PARAMETER(TData);
while (1) {
TestLinks();
Sleep(20);
TotalThreadRef += 5;
TotalRef += 5;
y = TotalRef;
if ((TotalThreadRef % 1000) == 0) {
printf("Thread %d, Ref %I64d\n", GetCurrentThreadId(), TotalThreadRef);
}
if ((y % 10000) == 0) {
printf("Total Referals %I64d\n", TotalRef);
}
}
return 0;
}
DFSSTATUS
DfsGenerateReferralBySitenameForTesting(
LPWSTR LinkName,
LPWSTR SiteName,
DWORD NumReplicasToReturn,
ULONG CostLimit,
REFERRAL_HEADER ** ppReferralHeader);
VOID
DfsReleaseReferral(
REFERRAL_HEADER *pReferralHeader);
LPWSTR MySite=L"Red-Bldg40";
VOID
TestLinks()
{
UNICODE_STRING Name, Remaining;
UNICODE_STRING LinkName, LinkRemains;
REFERRAL_HEADER *pReferral;
ULONG i,j;
DFSSTATUS Status;
BOOLEAN LinkMatches, RemainsMatches, ReplicaMatches;
for (j = 0; j < 5; j++) {
i = (unsigned)(GetCurrentThreadId());
i += rand();
i = i % MaxLinks;
Status = DfsGenerateReferralBySitenameForTesting( DfsTestLinks[i].Name,
MySite,
1000,
1000,
&pReferral );
if (Status == ERROR_SUCCESS) {
if (pReferral == NULL)
{
DbgBreakPoint();
}
RtlInitUnicodeString(&Name, &DfsTestLinks[i].Name[0]);
RtlInitUnicodeString(&Remaining, &DfsTestLinks[i].RemainingName[0]);
RtlInitUnicodeString(&LinkRemains, NULL);
LinkName.Buffer = pReferral->LinkName;
LinkName.Length = LinkName.MaximumLength = (USHORT)pReferral->LinkNameLength;
LinkMatches = FALSE;
RemainsMatches = FALSE;
ReplicaMatches = FALSE;
if (RtlPrefixUnicodeString(&LinkName, &Name, TRUE) == TRUE)
{
LinkMatches = TRUE;
LinkRemains.Buffer = &Name.Buffer[(LinkName.Length / sizeof(WCHAR))];
LinkRemains.MaximumLength = LinkRemains.Length = Name.Length - LinkName.Length;
if (LinkRemains.Length && LinkRemains.Buffer[0] == UNICODE_PATH_SEP)
{
LinkRemains.Buffer++;
LinkRemains.Length -= sizeof(WCHAR);
}
if (RtlCompareUnicodeString(&Remaining, &LinkRemains, TRUE) == 0)
{
RemainsMatches = TRUE;
}
if (DfsTestLinks[i].NumberReplicas == pReferral->ReplicaCount)
{
ReplicaMatches = TRUE;
}
}
if (!LinkMatches || !RemainsMatches || !ReplicaMatches)
{
printf("Link Matches %x Rem %x Rep %x\n",
LinkMatches, RemainsMatches, ReplicaMatches );
printf("Number of replicas %d, number got %d\n",
DfsTestLinks[i].NumberReplicas, pReferral->ReplicaCount);
printf("LinkRem buffer %p. Name buf %p Linkn len %x name len %x Linkrem len %x remain len %x\n",
LinkRemains.Buffer, Name.Buffer, LinkName.Length, Name.Length, LinkRemains.Length, Remaining.Length);
printf("Name %wZ Link %wZ Remains %wZ LinkRemains %wZ\n",
&Name, &LinkName, &Remaining, &LinkRemains);
}
DfsReleaseReferral(pReferral);
}
else{
printf("Load for %wS Failde with %x\n", DfsTestLinks[i].Name, Status);
}
}
}