WindowsXP-SP1/base/fs/remotefs/dfs/tools/dfsutil/dfsutil.cxx
2020-09-30 16:53:49 +02:00

430 lines
13 KiB
C++

//--------------------------------------------------------------------------
//
// Copyright (C) 1999, Microsoft Corporation
//
// File: dfsutil.cxx
//
//--------------------------------------------------------------------------
#include <stdio.h>
#include <nt.h>
#include <ntrtl.h>
#include <nturtl.h>
#include <windows.h>
#include <shellapi.h>
#include <winldap.h>
#include <stdlib.h>
#include <dsgetdc.h>
#include <lm.h>
#include <lmdfs.h>
#include <dfsfsctl.h>
#include "struct.hxx"
#include "flush.hxx"
#include "misc.hxx"
#include "info.hxx"
#include "messages.h"
//
// How we make args & switches
//
#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 Sw##x[] = L"/" L#x ; \
BOOLEAN fSw##x;
#define FMAKEARG(x) \
static WCHAR Arg##x[] = L#x L":"; \
static LONG ArgLen##x = (sizeof(Arg##x) / sizeof(WCHAR)) - 1; \
static BOOLEAN fArg##x;
#define FSWITCH(x) \
static WCHAR Sw##x[] = L"/" L#x ; \
static BOOLEAN fSw##x;
LPWSTR pwszNameBuffer = NULL;
LPWSTR pwszRootName = NULL;
LPWSTR pwszServerName = NULL;
LPWSTR pwszHexValue = NULL;
LPWSTR pwszDcName = NULL;
LPWSTR pwszDomainName = NULL;
LPWSTR pwszEntryToFlush = NULL;
LPWSTR pwszDumpArg = NULL;
LPWSTR pwszImportArg = NULL;
LPWSTR pwszExportArg = NULL;
LPWSTR pwszComment = NULL;
LPWSTR pwszShareName = NULL;
WCHAR wszNameBuffer[MAX_PATH+1] = { 0 };
MAKEARG(AddStdRoot);
MAKEARG(AddDomRoot);
MAKEARG(RemStdRoot);
MAKEARG(RemDomRoot);
MAKEARG(Server);
MAKEARG(Share);
MAKEARG(Unmap);
MAKEARG(Verbose);
MAKEARG(EventLog);
MAKEARG(Domain);
MAKEARG(Dns);
MAKEARG(Value);
MAKEARG(NetApiDfsDebug);
MAKEARG(DfsSvcVerbose);
MAKEARG(LoggingDfs);
MAKEARG(SyncInterval);
MAKEARG(DfsAlt);
MAKEARG(TraceLevel);
MAKEARG(Level);
MAKEARG(SetDc);
MAKEARG(Root);
MAKEARG(CscOnLine);
MAKEARG(CscOffLine);
MAKEARG(InSite);
//
// Switches (ie '/arg')
//
SWITCH(Debug);
SWITCH(Help);
SWITCH(HelpHelp);
SWITCH(ScriptHelp);
SWITCH(Dfs);
SWITCH(All);
SWITCH(StdDfs);
SWITCH(On);
SWITCH(Off);
SWITCH(PktInfo);
SWITCH(Set);
SWITCH(ReSet);
//
// Either a switch or an arg
//
MAKEARG(PktFlush);
SWITCH(PktFlush);
MAKEARG(SpcFlush);
SWITCH(SpcFlush);
MAKEARG(List);
SWITCH(List);
MAKEARG(SpcInfo);
SWITCH(SpcInfo);
//
// The macro can not make these
//
WCHAR SwQ[] = L"/?";
BOOLEAN fSwQ;
WCHAR SwQQ[] = L"/??";
BOOLEAN fSwQQ;
DWORD
Usage();
DWORD
CmdProcessUserCreds(
VOID);
BOOLEAN
CmdProcessArg(
LPWSTR Arg);
_cdecl
main(int argc, char *argv[])
{
UNREFERENCED_PARAMETER(argv);
UNREFERENCED_PARAMETER(argc);
DWORD dwErr = ERROR_SUCCESS;
LPWSTR CommandLine;
LPWSTR *argvw;
int argx;
int argcw;
// fSwDebug = TRUE;
//
// Get the command line in Unicode
//
CommandLine = GetCommandLine();
argvw = CommandLineToArgvW(CommandLine, &argcw);
if ( argvw == NULL ) {
MyPrintf(L"dfsutil:Can't convert command line to Unicode: %d\r\n", GetLastError() );
return 1;
}
//
// Get the arguments
//
if (argcw <= 1) {
Usage();
dwErr = ERROR_SUCCESS;
goto Cleanup;
}
//
// Process arguments
//
for (argx = 1; argx < argcw; argx++) {
if (CmdProcessArg(argvw[argx]) != TRUE) {
goto Cleanup;
}
}
//
// Do the work
//
if (fSwHelp == TRUE || fSwQ == TRUE) {
dwErr = Usage();
} else if (fSwPktFlush == TRUE || fArgPktFlush == TRUE) {
dwErr = PktFlush(pwszEntryToFlush);
} else if (fSwSpcFlush == TRUE || fArgSpcFlush == TRUE) {
dwErr = SpcFlush(pwszEntryToFlush);
} else if (fSwPktInfo == TRUE) {
dwErr = PktInfo(fSwDfs, pwszHexValue);
} else if (fSwSpcInfo == TRUE) {
dwErr = SpcInfo(fSwAll);
} else if (fArgAddStdRoot == TRUE) {
dwErr = CmdAddRoot(
FALSE,
pwszServerName,
pwszShareName,
pwszComment);
} else if (fArgAddDomRoot == TRUE) {
dwErr = CmdAddRoot(
TRUE,
pwszServerName,
pwszShareName,
pwszComment);
} else if (fArgRemStdRoot == TRUE) {
dwErr = CmdRemRoot(
FALSE,
pwszServerName,
pwszShareName);
} else if (fArgRemDomRoot == TRUE) {
dwErr = CmdRemRoot(
TRUE,
pwszServerName,
pwszShareName);
} else if (fSwHelpHelp == TRUE || fSwQQ == TRUE) {
dwErr = Usage();
} else if (fArgCscOffLine == TRUE) {
dwErr = CmdCscOffLine(pwszNameBuffer);
}
else {
dwErr = Usage();
// ErrorMessage(MSG_NOTHING_TO_DO);
}
Cleanup:
if (dwErr == STATUS_SUCCESS) {
ErrorMessage(MSG_SUCCESSFUL);
} else {
LPWSTR MessageBuffer;
DWORD dwBufferLength;
dwBufferLength = FormatMessage(
FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM,
NULL,
dwErr,
MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT),
(LPWSTR) &MessageBuffer,
0,
NULL);
ErrorMessage(MSG_ERROR, dwErr);
if (dwBufferLength > 0) {
MyPrintf(L"%ws\r\n", MessageBuffer);
LocalFree(MessageBuffer);
}
}
return dwErr;
}
BOOLEAN
CmdProcessArg(LPWSTR Arg)
{
LONG ArgLen;
BOOLEAN dwErr = FALSE;
BOOLEAN FoundAnArg = FALSE;
if (fSwDebug == TRUE)
MyPrintf(L"ProcessArg(%ws)\r\n", Arg);
if ( Arg != NULL && wcslen(Arg) > 1) {
dwErr = TRUE;
ArgLen = wcslen(Arg);
if (_wcsnicmp(Arg, ArgInSite, ArgLenInSite) == 0) {
FoundAnArg = fArgInSite = TRUE;
if (ArgLen > ArgLenInSite)
pwszNameBuffer = &Arg[ArgLenInSite];
} else if (_wcsnicmp(Arg, ArgRoot, ArgLenRoot) == 0) {
FoundAnArg = fArgRoot = TRUE;
if (ArgLen > ArgLenRoot)
pwszRootName = &Arg[ArgLenRoot];
} else if (_wcsnicmp(Arg, ArgAddStdRoot, ArgLenAddStdRoot) == 0) {
FoundAnArg = fArgAddStdRoot = TRUE;
} else if (_wcsnicmp(Arg, ArgRemStdRoot, ArgLenRemStdRoot) == 0) {
FoundAnArg = fArgRemStdRoot = TRUE;
} else if (_wcsnicmp(Arg, ArgAddDomRoot, ArgLenAddDomRoot) == 0) {
FoundAnArg = fArgAddDomRoot = TRUE;
} else if (_wcsnicmp(Arg, ArgRemDomRoot, ArgLenRemDomRoot) == 0) {
FoundAnArg = fArgRemDomRoot = TRUE;
} else if (_wcsnicmp(Arg, ArgShare, ArgLenShare) == 0) {
FoundAnArg = fArgShare = TRUE;
if (ArgLen > ArgLenShare)
pwszShareName = &Arg[ArgLenShare];
} else if (_wcsnicmp(Arg, ArgServer, ArgLenServer) == 0) {
FoundAnArg = fArgServer = TRUE;
if (ArgLen > ArgLenServer)
pwszServerName = &Arg[ArgLenServer];
} else if (_wcsnicmp(Arg, ArgUnmap, ArgLenUnmap) == 0) {
FoundAnArg = fArgUnmap = TRUE;
if (ArgLen > ArgLenUnmap)
pwszNameBuffer = &Arg[ArgLenUnmap];
} else if (_wcsnicmp(Arg, ArgCscOnLine, ArgLenCscOnLine) == 0) {
FoundAnArg = fArgCscOnLine = TRUE;
if (ArgLen > ArgLenCscOnLine)
pwszNameBuffer = &Arg[ArgLenCscOnLine];
} else if (_wcsnicmp(Arg, ArgCscOffLine, ArgLenCscOffLine) == 0) {
FoundAnArg = fArgCscOffLine = TRUE;
if (ArgLen > ArgLenCscOffLine)
pwszNameBuffer = &Arg[ArgLenCscOffLine];
} else if (_wcsnicmp(Arg, ArgDns, ArgLenDns) == 0) {
FoundAnArg = fArgDns = TRUE;
if (ArgLen > ArgLenDns)
pwszNameBuffer = &Arg[ArgLenDns];
} else if (_wcsnicmp(Arg, ArgNetApiDfsDebug, ArgLenNetApiDfsDebug) == 0) {
FoundAnArg = fArgNetApiDfsDebug = TRUE;
if (ArgLen > ArgLenNetApiDfsDebug)
pwszNameBuffer = &Arg[ArgLenNetApiDfsDebug];
} else if (_wcsnicmp(Arg, ArgDfsSvcVerbose, ArgLenDfsSvcVerbose) == 0) {
FoundAnArg = fArgDfsSvcVerbose = TRUE;
if (ArgLen > ArgLenDfsSvcVerbose)
pwszNameBuffer = &Arg[ArgLenDfsSvcVerbose];
} else if (_wcsnicmp(Arg, ArgLoggingDfs, ArgLenLoggingDfs) == 0) {
FoundAnArg = fArgLoggingDfs = TRUE;
if (ArgLen > ArgLenLoggingDfs)
pwszNameBuffer = &Arg[ArgLenLoggingDfs];
} else if (_wcsnicmp(Arg, ArgPktFlush, ArgLenPktFlush) == 0) {
FoundAnArg = fArgPktFlush = TRUE;
if (ArgLen > ArgLenPktFlush)
pwszEntryToFlush = &Arg[ArgLenPktFlush];
} else if (_wcsnicmp(Arg, ArgSpcFlush, ArgLenSpcFlush) == 0) {
FoundAnArg = fArgSpcFlush = TRUE;
if (ArgLen > ArgLenSpcFlush)
pwszEntryToFlush = &Arg[ArgLenSpcFlush];
} else if (_wcsnicmp(Arg, ArgVerbose, ArgLenVerbose) == 0) {
FoundAnArg = fArgVerbose = TRUE;
if (ArgLen > ArgLenVerbose)
pwszHexValue = &Arg[ArgLenVerbose];
} else if (_wcsnicmp(Arg, ArgValue, ArgLenValue) == 0) {
FoundAnArg = fArgValue = TRUE;
if (ArgLen > ArgLenValue)
pwszHexValue = &Arg[ArgLenValue];
} else if (_wcsnicmp(Arg, ArgTraceLevel, ArgLenTraceLevel) == 0) {
FoundAnArg = fArgTraceLevel = TRUE;
if (ArgLen > ArgLenTraceLevel)
pwszHexValue = &Arg[ArgLenTraceLevel];
} else if (_wcsnicmp(Arg, ArgLevel, ArgLenLevel) == 0) {
FoundAnArg = fArgLevel = TRUE;
if (ArgLen > ArgLenLevel)
pwszHexValue = &Arg[ArgLenLevel];
} else if (_wcsnicmp(Arg, ArgEventLog, ArgLenEventLog) == 0) {
FoundAnArg = fArgEventLog = TRUE;
if (ArgLen > ArgLenEventLog)
pwszHexValue = &Arg[ArgLenEventLog];
}
// Switches go at the end!!
if (_wcsicmp(Arg, SwDebug) == 0) {
FoundAnArg = fSwDebug = TRUE;
} else if (_wcsicmp(Arg, SwList) == 0) {
FoundAnArg = fSwList = TRUE;
} else if (_wcsicmp(Arg, SwPktFlush) == 0) {
FoundAnArg = fSwPktFlush = TRUE;
} else if (_wcsicmp(Arg, SwSpcFlush) == 0) {
FoundAnArg = fSwSpcFlush = TRUE;
} else if (_wcsicmp(Arg, SwPktInfo) == 0) {
FoundAnArg = fSwPktInfo = TRUE;
} else if (_wcsicmp(Arg, SwSpcInfo) == 0) {
FoundAnArg = fSwSpcInfo = TRUE;
} else if (_wcsicmp(Arg, SwDfs) == 0) {
FoundAnArg = fSwDfs = TRUE;
} else if (_wcsicmp(Arg, SwAll) == 0) {
FoundAnArg = fSwAll = TRUE;
} else if (_wcsicmp(Arg, SwOn) == 0) {
FoundAnArg = fSwOn = TRUE;
} else if (_wcsicmp(Arg, SwOff) == 0) {
FoundAnArg = fSwOff = TRUE;
} else if (_wcsicmp(Arg, SwStdDfs) == 0) {
FoundAnArg = fSwStdDfs = TRUE;
} else if (_wcsicmp(Arg, SwHelpHelp) == 0) {
FoundAnArg = fSwHelpHelp = TRUE;
} else if (_wcsicmp(Arg, SwScriptHelp) == 0) {
FoundAnArg = fSwScriptHelp = TRUE;
} else if (_wcsicmp(Arg, SwHelp) == 0) {
FoundAnArg = fSwHelp = TRUE;
} else if (_wcsicmp(Arg, SwQQ) == 0) {
FoundAnArg = fSwQQ = TRUE;
} else if (_wcsicmp(Arg, SwQ) == 0) {
FoundAnArg = fSwQ = TRUE;
} else if (_wcsicmp(Arg, SwSet) == 0) {
FoundAnArg = fSwSet = TRUE;
} else if (_wcsicmp(Arg, SwReSet) == 0) {
FoundAnArg = fSwReSet = TRUE;
}
if (wszNameBuffer[0] == L'\0' && pwszNameBuffer != NULL) {
wcscpy(wszNameBuffer, L"\\\\");
wcscat(wszNameBuffer, pwszNameBuffer);
pwszNameBuffer = wszNameBuffer;
while (pwszNameBuffer[0] == L'\\' && pwszNameBuffer[1] == L'\\')
pwszNameBuffer++;
pwszNameBuffer--;
}
if (FoundAnArg == FALSE) {
ErrorMessage(MSG_UNRECOGNIZED_OPTION, &Arg[1]);
Usage();
dwErr = FALSE;
goto AllDone;
}
}
AllDone:
if (fSwDebug == TRUE)
MyPrintf(L"ProcessArg exit %d\r\n", dwErr);
return dwErr;
}
DWORD
Usage()
{
ErrorMessage(MSG_USAGE);
return ERROR_SUCCESS;
}