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.
3080 lines
70 KiB
3080 lines
70 KiB
//+-------------------------------------------------------------------------
|
|
//
|
|
// Microsoft Windows
|
|
// Copyright (C) Microsoft Corporation, 1998 - 1998.
|
|
//
|
|
// File: Main.CXX
|
|
//
|
|
// Contents: Main file for DfsApi
|
|
//
|
|
// History: 11-Mar-98 MariusB Created
|
|
// 10-Dec-98 MariusB Minor fixes
|
|
// 20-Nov-00 MariusB
|
|
//
|
|
// Notes:
|
|
//
|
|
//--------------------------------------------------------------------------
|
|
|
|
#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 "lm.h"
|
|
#include "lmdfs.h"
|
|
#include "winsock2.h"
|
|
#include <stdio.h>
|
|
#include <stdlib.h>
|
|
#include <tchar.h>
|
|
#include <excpt.h>
|
|
#include <dsgetdc.h>
|
|
#include <windef.h>
|
|
#include <winbase.h>
|
|
#include <basetsd.h>
|
|
|
|
#if !defined(DFS_STORAGE_STATE_MASTER)
|
|
#define DFS_STORAGE_STATE_MASTER 0x0010
|
|
#define DFS_STORAGE_STATE_STANDBY 0x0020
|
|
#endif
|
|
|
|
#define RETURN return
|
|
|
|
#if !defined(UNICODE) || !defined(_UNICODE)
|
|
#error For UNICODE only
|
|
#endif
|
|
|
|
#define NOREBOOT 1
|
|
#define CHECK_ERR(x)
|
|
|
|
|
|
BOOL bDebug = FALSE;
|
|
FILE* fDebug = NULL;
|
|
#define MSG \
|
|
if (bDebug) fprintf(fDebug, "File %s, %lu\n", __FILE__, __LINE__); \
|
|
if (bDebug) fprintf
|
|
|
|
ULONG Usage(LPSTR ptszAppNane);
|
|
ULONG Add(DWORD dwArgc, LPTSTR* pptszArgv);
|
|
ULONG Remove(DWORD dwArgc, LPTSTR* pptszArgv);
|
|
ULONG Enum(DWORD dwArgc, LPTSTR* pptszArgv);
|
|
ULONG GetInfo(DWORD dwArgc, LPTSTR* pptszArgv);
|
|
ULONG SetInfo(DWORD dwArgc, LPTSTR* pptszArgv);
|
|
ULONG GetClientInfo(DWORD dwArgc, LPTSTR* pptszArgv);
|
|
ULONG SetClientInfo(DWORD dwArgc, LPTSTR* pptszArgv);
|
|
#if NOREBOOT
|
|
ULONG AddStdRoot(DWORD dwArgc, LPTSTR* pptszArgv);
|
|
ULONG RemoveStdRoot(DWORD dwArgc, LPTSTR* pptszArgv);
|
|
ULONG AddFtRoot(DWORD dwArgc, LPTSTR* pptszArgv);
|
|
ULONG RemoveFtRoot(DWORD dwArgc, LPTSTR* pptszArgv);
|
|
ULONG RemoveFtRootForced(DWORD dwArgc, LPTSTR* pptszArgv);
|
|
ULONG AddStdRootForced(DWORD dwArgc, LPTSTR* pptszArgv);
|
|
#endif
|
|
ULONG GetDcAddress(DWORD dwArgc, LPTSTR* pptszArgv);
|
|
#if 0
|
|
ULONG SetDcAddress(DWORD dwArgc, LPTSTR* pptszArgv);
|
|
#endif
|
|
ULONG AddConnection(DWORD dwArgc, LPTSTR* pptszArgv);
|
|
ULONG AddConnection1(DWORD dwArgc, LPTSTR* pptszArgv);
|
|
ULONG AddConnection2(DWORD dwArgc, LPTSTR* pptszArgv);
|
|
ULONG CancelConnection(DWORD dwArgc, LPTSTR* pptszArgv);
|
|
ULONG CancelConnection1(DWORD dwArgc, LPTSTR* pptszArgv);
|
|
ULONG CancelConnection2(DWORD dwArgc, LPTSTR* pptszArgv);
|
|
ULONG GetLocalName(LPTSTR ptszLocalName,
|
|
ULONG ulLocalNameLen,
|
|
LPTSTR ptszArg);
|
|
ULONG GetNetResource(NETRESOURCE* pNetResource,
|
|
LPTSTR ptszType,
|
|
LPTSTR ptszLocalName,
|
|
LPTSTR ptszRemoteName,
|
|
LPTSTR ptszProvider);
|
|
ULONG GetWNetConnectionFlags(DWORD* pdwFlags,
|
|
DWORD dwArgc,
|
|
LPTSTR* pptszArgv);
|
|
ULONG AddressToSite(DWORD dwArgc,
|
|
LPTSTR* pptszArgv);
|
|
ULONG PrintDfsInfo(DWORD dwLevel, LPBYTE pBuffer);
|
|
ULONG PrintDfsInfo1(PDFS_INFO_1 pBuffer);
|
|
ULONG PrintDfsInfo2(PDFS_INFO_2 pBuffer);
|
|
ULONG PrintDfsInfo3(PDFS_INFO_3 pBuffer);
|
|
ULONG PrintDfsInfo4(PDFS_INFO_4 pBuffer);
|
|
ULONG PrintDfsInfo200(PDFS_INFO_200 pBuffer);
|
|
ULONG PrintDfsInfo300(PDFS_INFO_300 pBuffer);
|
|
ULONG PrintStgInfo(PDFS_STORAGE_INFO pStorage);
|
|
LPTSTR GetStringParam(LPTSTR ptszParam);
|
|
|
|
//+---------------------------------------------------------------------------
|
|
//
|
|
// Function: main
|
|
//
|
|
// Synopsis: Core function for the application.
|
|
//
|
|
// Arguments: [argc] -- The number of arguments
|
|
// [argv] -- The arguments
|
|
//
|
|
// Returns: ERROR_SUCCESS -- Success
|
|
//
|
|
// Notes:
|
|
//
|
|
//----------------------------------------------------------------------------
|
|
ULONG __cdecl main(int argc, char* argv[])
|
|
{
|
|
ULONG ulErr = ERROR_SUCCESS;
|
|
DWORD dwArgc = 0;
|
|
LPTSTR* pptszArgv = NULL;
|
|
INT i = 0;
|
|
INT nArgNdx = 0;
|
|
|
|
if (argc < 2 ||
|
|
argv[1][1]=='?' && (
|
|
argv[1][0]=='-' ||
|
|
argv[1][0]=='/'))
|
|
{
|
|
ulErr = Usage(argv[0]);
|
|
RETURN(ulErr);
|
|
}
|
|
|
|
if (NULL == (pptszArgv =
|
|
(LPTSTR*)malloc(sizeof(LPTSTR)*max(argc,32))))
|
|
{
|
|
_ftprintf(stderr,
|
|
_T("Not enough memory\n"));
|
|
|
|
ulErr = ERROR_NOT_ENOUGH_MEMORY;
|
|
|
|
CHECK_ERR(ulErr);
|
|
goto Error;
|
|
}
|
|
memset(pptszArgv, 0, sizeof(LPTSTR)*max(argc,32));
|
|
|
|
for (i=0; i<argc; i++)
|
|
{
|
|
#ifdef UNICODE
|
|
if (NULL == (pptszArgv[i] = (LPTSTR)malloc(
|
|
sizeof(_TCHAR)*(1+strlen(argv[i])))))
|
|
{
|
|
_ftprintf(stderr,
|
|
_T("Not enough memory\n"));
|
|
|
|
ulErr = ERROR_NOT_ENOUGH_MEMORY;
|
|
|
|
CHECK_ERR(ulErr);
|
|
goto Error;
|
|
}
|
|
|
|
memset(pptszArgv[i],
|
|
0,
|
|
sizeof(TCHAR)*(1+strlen(argv[i])));
|
|
mbstowcs(pptszArgv[i], argv[i], strlen(argv[i]));
|
|
#else
|
|
pptszArgv[i]=argv[i];
|
|
#endif
|
|
++dwArgc;
|
|
} //for i
|
|
|
|
if (pptszArgv[1] == _tcsstr(pptszArgv[1], _T("/debug")))
|
|
{
|
|
bDebug = TRUE;
|
|
if (_T(':') == pptszArgv[1][strlen("/debug")])
|
|
{
|
|
if (NULL == (fDebug =
|
|
_tfopen(pptszArgv[1]+strlen("/debug")+1, _T("wt+"))))
|
|
{
|
|
fprintf(stderr, "Opening %ws failed with %lu",
|
|
pptszArgv[1]+strlen("/debug")+1,
|
|
errno);
|
|
}
|
|
} //if
|
|
|
|
if (NULL == fDebug)
|
|
{
|
|
fDebug = stderr;
|
|
} //if
|
|
|
|
MSG(fDebug,
|
|
"\n\nDebug report for %ws\n",
|
|
pptszArgv[0]);
|
|
nArgNdx++;
|
|
} //if
|
|
|
|
for (i=0; i<argc; i++)
|
|
{
|
|
MSG(fDebug,
|
|
"\tpptszArgv[%d]==\"%ws\"\n",
|
|
i,
|
|
pptszArgv[i]);
|
|
}
|
|
MSG(fDebug,
|
|
"\tnArgNdx==%d\n",
|
|
nArgNdx);
|
|
|
|
if (0 == _tcsicmp(pptszArgv[nArgNdx+1], _T("add")))
|
|
{
|
|
ulErr = Add(dwArgc-nArgNdx-2, pptszArgv+nArgNdx+2);
|
|
CHECK_ERR(ulErr);
|
|
}
|
|
else if (0 == _tcsicmp(pptszArgv[nArgNdx+1], _T("remove")))
|
|
{
|
|
ulErr = Remove(dwArgc-nArgNdx-2, pptszArgv+nArgNdx+2);
|
|
CHECK_ERR(ulErr);
|
|
}
|
|
else if (0 == _tcsicmp(pptszArgv[nArgNdx+1], _T("enum")))
|
|
{
|
|
ulErr = Enum(dwArgc-nArgNdx-2, pptszArgv+nArgNdx+2);
|
|
CHECK_ERR(ulErr);
|
|
}
|
|
else if (0 == _tcsicmp(pptszArgv[nArgNdx+1], _T("getinfo")))
|
|
{
|
|
ulErr = GetInfo(dwArgc-nArgNdx-2, pptszArgv+nArgNdx+2);
|
|
CHECK_ERR(ulErr);
|
|
}
|
|
else if (0 == _tcsicmp(pptszArgv[nArgNdx+1], _T("setinfo")))
|
|
{
|
|
ulErr = SetInfo(dwArgc-nArgNdx-2, pptszArgv+nArgNdx+2);
|
|
CHECK_ERR(ulErr);
|
|
}
|
|
else if (0 == _tcsicmp(pptszArgv[nArgNdx+1], _T("getclientinfo")))
|
|
{
|
|
ulErr = GetClientInfo(dwArgc-nArgNdx-2, pptszArgv+nArgNdx+2);
|
|
CHECK_ERR(ulErr);
|
|
}
|
|
else if (0 == _tcsicmp(pptszArgv[nArgNdx+1], _T("setclientinfo")))
|
|
{
|
|
ulErr = SetClientInfo(dwArgc-nArgNdx-2, pptszArgv+nArgNdx+2);
|
|
CHECK_ERR(ulErr);
|
|
}
|
|
#if NOREBOOT
|
|
else if (0 == _tcsicmp(pptszArgv[nArgNdx+1], _T("addstdroot")))
|
|
{
|
|
ulErr = AddStdRoot(dwArgc-nArgNdx-2, pptszArgv+nArgNdx+2);
|
|
CHECK_ERR(ulErr);
|
|
}
|
|
else if (0 == _tcsicmp(pptszArgv[nArgNdx+1], _T("removestdroot")))
|
|
{
|
|
ulErr = RemoveStdRoot(dwArgc-nArgNdx-2, pptszArgv+nArgNdx+2);
|
|
CHECK_ERR(ulErr);
|
|
}
|
|
else if (0 == _tcsicmp(pptszArgv[nArgNdx+1], _T("addftroot")))
|
|
{
|
|
ulErr = AddFtRoot(dwArgc-nArgNdx-2, pptszArgv+nArgNdx+2);
|
|
CHECK_ERR(ulErr);
|
|
}
|
|
else if (0 == _tcsicmp(pptszArgv[nArgNdx+1], _T("removeftroot")))
|
|
{
|
|
ulErr = RemoveFtRoot(dwArgc-nArgNdx-2, pptszArgv+nArgNdx+2);
|
|
CHECK_ERR(ulErr);
|
|
}
|
|
else if (0 == _tcsicmp(pptszArgv[nArgNdx+1], _T("removeftrootforced")))
|
|
{
|
|
ulErr = RemoveFtRootForced(dwArgc-nArgNdx-2, pptszArgv+nArgNdx+2);
|
|
CHECK_ERR(ulErr);
|
|
}
|
|
else if (0 == _tcsicmp(pptszArgv[nArgNdx+1], _T("addstdrootforced")))
|
|
{
|
|
ulErr = AddStdRootForced(dwArgc-nArgNdx-2, pptszArgv+nArgNdx+2);
|
|
CHECK_ERR(ulErr);
|
|
}
|
|
#endif
|
|
else if (0 == _tcsicmp(pptszArgv[nArgNdx+1], _T("getdcaddress")))
|
|
{
|
|
ulErr = GetDcAddress(dwArgc-nArgNdx-2, pptszArgv+nArgNdx+2);
|
|
CHECK_ERR(ulErr);
|
|
}
|
|
#if 0
|
|
else if (0 == _tcsicmp(pptszArgv[nArgNdx+1], _T("setdcaddress")))
|
|
{
|
|
ulErr = SetDcAddress(dwArgc-nArgNdx-2, pptszArgv+nArgNdx+2);
|
|
CHECK_ERR(ulErr);
|
|
}
|
|
|
|
else if (0 == _tcsicmp(pptszArgv[nArgNdx+1], _T("wnetaddconnection")))
|
|
{
|
|
ulErr = AddConnection(dwArgc-nArgNdx-2, pptszArgv+nArgNdx+2);
|
|
CHECK_ERR(ulErr);
|
|
}
|
|
else if (0 == _tcsicmp(pptszArgv[nArgNdx+1], _T("wnetcancelconnection")))
|
|
{
|
|
ulErr = CancelConnection(dwArgc-nArgNdx-2, pptszArgv+nArgNdx+2);
|
|
CHECK_ERR(ulErr);
|
|
}
|
|
|
|
else if (0 == _tcsicmp(pptszArgv[nArgNdx+1], _T("addresstosite")))
|
|
{
|
|
ulErr = AddressToSite(dwArgc-nArgNdx-2, pptszArgv+nArgNdx+2);
|
|
CHECK_ERR(ulErr);
|
|
}
|
|
#endif
|
|
else
|
|
{
|
|
ulErr = ERROR_INVALID_PARAMETER;
|
|
|
|
CHECK_ERR(ulErr);
|
|
goto Error;
|
|
}
|
|
|
|
if (ERROR_SUCCESS != ulErr)
|
|
{
|
|
goto Error;
|
|
}
|
|
|
|
fprintf(stdout, "%ws completed successfully\n", pptszArgv[0]);
|
|
goto Cleanup;
|
|
|
|
Error:;
|
|
if (NULL != pptszArgv)
|
|
{
|
|
fprintf(stderr, "%ws failed: %lu\n", pptszArgv[0], ulErr);
|
|
}
|
|
goto Cleanup;
|
|
|
|
Cleanup:;
|
|
if (NULL != pptszArgv)
|
|
{
|
|
DWORD dwI = 0;
|
|
|
|
for (dwI=0; dwI < dwArgc; dwI++)
|
|
{
|
|
#ifdef UNICODE
|
|
if (NULL != pptszArgv[dwI])
|
|
{
|
|
free(pptszArgv[dwI]);
|
|
pptszArgv[dwI] = NULL;
|
|
} //if
|
|
#endif
|
|
} //for
|
|
|
|
free(pptszArgv);
|
|
pptszArgv = NULL;
|
|
} //if
|
|
|
|
if (fDebug != NULL && fDebug != stderr)
|
|
{
|
|
fclose(fDebug);
|
|
}
|
|
|
|
RETURN(ulErr);
|
|
}; //main
|
|
|
|
|
|
|
|
|
|
//+---------------------------------------------------------------------------
|
|
//
|
|
// Function: Usage
|
|
//
|
|
// Synopsis: This function prints a help message to stderr
|
|
//
|
|
// Arguments: None.
|
|
//
|
|
// Returns: ERROR_INVALID_PARAMETER
|
|
//
|
|
// Notes:
|
|
//
|
|
//----------------------------------------------------------------------------
|
|
ULONG Usage(LPSTR ptszAppName)
|
|
{
|
|
fprintf(stderr,
|
|
"Usage: %s [/debug:[<filename>]] <command> <options>\n\n"
|
|
"commands:\n"
|
|
"\tadd <dfsentrypath> <server> <share> [<comment> [<options>]]\n"
|
|
"\t [/range:<lo>-<hi>]\n"
|
|
"\t\toptions=add|restore\n"
|
|
"\t\t/range works with options=add only. When /range is present\n"
|
|
"\t\tthe command adds multiple links\n"
|
|
"\tremove <dfsentrypath> [<server> <share>]\n"
|
|
"\tenum <dfsname> <level> [<prefmaxlen>]\n"
|
|
"\t\tprefmaxlen=integer greater than 0 (resume only)\n"
|
|
"\t\tlevel=1,2,3,4,200,300\n"
|
|
"\tgetinfo <dfsentrypath> <server> <share> <level>\n"
|
|
"\t\tlevel=1,2,3,4,100\n"
|
|
"\tsetinfo <dfsentrypath> <server> <share> <level> <options>\n"
|
|
"\t\tlevel=100, options=<comment>, no <server>, <share>\n"
|
|
"\t\tlevel=101, options=[active] [offline] [online] when <server> is not null\n"
|
|
"\t\tlevel=101, options=ok|inconsistent|offline|online when <server> is null\n"
|
|
"\t\tlevel=102, options=<timeout>, no <server>, <share>\n"
|
|
"\tgetclientinfo <dfsentrypath> [<server> <share>] <level>\n"
|
|
"\t\tlevel=1,2,3,4\n"
|
|
"\tsetclientinfo <dfsentrypath> [<server> <share>] <level> <options>\n"
|
|
"\t\tlevel=101, options=[active] [offline] [online]\n"
|
|
"\t\tlevel=102, options=<timeout>, no <server>, <share>\n"
|
|
#if NOREBOOT
|
|
"\taddstdroot <servername> <rootshare> [<comment> [<options>]]\n"
|
|
"\tremovestdroot <servername> <rootshare> [<options>]\n"
|
|
"\taddftroot <servername> <rootshare> <ftdfsname> [<options>]\n"
|
|
"\tremoveftroot <servername> <rootshare> <ftdfsname> [<options>]\n"
|
|
"\tremoveftrootforced <domainname> <servername> <rootshare> "
|
|
"<ftdfsname> [<options>]\n"
|
|
"\taddstdrootforced <servername> <rootshare> [<comment>] <store>\n"
|
|
#endif
|
|
"\tgetdcaddress <servername>\n"
|
|
#if 0
|
|
"\tsetdcaddress <servername> <dcipaddress> <timeout> [<flags>]\n"
|
|
#endif
|
|
"\twnetaddconnection <level> <remotename> <password> [<localname>] [<level2params>]\n"
|
|
"\t\tlevel=1|2\n"
|
|
"\t\tlocalname=<driverletter>:, *, LPT1, etc.\n"
|
|
"\t\tlevel2params=<type> [<provider>] [<username>] [<flags>]\n"
|
|
"\t\ttype=disk|print|any\n"
|
|
"\t\tflags=[update_profile] [update_recent] "
|
|
"[temporary] [interactive] [prompt] [need_drive] [refcount] "
|
|
"[redirect] [localdrive] [current_media] [deferred]\n"
|
|
"\twnetcancelconnection <level> <localname> [<flags>] [force]\n"
|
|
"\t\tlevel=1|2\n"
|
|
"\t\tlocalname=<driverletter>:, etc\n"
|
|
"\t\tflags=[update_profile] [update_recent] "
|
|
"[temporary] [interactive] [prompt] [need_drive] [refcount] "
|
|
"[redirect] [localdrive] [current_media] [deferred]\n"
|
|
"\t\tforce=if present, the deletion of the connection is forced\n"
|
|
"\n"
|
|
"\taddresstosite <dcname> <ipaddress>\n\n"
|
|
"To specify a NULL string in the middle of the command, use "
|
|
"\"\".\n"
|
|
"Example: setinfo \\\\myserver\\myentrypath \"\" \"\" "
|
|
"100 \"My comment\".\n",
|
|
ptszAppName);
|
|
RETURN(ERROR_INVALID_PARAMETER);
|
|
};//Usage
|
|
|
|
|
|
|
|
|
|
//+---------------------------------------------------------------------------
|
|
//
|
|
// Function: Add
|
|
//
|
|
// Synopsis: This function performs NetDfsAdd.
|
|
//
|
|
// Arguments: [dwArg] the number of arguments
|
|
// [pptszArg] the arguments
|
|
//
|
|
// Returns: ERROR_INVALID_PARAMETER
|
|
//
|
|
// Notes:
|
|
//
|
|
//----------------------------------------------------------------------------
|
|
ULONG Add(DWORD dwArgc, LPTSTR* pptszArgv)
|
|
{
|
|
ULONG ulErr = ERROR_SUCCESS;
|
|
DWORD dwFlags = 0;
|
|
ULONG ulLo = 0;
|
|
ULONG ulHi = 0;
|
|
LPTSTR ptszVolName = NULL;
|
|
LPTSTR ptszRange = NULL;
|
|
LPTSTR ptszMinus = NULL;
|
|
|
|
MSG(fDebug, "Entering Add(%lu,...)\n", dwArgc);
|
|
if (dwArgc < 3 || NULL == pptszArgv || dwArgc > 6)
|
|
{
|
|
MSG(fDebug, "%lu < 3 || NULL == pptszArgv || %lu > 6",
|
|
dwArgc,
|
|
dwArgc);
|
|
RETURN(ERROR_INVALID_PARAMETER);
|
|
}
|
|
|
|
if (4 < dwArgc)
|
|
{
|
|
if (0 == _tcsicmp(pptszArgv[4], _T("add")))
|
|
{
|
|
dwFlags = DFS_ADD_VOLUME;
|
|
}
|
|
else if (0 == _tcsicmp(pptszArgv[4], _T("restore")))
|
|
{
|
|
dwFlags = DFS_RESTORE_VOLUME;
|
|
}
|
|
else
|
|
{
|
|
RETURN(ERROR_INVALID_PARAMETER);
|
|
}
|
|
}
|
|
|
|
if (5 < dwArgc)
|
|
{
|
|
if (0 != _tcsnicmp(pptszArgv[5],
|
|
_T("/range:"),
|
|
_tcslen(_T("/range:"))))
|
|
{
|
|
RETURN(ERROR_INVALID_PARAMETER);
|
|
}
|
|
|
|
ptszRange = pptszArgv[5]+_tcslen(_T("/range:"));
|
|
if (NULL == (ptszMinus = _tcschr(ptszRange, _T('-'))))
|
|
{
|
|
RETURN(ERROR_INVALID_PARAMETER);
|
|
}
|
|
|
|
*ptszMinus = _T('\0');
|
|
ulLo = _ttol(ptszRange);
|
|
|
|
*ptszMinus = _T('-');
|
|
ulHi = _ttol(ptszMinus+1);
|
|
|
|
if (ulLo > ulHi)
|
|
{
|
|
RETURN(ERROR_INVALID_PARAMETER);
|
|
}
|
|
}
|
|
|
|
MSG(fDebug,
|
|
"Calling NetDfsAdd(%ws, %ws, %ws, %ws, %lu)\n",
|
|
GetStringParam(pptszArgv[0]),
|
|
GetStringParam(pptszArgv[1]),
|
|
GetStringParam(pptszArgv[2]),
|
|
GetStringParam(pptszArgv[3]),
|
|
dwFlags);
|
|
if (0 == ulLo && 0 == ulHi)
|
|
{
|
|
ulErr = NetDfsAdd(GetStringParam(pptszArgv[0]),
|
|
GetStringParam(pptszArgv[1]),
|
|
GetStringParam(pptszArgv[2]),
|
|
GetStringParam(pptszArgv[3]),
|
|
dwFlags);
|
|
}
|
|
else
|
|
{
|
|
ULONG ulLen = 0;
|
|
|
|
if (NULL != GetStringParam(pptszArgv[0]))
|
|
{
|
|
ulLen += _tcslen(GetStringParam(pptszArgv[0]));
|
|
}
|
|
|
|
ptszVolName = new TCHAR[ulLen+11];
|
|
if (NULL != ptszVolName)
|
|
{
|
|
memset(ptszVolName, 0, (11+ulLen) * sizeof(TCHAR));
|
|
if (NULL != GetStringParam(pptszArgv[0]))
|
|
{
|
|
_tcscpy(ptszVolName, GetStringParam(pptszArgv[0]));
|
|
}
|
|
|
|
for (ULONG i=ulLo;
|
|
i <= ulHi && ERROR_SUCCESS == ulErr;
|
|
i++)
|
|
{
|
|
memset(ptszVolName+ulLen, 0, sizeof(TCHAR)*11);
|
|
_ltot(i, ptszVolName+ulLen, 10);
|
|
|
|
ulErr = NetDfsAdd(ptszVolName,
|
|
GetStringParam(pptszArgv[1]),
|
|
GetStringParam(pptszArgv[2]),
|
|
GetStringParam(pptszArgv[3]),
|
|
dwFlags);
|
|
MSG(fDebug,
|
|
"NetDfsAdd(%ws, %ws, %ws, %ws, %lu) %s\n",
|
|
ptszVolName,
|
|
GetStringParam(pptszArgv[1]),
|
|
GetStringParam(pptszArgv[2]),
|
|
GetStringParam(pptszArgv[3]),
|
|
dwFlags,
|
|
((ERROR_SUCCESS == ulErr) ? "succeded" : "failed"));
|
|
} //for
|
|
|
|
delete [] ptszVolName;
|
|
}
|
|
else
|
|
{
|
|
MSG(fDebug,
|
|
"Error %lu: not enough memory\n",
|
|
ulErr = ERROR_NOT_ENOUGH_MEMORY);
|
|
} //else
|
|
} //else
|
|
|
|
MSG(fDebug, "Exiting Add(..) with %lu\n", ulErr);
|
|
RETURN(ulErr);
|
|
}; //Add
|
|
|
|
|
|
|
|
|
|
//+---------------------------------------------------------------------------
|
|
//
|
|
// Function: Remove
|
|
//
|
|
// Synopsis: This function performs NetDfsRemove.
|
|
//
|
|
// Arguments: [dwArg] the number of arguments
|
|
// [pptszArg] the arguments
|
|
//
|
|
// Returns: ERROR_INVALID_PARAMETER
|
|
//
|
|
// Notes:
|
|
//
|
|
//----------------------------------------------------------------------------
|
|
ULONG Remove(DWORD dwArgc, LPTSTR* pptszArgv)
|
|
{
|
|
ULONG ulErr = ERROR_SUCCESS;
|
|
|
|
MSG(fDebug, "Entering Remove(%lu,..)\n", dwArgc);
|
|
if (dwArgc < 1 || dwArgc > 3 || NULL == pptszArgv ||
|
|
dwArgc > 1 && NULL == pptszArgv[1] ||
|
|
dwArgc > 2 && NULL == pptszArgv[2] ||
|
|
2 == dwArgc)
|
|
{
|
|
MSG(fDebug,
|
|
"%lu < 1 || %lu > 3 || NULL == pptszArgv ||"
|
|
" %lu > 1 && NULL == %ws ||"
|
|
" %lu > 2 && NULL == %ws ||"
|
|
" 2 == %lu",
|
|
dwArgc, dwArgc, dwArgc, pptszArgv[1], dwArgc,
|
|
pptszArgv[2], dwArgc);
|
|
RETURN(ERROR_INVALID_PARAMETER);
|
|
} //if
|
|
|
|
MSG(fDebug, "Calling NetDfsRemove(%ws, %ws, %ws)\n",
|
|
GetStringParam(pptszArgv[0]),
|
|
GetStringParam(pptszArgv[1]),
|
|
GetStringParam(pptszArgv[2]));
|
|
ulErr = NetDfsRemove(GetStringParam(pptszArgv[0]),
|
|
GetStringParam(pptszArgv[1]),
|
|
GetStringParam(pptszArgv[2]));
|
|
|
|
MSG(fDebug, "Exiting Remove(..) with %lu\n", ulErr);
|
|
RETURN(ulErr);
|
|
}; //Remove
|
|
|
|
|
|
|
|
|
|
//+---------------------------------------------------------------------------
|
|
//
|
|
// Function: Enum
|
|
//
|
|
// Synopsis: This function performs NetDfsEnum.
|
|
//
|
|
// Arguments: [dwArg] the number of arguments
|
|
// [pptszArg] the arguments
|
|
//
|
|
// Returns: ERROR_INVALID_PARAMETER
|
|
//
|
|
// Notes:
|
|
//
|
|
//----------------------------------------------------------------------------
|
|
ULONG Enum(DWORD dwArgc, LPTSTR* pptszArgv)
|
|
{
|
|
ULONG ulErr = ERROR_SUCCESS;
|
|
DWORD dwLevel = 0;
|
|
DWORD dwPrefMaxLen = (DWORD)-1;
|
|
LPBYTE pBuffer = NULL;
|
|
DWORD dwEntriesRead = 0;
|
|
DWORD dwResumeHandle = 0;
|
|
|
|
MSG(fDebug, "Entering Enum(%lu,..)\n",
|
|
dwArgc);
|
|
if (dwArgc < 2 ||
|
|
NULL == pptszArgv)
|
|
{
|
|
MSG(fDebug,
|
|
"%lu < 2 || NULL == pptszArgv\n",
|
|
dwArgc);
|
|
RETURN(ERROR_INVALID_PARAMETER);
|
|
}
|
|
|
|
if (0 == _tcsicmp(pptszArgv[1], _T("1")))
|
|
{
|
|
dwLevel = 1;
|
|
dwPrefMaxLen = sizeof(DFS_INFO_1);
|
|
}
|
|
else if (0 == _tcsicmp(pptszArgv[1], _T("2")))
|
|
{
|
|
dwLevel = 2;
|
|
dwPrefMaxLen = sizeof(DFS_INFO_2);
|
|
}
|
|
else if (0 == _tcsicmp(pptszArgv[1], _T("3")))
|
|
{
|
|
dwLevel = 3;
|
|
dwPrefMaxLen = sizeof(DFS_INFO_3);
|
|
}
|
|
else if (0 == _tcsicmp(pptszArgv[1], _T("4")))
|
|
{
|
|
dwLevel = 4;
|
|
dwPrefMaxLen = sizeof(DFS_INFO_4);
|
|
}
|
|
else if (0 == _tcsicmp(pptszArgv[1], _T("200")))
|
|
{
|
|
dwLevel = 200;
|
|
dwPrefMaxLen = sizeof(DFS_INFO_200);
|
|
}
|
|
else if (0 == _tcsicmp(pptszArgv[1], _T("300")))
|
|
{
|
|
dwLevel = 300;
|
|
dwPrefMaxLen = sizeof(DFS_INFO_300);
|
|
}
|
|
else
|
|
{
|
|
RETURN(ERROR_INVALID_PARAMETER);
|
|
}
|
|
|
|
if (2 == dwArgc)
|
|
{
|
|
dwPrefMaxLen = (DWORD)-1;
|
|
}
|
|
else
|
|
{
|
|
if (3 != dwArgc || NULL == pptszArgv[2] ||
|
|
0 >= _ttoi(pptszArgv[2]))
|
|
{
|
|
RETURN(ERROR_INVALID_PARAMETER);
|
|
} //if
|
|
|
|
dwPrefMaxLen *= _ttoi(pptszArgv[2]);
|
|
}
|
|
|
|
MSG(fDebug, "Calling NetDfsEnum(%ws,%lu,%lu,..,..,%lu)\n",
|
|
pptszArgv[0], dwLevel, dwPrefMaxLen, dwResumeHandle);
|
|
ulErr = NetDfsEnum(GetStringParam(pptszArgv[0]),
|
|
dwLevel,
|
|
dwPrefMaxLen,
|
|
&pBuffer,
|
|
&dwEntriesRead,
|
|
&dwResumeHandle);
|
|
if (ERROR_SUCCESS != ulErr)
|
|
{
|
|
goto Error;
|
|
}
|
|
|
|
if ((DWORD)-1 == dwPrefMaxLen)
|
|
{
|
|
LPBYTE pCurBuffer = pBuffer;
|
|
for (DWORD i=0; i<dwEntriesRead; i++)
|
|
{
|
|
ulErr = PrintDfsInfo(dwLevel, pCurBuffer);
|
|
if (ERROR_SUCCESS != ulErr)
|
|
{
|
|
goto Error;
|
|
}
|
|
|
|
switch (dwLevel)
|
|
{
|
|
case 1:
|
|
pCurBuffer = (LPBYTE)(((PDFS_INFO_1)pCurBuffer)+1);
|
|
break;
|
|
case 2:
|
|
pCurBuffer = (LPBYTE)(((PDFS_INFO_2)pCurBuffer)+1);
|
|
break;
|
|
case 3:
|
|
pCurBuffer = (LPBYTE)(((PDFS_INFO_3)pCurBuffer)+1);
|
|
break;
|
|
case 4:
|
|
pCurBuffer = (LPBYTE)(((PDFS_INFO_4)pCurBuffer)+1);
|
|
break;
|
|
case 200:
|
|
pCurBuffer = (LPBYTE)(((PDFS_INFO_200)pCurBuffer)+1);
|
|
break;
|
|
case 300:
|
|
pCurBuffer = (LPBYTE)(((PDFS_INFO_300)pCurBuffer)+1);
|
|
break;
|
|
default:
|
|
ulErr = ERROR_INVALID_PARAMETER;
|
|
goto Error;
|
|
} //switch
|
|
} //for
|
|
}
|
|
else
|
|
{
|
|
do
|
|
{
|
|
LPBYTE pCurBuffer = pBuffer;
|
|
for (DWORD i=0; i<dwEntriesRead; i++)
|
|
{
|
|
ulErr = PrintDfsInfo(dwLevel, pCurBuffer);
|
|
if (ERROR_SUCCESS != ulErr)
|
|
{
|
|
goto Error;
|
|
}
|
|
|
|
switch (dwLevel)
|
|
{
|
|
case 1:
|
|
pCurBuffer = (LPBYTE)(((PDFS_INFO_1)pCurBuffer)+1);
|
|
break;
|
|
case 2:
|
|
pCurBuffer = (LPBYTE)(((PDFS_INFO_2)pCurBuffer)+1);
|
|
break;
|
|
case 3:
|
|
pCurBuffer = (LPBYTE)(((PDFS_INFO_3)pCurBuffer)+1);
|
|
break;
|
|
case 4:
|
|
pCurBuffer = (LPBYTE)(((PDFS_INFO_4)pCurBuffer)+1);
|
|
break;
|
|
case 200:
|
|
pCurBuffer = (LPBYTE)(((PDFS_INFO_200)pCurBuffer)+1);
|
|
break;
|
|
case 300:
|
|
pCurBuffer = (LPBYTE)(((PDFS_INFO_300)pCurBuffer)+1);
|
|
break;
|
|
|
|
default:
|
|
ulErr = ERROR_INVALID_PARAMETER;
|
|
goto Error;
|
|
} //switch
|
|
} //for
|
|
|
|
if (NULL != pBuffer)
|
|
{
|
|
NetApiBufferFree(pBuffer);
|
|
pBuffer = NULL;
|
|
}
|
|
|
|
MSG(fDebug,
|
|
"Calling NetDfsEnum(%ws, %lu, %lu,..,..,%lu)\n",
|
|
GetStringParam(pptszArgv[0]),
|
|
dwLevel,
|
|
dwPrefMaxLen,
|
|
dwResumeHandle);
|
|
ulErr = NetDfsEnum(
|
|
GetStringParam(pptszArgv[0]),
|
|
dwLevel,
|
|
dwPrefMaxLen,
|
|
&pBuffer,
|
|
&dwEntriesRead,
|
|
&dwResumeHandle);
|
|
if (ERROR_NO_MORE_ITEMS == ulErr)
|
|
{
|
|
if (0 != dwEntriesRead)
|
|
{
|
|
continue;
|
|
}
|
|
else
|
|
{
|
|
ulErr = ERROR_SUCCESS;
|
|
break;
|
|
}
|
|
} //if
|
|
|
|
if (ERROR_SUCCESS != ulErr)
|
|
{
|
|
goto Error;
|
|
}
|
|
}
|
|
while(TRUE);
|
|
} //else
|
|
|
|
Error:;
|
|
if (NULL != pBuffer)
|
|
{
|
|
NetApiBufferFree(pBuffer);
|
|
pBuffer = NULL;
|
|
}
|
|
|
|
MSG(fDebug,
|
|
"Exiting Enum with %lu\n",
|
|
ulErr);
|
|
RETURN(ulErr);
|
|
}; //Enum
|
|
|
|
|
|
|
|
|
|
|
|
//+---------------------------------------------------------------------------
|
|
//
|
|
// Function: GetInfo
|
|
//
|
|
// Synopsis: This function performs NetDfsGetInfo.
|
|
//
|
|
// Arguments: [dwArg] the number of arguments
|
|
// [pptszArg] the arguments
|
|
//
|
|
// Returns: ERROR_INVALID_PARAMETER
|
|
//
|
|
// Notes:
|
|
//
|
|
//----------------------------------------------------------------------------
|
|
ULONG GetInfo(DWORD dwArgc, LPTSTR* pptszArgv)
|
|
{
|
|
ULONG ulErr = ERROR_SUCCESS;
|
|
DWORD dwLevel = 0;
|
|
LPBYTE pBuffer = NULL;
|
|
|
|
MSG(fDebug,
|
|
"Entering GetInfo(%lu,..)\n",
|
|
dwArgc);
|
|
if (4 != dwArgc || NULL == pptszArgv)
|
|
{
|
|
MSG(fDebug, "4 != %lu || NULL == pptszArgv",
|
|
dwArgc);
|
|
RETURN(ERROR_INVALID_PARAMETER);
|
|
}
|
|
|
|
if (0 == _tcsicmp(pptszArgv[3], _T("1")))
|
|
{
|
|
dwLevel = 1;
|
|
}
|
|
else if (0 == _tcsicmp(pptszArgv[3], _T("2")))
|
|
{
|
|
dwLevel = 2;
|
|
}
|
|
else if (0 == _tcsicmp(pptszArgv[3], _T("3")))
|
|
{
|
|
dwLevel = 3;
|
|
}
|
|
else if (0 == _tcsicmp(pptszArgv[3], _T("4")))
|
|
{
|
|
dwLevel = 4;
|
|
}
|
|
else if (0 == _tcsicmp(pptszArgv[3], _T("100")))
|
|
{
|
|
dwLevel = 100;
|
|
}
|
|
else
|
|
{
|
|
RETURN(ERROR_INVALID_PARAMETER);
|
|
}
|
|
|
|
MSG(fDebug, "Calling NetDfsGetInfo(%ws,%ws,%ws,%lu,..)\n",
|
|
GetStringParam(pptszArgv[0]),
|
|
GetStringParam(pptszArgv[1]),
|
|
GetStringParam(pptszArgv[2]),
|
|
dwLevel);
|
|
ulErr = NetDfsGetInfo(
|
|
GetStringParam(pptszArgv[0]),
|
|
GetStringParam(pptszArgv[1]),
|
|
GetStringParam(pptszArgv[2]),
|
|
dwLevel,
|
|
&pBuffer);
|
|
|
|
if (ERROR_SUCCESS == ulErr)
|
|
{
|
|
ulErr = PrintDfsInfo(dwLevel, pBuffer);
|
|
}
|
|
|
|
if (NULL != pBuffer)
|
|
{
|
|
NetApiBufferFree(pBuffer);
|
|
pBuffer = NULL;
|
|
}
|
|
|
|
MSG(fDebug, "Exiting GetInfo(..) with %lu\n", ulErr);
|
|
RETURN(ulErr);
|
|
}; //GetInfo
|
|
|
|
|
|
|
|
|
|
|
|
//+---------------------------------------------------------------------------
|
|
//
|
|
// Function: SetInfo
|
|
//
|
|
// Synopsis: This function performs NetDfsSetInfo.
|
|
//
|
|
// Arguments: [dwArg] the number of arguments
|
|
// [pptszArg] the arguments
|
|
//
|
|
// Returns: ERROR_INVALID_PARAMETER
|
|
//
|
|
// Notes:
|
|
//
|
|
//----------------------------------------------------------------------------
|
|
ULONG SetInfo(DWORD dwArgc, LPTSTR* pptszArgv)
|
|
{
|
|
ULONG ulErr = ERROR_SUCCESS;
|
|
DWORD dwFlags = 0;
|
|
DWORD dwTimeout = 0;
|
|
DWORD i = 0;
|
|
|
|
MSG(fDebug,
|
|
"Calling SetInfo(%lu,..)\n",
|
|
dwArgc);
|
|
if (dwArgc < 4 || NULL == pptszArgv)
|
|
{
|
|
MSG(fDebug,
|
|
"%lu < 4 || NULL == pptszArgv",
|
|
dwArgc);
|
|
RETURN(ERROR_INVALID_PARAMETER);
|
|
} //if
|
|
|
|
if (0 == _tcsicmp(pptszArgv[3], _T("100")))
|
|
{
|
|
DFS_INFO_100 info;
|
|
|
|
if (4 < dwArgc)
|
|
{
|
|
if (5 != dwArgc)
|
|
{
|
|
MSG(fDebug,
|
|
"%ws == \"100\" && 5 != %dwArgc\n",
|
|
pptszArgv[3], dwArgc);
|
|
RETURN(ERROR_INVALID_PARAMETER);
|
|
}
|
|
|
|
info.Comment = pptszArgv[4];
|
|
} //if
|
|
|
|
MSG(fDebug,
|
|
"Calling NetDfsSetInfo(%ws,%ws,%ws,%lu,..)\n",
|
|
GetStringParam(pptszArgv[0]),
|
|
GetStringParam(pptszArgv[1]),
|
|
GetStringParam(pptszArgv[2]),
|
|
100);
|
|
ulErr = NetDfsSetInfo(
|
|
GetStringParam(pptszArgv[0]),
|
|
GetStringParam(pptszArgv[1]),
|
|
GetStringParam(pptszArgv[2]),
|
|
100,
|
|
(LPBYTE)&info);
|
|
}
|
|
else if (0 == _tcsicmp(pptszArgv[3], _T("101")))
|
|
{
|
|
DFS_INFO_101 info;
|
|
|
|
info.State = 0;
|
|
if (4 < dwArgc)
|
|
{
|
|
if (8 < dwArgc)
|
|
{
|
|
MSG(fDebug,
|
|
"%ws==\"101\" && "
|
|
"4 < %lu && "
|
|
"8 < %lu",
|
|
pptszArgv[3], dwArgc, dwArgc);
|
|
RETURN(ERROR_INVALID_PARAMETER);
|
|
} //if
|
|
|
|
if (NULL != GetStringParam(pptszArgv[1]))
|
|
{
|
|
if (NULL == GetStringParam(pptszArgv[2]))
|
|
{
|
|
MSG(fDebug,
|
|
"4 < %lu && "
|
|
"NULL != %ws && "
|
|
"NULL == %ws\n",
|
|
dwArgc, GetStringParam(pptszArgv[1]),
|
|
GetStringParam(pptszArgv[2]));
|
|
RETURN(ERROR_INVALID_PARAMETER);
|
|
}
|
|
|
|
for (i = 4; i<dwArgc; i++)
|
|
{
|
|
if (0 == _tcsicmp(pptszArgv[i], _T("active")))
|
|
{
|
|
if (0 != (info.State & DFS_STORAGE_STATE_ACTIVE))
|
|
{
|
|
RETURN(ERROR_INVALID_PARAMETER);
|
|
}
|
|
info.State |= DFS_STORAGE_STATE_ACTIVE;
|
|
}
|
|
else if (0 == _tcsicmp(pptszArgv[i], _T("offline")))
|
|
{
|
|
if (0 != (info.State & DFS_STORAGE_STATE_OFFLINE))
|
|
{
|
|
RETURN(ERROR_INVALID_PARAMETER);
|
|
}
|
|
info.State |= DFS_STORAGE_STATE_OFFLINE;
|
|
}
|
|
else if (0 == _tcsicmp(pptszArgv[i], _T("online")))
|
|
{
|
|
if (0 != (info.State & DFS_STORAGE_STATE_ONLINE))
|
|
{
|
|
RETURN(ERROR_INVALID_PARAMETER);
|
|
}
|
|
info.State |= DFS_STORAGE_STATE_ONLINE;
|
|
}
|
|
else if (0 == _tcsicmp(pptszArgv[i], _T("standby")))
|
|
{
|
|
if (0 != (info.State & DFS_STORAGE_STATE_STANDBY))
|
|
{
|
|
RETURN(ERROR_INVALID_PARAMETER);
|
|
}
|
|
info.State |= DFS_VOLUME_STATE_STANDBY;
|
|
}
|
|
else if (0 == _tcsicmp(pptszArgv[i], _T("master")))
|
|
{
|
|
if (0 != (info.State & DFS_STORAGE_STATE_MASTER))
|
|
{
|
|
RETURN(ERROR_INVALID_PARAMETER);
|
|
}
|
|
info.State |= DFS_VOLUME_STATE_RESYNCHRONIZE;
|
|
}
|
|
else
|
|
{
|
|
RETURN(ERROR_INVALID_PARAMETER);
|
|
}
|
|
} //for i
|
|
}
|
|
else
|
|
{
|
|
if (0 == _tcsicmp(pptszArgv[i], _T("ok")))
|
|
{
|
|
info.State = DFS_VOLUME_STATE_OK;
|
|
}
|
|
else if (0 == _tcsicmp(pptszArgv[i], _T("inconsistent")))
|
|
{
|
|
info.State = DFS_VOLUME_STATE_INCONSISTENT;
|
|
}
|
|
else if (0 == _tcsicmp(pptszArgv[i], _T("offline")))
|
|
{
|
|
info.State = DFS_VOLUME_STATE_OFFLINE;
|
|
}
|
|
else if (0 == _tcsicmp(pptszArgv[i], _T("online")))
|
|
{
|
|
info.State = DFS_VOLUME_STATE_ONLINE;
|
|
}
|
|
else
|
|
{
|
|
RETURN(ERROR_INVALID_PARAMETER);
|
|
}
|
|
} //else
|
|
} //if
|
|
|
|
MSG(fDebug,
|
|
"Calling NetDfsSetInfo(%ws,%ws,%ws,%lu,..)\n",
|
|
GetStringParam(pptszArgv[0]),
|
|
GetStringParam(pptszArgv[1]),
|
|
GetStringParam(pptszArgv[2]),
|
|
101);
|
|
ulErr = NetDfsSetInfo(GetStringParam(pptszArgv[0]),
|
|
GetStringParam(pptszArgv[1]),
|
|
GetStringParam(pptszArgv[2]),
|
|
101,
|
|
(LPBYTE)&info);
|
|
}
|
|
else if (0 == _tcsicmp(pptszArgv[3], _T("102")))
|
|
{
|
|
DFS_INFO_102 info;
|
|
|
|
if (5 != dwArgc)
|
|
{
|
|
MSG(fDebug,
|
|
"%ws==\"102\" && "
|
|
"5 != %lu\n",
|
|
pptszArgv[3], dwArgc);
|
|
RETURN(ERROR_INVALID_PARAMETER);
|
|
} //if
|
|
|
|
if (0 == _tcsicmp(pptszArgv[4], _T("0")))
|
|
{
|
|
dwTimeout = 0;
|
|
}
|
|
else
|
|
{
|
|
if (0 == (dwTimeout = _ttoi(pptszArgv[4])))
|
|
{
|
|
MSG(fDebug,
|
|
"%ws==\"102\" && "
|
|
"0 == %lu\n",
|
|
pptszArgv[4],
|
|
dwTimeout);
|
|
RETURN(ERROR_INVALID_PARAMETER);
|
|
} //if
|
|
} //else
|
|
|
|
info.Timeout = dwTimeout;
|
|
|
|
MSG(fDebug,
|
|
"Calling NetDfsSetInfo(%ws,%ws,%ws,%lu,..)\n",
|
|
GetStringParam(pptszArgv[0]),
|
|
GetStringParam(pptszArgv[1]),
|
|
GetStringParam(pptszArgv[2]),
|
|
102);
|
|
ulErr = NetDfsSetInfo(
|
|
GetStringParam(pptszArgv[0]),
|
|
GetStringParam(pptszArgv[1]),
|
|
GetStringParam(pptszArgv[2]),
|
|
102,
|
|
(LPBYTE)&info);
|
|
}
|
|
else
|
|
{
|
|
MSG(fDebug, "Invalid first parameter\n");
|
|
RETURN(ERROR_INVALID_PARAMETER);
|
|
}
|
|
|
|
MSG(fDebug,
|
|
"Exiting SetInfo(..) with %lu", ulErr);
|
|
RETURN(ulErr);
|
|
}; //SetInfo
|
|
|
|
|
|
|
|
|
|
|
|
//+---------------------------------------------------------------------------
|
|
//
|
|
// Function: GetClientInfo
|
|
//
|
|
// Synopsis: This function performs NetDfsGetClientInfo.
|
|
//
|
|
// Arguments: [dwArg] the number of arguments
|
|
// [pptszArg] the arguments
|
|
//
|
|
// Returns: ERROR_INVALID_PARAMETER
|
|
//
|
|
// Notes:
|
|
//
|
|
//----------------------------------------------------------------------------
|
|
ULONG GetClientInfo(DWORD dwArgc, LPTSTR* pptszArgv)
|
|
{
|
|
ULONG ulErr = ERROR_SUCCESS;
|
|
DWORD dwLevel = 0;
|
|
LPBYTE pBuffer = NULL;
|
|
|
|
MSG(fDebug,
|
|
"Entering GetClientInfo(%lu,..)\n",
|
|
dwArgc);
|
|
if (4 != dwArgc || NULL == pptszArgv)
|
|
{
|
|
MSG(fDebug,
|
|
"4 != %lu || NULL == pptszArgv",
|
|
dwArgc);
|
|
RETURN(ERROR_INVALID_PARAMETER);
|
|
}
|
|
|
|
if (0 == _tcsicmp(pptszArgv[3], _T("1")))
|
|
{
|
|
dwLevel = 1;
|
|
}
|
|
else if (0 == _tcsicmp(pptszArgv[3], _T("2")))
|
|
{
|
|
dwLevel = 2;
|
|
}
|
|
else if (0 == _tcsicmp(pptszArgv[3], _T("3")))
|
|
{
|
|
dwLevel = 3;
|
|
}
|
|
else if (0 == _tcsicmp(pptszArgv[3], _T("4")))
|
|
{
|
|
dwLevel = 4;
|
|
}
|
|
else
|
|
{
|
|
RETURN(ERROR_INVALID_PARAMETER);
|
|
}
|
|
|
|
MSG(fDebug,
|
|
"Calling NetDfsGetClientInfo"
|
|
"(%ws,%ws,%ws,%lu,..)\n",
|
|
GetStringParam(pptszArgv[0]),
|
|
GetStringParam(pptszArgv[1]),
|
|
GetStringParam(pptszArgv[2]),
|
|
dwLevel);
|
|
ulErr = NetDfsGetClientInfo(
|
|
GetStringParam(pptszArgv[0]),
|
|
GetStringParam(pptszArgv[1]),
|
|
GetStringParam(pptszArgv[2]),
|
|
dwLevel,
|
|
&pBuffer);
|
|
|
|
if (ERROR_SUCCESS == ulErr)
|
|
{
|
|
ulErr = PrintDfsInfo(dwLevel, pBuffer);
|
|
}
|
|
|
|
if (NULL != pBuffer)
|
|
{
|
|
NetApiBufferFree(pBuffer);
|
|
pBuffer = NULL;
|
|
}
|
|
|
|
MSG(fDebug, "Exiting GetClientInfo(..) with %lu\n", ulErr);
|
|
RETURN(ulErr);
|
|
}; //GetClientInfo
|
|
|
|
|
|
|
|
|
|
|
|
//+---------------------------------------------------------------------------
|
|
//
|
|
// Function: SetClientInfo
|
|
//
|
|
// Synopsis: This function performs NetDfsSetClientInfo.
|
|
//
|
|
// Arguments: [dwArg] the number of arguments
|
|
// [pptszArg] the arguments
|
|
//
|
|
// Returns: ERROR_INVALID_PARAMETER
|
|
//
|
|
// Notes:
|
|
//
|
|
//----------------------------------------------------------------------------
|
|
ULONG SetClientInfo(DWORD dwArgc, LPTSTR* pptszArgv)
|
|
{
|
|
ULONG ulErr = ERROR_SUCCESS;
|
|
DWORD dwFlags = 0;
|
|
DWORD dwTimeout = 0;
|
|
DWORD i = 0;
|
|
|
|
MSG(fDebug, "Entering SetClientInfo(%lu,..)\n",
|
|
dwArgc);
|
|
if (dwArgc < 4 || NULL == pptszArgv)
|
|
{
|
|
MSG(fDebug,
|
|
"%lu < 4 || NULL == pptszArgv\n",
|
|
dwArgc);
|
|
RETURN(ERROR_INVALID_PARAMETER);
|
|
} //if
|
|
|
|
if (0 == _tcsicmp(pptszArgv[3], _T("101")))
|
|
{
|
|
DFS_INFO_101 info;
|
|
|
|
info.State = 0;
|
|
if (4 < dwArgc)
|
|
{
|
|
if (8 < dwArgc)
|
|
{
|
|
MSG(fDebug,
|
|
"%ws == \"101\" && "
|
|
"4 < %lu && "
|
|
"8 < %lu\n",
|
|
pptszArgv[3],
|
|
dwArgc,
|
|
dwArgc);
|
|
RETURN(ERROR_INVALID_PARAMETER);
|
|
} //if
|
|
|
|
for (i = 4; i<dwArgc; i++)
|
|
{
|
|
if (0 == _tcsicmp(pptszArgv[i], _T("active")))
|
|
{
|
|
if (0 != (info.State & DFS_STORAGE_STATE_ACTIVE))
|
|
{
|
|
RETURN(ERROR_INVALID_PARAMETER);
|
|
}
|
|
info.State |= DFS_STORAGE_STATE_ACTIVE;
|
|
}
|
|
else if (0 == _tcsicmp(pptszArgv[i], _T("offline")))
|
|
{
|
|
if (0 != (info.State & DFS_STORAGE_STATE_OFFLINE))
|
|
{
|
|
RETURN(ERROR_INVALID_PARAMETER);
|
|
}
|
|
info.State |= DFS_STORAGE_STATE_OFFLINE;
|
|
}
|
|
else if (0 == _tcsicmp(pptszArgv[i], _T("online")))
|
|
{
|
|
if (0 != (info.State & DFS_STORAGE_STATE_ONLINE))
|
|
{
|
|
RETURN(ERROR_INVALID_PARAMETER);
|
|
}
|
|
info.State |= DFS_STORAGE_STATE_ONLINE;
|
|
}
|
|
else
|
|
{
|
|
RETURN(ERROR_INVALID_PARAMETER);
|
|
}
|
|
} //for i
|
|
} //if
|
|
|
|
MSG(fDebug,
|
|
"Calling NetDfsSetClientInfo(%ws,%ws,%ws,%lu,..)\n",
|
|
GetStringParam(pptszArgv[0]),
|
|
GetStringParam(pptszArgv[1]),
|
|
GetStringParam(pptszArgv[2]),
|
|
101);
|
|
ulErr = NetDfsSetClientInfo(GetStringParam(pptszArgv[0]),
|
|
GetStringParam(pptszArgv[1]),
|
|
GetStringParam(pptszArgv[2]),
|
|
101,
|
|
(LPBYTE)&info);
|
|
}
|
|
else if (0 == _tcsicmp(pptszArgv[3], _T("102")))
|
|
{
|
|
DFS_INFO_102 info;
|
|
|
|
if (5 != dwArgc)
|
|
{
|
|
MSG(fDebug,
|
|
"%ws==\"102\" && "
|
|
"5 != %lu\n",
|
|
pptszArgv[3], dwArgc);
|
|
RETURN(ERROR_INVALID_PARAMETER);
|
|
}
|
|
|
|
if (0 == _tcsicmp(pptszArgv[4], _T("0")))
|
|
{
|
|
dwTimeout = 0;
|
|
}
|
|
else
|
|
{
|
|
if (0 == (dwTimeout = _ttoi(pptszArgv[4])))
|
|
{
|
|
MSG(fDebug,
|
|
"%ws==\"102\" && "
|
|
"0 == %lu\n",
|
|
pptszArgv[3], dwArgc);
|
|
RETURN(ERROR_INVALID_PARAMETER);
|
|
} //if
|
|
} //else
|
|
|
|
info.Timeout = dwTimeout;
|
|
|
|
|
|
MSG(fDebug,
|
|
"Calling NetDfsSetClientInfo"
|
|
"(%ws,%ws,%ws,%lu,..)\n",
|
|
GetStringParam(pptszArgv[0]),
|
|
GetStringParam(pptszArgv[1]),
|
|
GetStringParam(pptszArgv[2]),
|
|
102);
|
|
ulErr = NetDfsSetClientInfo(GetStringParam(pptszArgv[0]),
|
|
GetStringParam(pptszArgv[1]),
|
|
GetStringParam(pptszArgv[2]),
|
|
102,
|
|
(LPBYTE)&info);
|
|
}
|
|
else
|
|
{
|
|
MSG(fDebug, "Invalid first parameter\n");
|
|
RETURN(ERROR_INVALID_PARAMETER);
|
|
}
|
|
|
|
MSG(fDebug, "Exiting SetClientInfo(..) with %lu\n", ulErr);
|
|
RETURN(ulErr);
|
|
}; //SetClientInfo
|
|
|
|
|
|
|
|
|
|
#if NOREBOOT
|
|
//+---------------------------------------------------------------------------
|
|
//
|
|
// Function: AddStdRoot
|
|
//
|
|
// Synopsis: This function performs NetDfsAddStdRoot.
|
|
//
|
|
// Arguments: [dwArg] the number of arguments
|
|
// [pptszArg] the arguments
|
|
//
|
|
// Returns: ERROR_INVALID_PARAMETER
|
|
//
|
|
// Notes:
|
|
//
|
|
//----------------------------------------------------------------------------
|
|
ULONG AddStdRoot(DWORD dwArgc, LPTSTR* pptszArgv)
|
|
{
|
|
ULONG ulErr = ERROR_SUCCESS;
|
|
DWORD dwOptions = 0;
|
|
|
|
MSG(fDebug,
|
|
"Entering AddStdRoot(%lu,..)\n",
|
|
dwArgc);
|
|
if (dwArgc < 2 || dwArgc > 4 || NULL == pptszArgv)
|
|
{
|
|
MSG(fDebug,
|
|
"%lu < 3 || "
|
|
"%lu > 4 || "
|
|
"NULL == pptszArgv\n",
|
|
dwArgc, dwArgc);
|
|
RETURN(ERROR_INVALID_PARAMETER);
|
|
} //if
|
|
|
|
if (4 == dwArgc)
|
|
{
|
|
dwOptions = _ttoi(pptszArgv[3]);
|
|
}
|
|
|
|
MSG(fDebug,
|
|
"Calling NetDfsAddStdRoot(%ws,%ws,%ws,%lu)\n",
|
|
GetStringParam(pptszArgv[0]),
|
|
GetStringParam(pptszArgv[1]),
|
|
GetStringParam(pptszArgv[2]),
|
|
dwOptions);
|
|
ulErr = NetDfsAddStdRoot(
|
|
GetStringParam(pptszArgv[0]),
|
|
GetStringParam(pptszArgv[1]),
|
|
GetStringParam(pptszArgv[2]),
|
|
dwOptions);
|
|
|
|
MSG(fDebug, "Exiting AddStdRoot(..) with %lu\n", ulErr);
|
|
RETURN(ulErr);
|
|
}; //AddStdRoot
|
|
|
|
|
|
|
|
|
|
//+---------------------------------------------------------------------------
|
|
//
|
|
// Function: RemoveStdRoot
|
|
//
|
|
// Synopsis: This function performs NetDfsRemoveStdRoot.
|
|
//
|
|
// Arguments: [dwArg] the number of arguments
|
|
// [pptszArg] the arguments
|
|
//
|
|
// Returns: ERROR_INVALID_PARAMETER
|
|
//
|
|
// Notes:
|
|
//
|
|
//----------------------------------------------------------------------------
|
|
ULONG RemoveStdRoot(DWORD dwArgc, LPTSTR* pptszArgv)
|
|
{
|
|
ULONG ulErr = ERROR_SUCCESS;
|
|
DWORD dwOptions = 0;
|
|
|
|
MSG(fDebug,
|
|
"Entering RemoveStdRoot(%lu,..)\n",
|
|
dwArgc);
|
|
if (dwArgc < 2 || dwArgc > 3 || NULL == pptszArgv)
|
|
{
|
|
MSG(fDebug,
|
|
"%lu < 2 || %lu > 3 || NULL == pptszArgv\n",
|
|
dwArgc, dwArgc);
|
|
RETURN(ERROR_INVALID_PARAMETER);
|
|
} //if
|
|
|
|
if (3 == dwArgc)
|
|
{
|
|
dwOptions = _ttoi(pptszArgv[2]);
|
|
}
|
|
|
|
MSG(fDebug,
|
|
"Calling NetDfsRemoveStdRoot"
|
|
"(%ws,%ws,%lu)\n",
|
|
GetStringParam(pptszArgv[0]),
|
|
GetStringParam(pptszArgv[1]),
|
|
dwOptions);
|
|
ulErr = NetDfsRemoveStdRoot(
|
|
GetStringParam(pptszArgv[0]),
|
|
GetStringParam(pptszArgv[1]),
|
|
dwOptions);
|
|
|
|
MSG(fDebug,
|
|
"Exiting RemoveStdRoot(..) with %lu\n",
|
|
ulErr);
|
|
RETURN(ulErr);
|
|
}; //RemoveStdRoot
|
|
|
|
|
|
|
|
|
|
//+---------------------------------------------------------------------------
|
|
//
|
|
// Function: AddFtRoot
|
|
//
|
|
// Synopsis: This function performs NetDfsAddFtRoot.
|
|
//
|
|
// Arguments: [dwArg] the number of arguments
|
|
// [pptszArg] the arguments
|
|
//
|
|
// Returns: ERROR_INVALID_PARAMETER
|
|
//
|
|
// Notes:
|
|
//
|
|
//----------------------------------------------------------------------------
|
|
ULONG AddFtRoot(DWORD dwArgc, LPTSTR* pptszArgv)
|
|
{
|
|
ULONG ulErr = ERROR_SUCCESS;
|
|
DWORD dwOptions = 0;
|
|
|
|
MSG(fDebug,
|
|
"Entering AddFtRoot(%lu,..)\n",
|
|
dwArgc);
|
|
if (dwArgc < 3 || dwArgc > 5 || NULL == pptszArgv)
|
|
{
|
|
MSG(fDebug,
|
|
"%lu < 3 || "
|
|
"%lu > 4 || "
|
|
"NULL == pptszArgv\n",
|
|
dwArgc, dwArgc);
|
|
RETURN(ERROR_INVALID_PARAMETER);
|
|
} //if
|
|
|
|
if (5 == dwArgc)
|
|
{
|
|
dwOptions = _ttoi(pptszArgv[4]);
|
|
}
|
|
|
|
MSG(fDebug,
|
|
"Calling NetDfsAddFtRoot(%ws,%ws,%ws,%ws,%lu)\n",
|
|
GetStringParam(pptszArgv[0]),
|
|
GetStringParam(pptszArgv[1]),
|
|
GetStringParam(pptszArgv[2]),
|
|
GetStringParam(pptszArgv[3]),
|
|
dwOptions);
|
|
ulErr = NetDfsAddFtRoot(GetStringParam(pptszArgv[0]),
|
|
GetStringParam(pptszArgv[1]),
|
|
GetStringParam(pptszArgv[2]),
|
|
GetStringParam(pptszArgv[3]),
|
|
dwOptions);
|
|
|
|
MSG(fDebug, "Exiting AddFtRoot(..) with %lu\n", ulErr);
|
|
RETURN(ulErr);
|
|
}; //AddFtRoot
|
|
|
|
|
|
|
|
|
|
|
|
//+---------------------------------------------------------------------------
|
|
//
|
|
// Function: RemoveFtRoot
|
|
//
|
|
// Synopsis: This function performs NetDfsRemoveFtRoot.
|
|
//
|
|
// Arguments: [dwArg] the number of arguments
|
|
// [pptszArg] the arguments
|
|
//
|
|
// Returns: ERROR_INVALID_PARAMETER
|
|
//
|
|
// Notes:
|
|
//
|
|
//----------------------------------------------------------------------------
|
|
ULONG RemoveFtRoot(DWORD dwArgc, LPTSTR* pptszArgv)
|
|
{
|
|
ULONG ulErr = ERROR_SUCCESS;
|
|
DWORD dwOptions = 0;
|
|
|
|
MSG(fDebug,
|
|
"Entering RemoveFtRoot(%lu,..)\n",
|
|
dwArgc);
|
|
if (dwArgc < 3 || dwArgc > 4 || NULL == pptszArgv)
|
|
{
|
|
MSG(fDebug,
|
|
"%lu < 3 || %lu > 4 || NULL == pptszArgv\n",
|
|
dwArgc, dwArgc);
|
|
RETURN(ERROR_INVALID_PARAMETER);
|
|
} //if
|
|
|
|
if (4 == dwArgc)
|
|
{
|
|
dwOptions = _ttoi(pptszArgv[3]);
|
|
}
|
|
|
|
//
|
|
// BUGBUG
|
|
//
|
|
// for the time being we ignore every option
|
|
//
|
|
dwOptions = 0;
|
|
|
|
MSG(fDebug,
|
|
"Calling NetDfsRemoveFtRoot"
|
|
"(%ws,%ws,%ws,%lu)\n",
|
|
GetStringParam(pptszArgv[0]),
|
|
GetStringParam(pptszArgv[1]),
|
|
GetStringParam(pptszArgv[2]),
|
|
dwOptions);
|
|
ulErr = NetDfsRemoveFtRoot(GetStringParam(pptszArgv[0]),
|
|
GetStringParam(pptszArgv[1]),
|
|
GetStringParam(pptszArgv[2]),
|
|
dwOptions);
|
|
|
|
MSG(fDebug,
|
|
"Exiting RemoveFtRoot(..) with %lu\n",
|
|
ulErr);
|
|
RETURN(ulErr);
|
|
}; //RemoveFtRoot
|
|
|
|
|
|
|
|
|
|
|
|
//+---------------------------------------------------------------------------
|
|
//
|
|
// Function: RemoveFtRootForced
|
|
//
|
|
// Synopsis: This function performs NetDfsRemoveFtRootForced.
|
|
//
|
|
// Arguments: [dwArg] the number of arguments
|
|
// [pptszArg] the arguments
|
|
//
|
|
// Returns: ERROR_INVALID_PARAMETER
|
|
//
|
|
// Notes:
|
|
//
|
|
//----------------------------------------------------------------------------
|
|
ULONG RemoveFtRootForced(DWORD dwArgc, LPTSTR* pptszArgv)
|
|
{
|
|
ULONG ulErr = ERROR_SUCCESS;
|
|
DWORD dwOptions = 0;
|
|
|
|
MSG(fDebug,
|
|
"Entering RemoveFtRootForced(%lu,..)\n",
|
|
dwArgc);
|
|
if (dwArgc < 4 || dwArgc > 5 || NULL == pptszArgv)
|
|
{
|
|
MSG(fDebug,
|
|
"%lu < 4 || %lu > 5 || NULL == pptszArgv\n",
|
|
dwArgc, dwArgc);
|
|
RETURN(ERROR_INVALID_PARAMETER);
|
|
} //if
|
|
|
|
if (5 == dwArgc)
|
|
{
|
|
dwOptions = _ttoi(pptszArgv[3]);
|
|
}
|
|
|
|
//
|
|
// BUGBUG
|
|
//
|
|
// for the time being we ignore every option
|
|
//
|
|
dwOptions = 0;
|
|
|
|
MSG(fDebug,
|
|
"Calling NetDfsRemoveFtRootForced"
|
|
"(%ws,%ws,%ws,%ws,%lu)\n",
|
|
GetStringParam(pptszArgv[0]),
|
|
GetStringParam(pptszArgv[1]),
|
|
GetStringParam(pptszArgv[2]),
|
|
GetStringParam(pptszArgv[3]),
|
|
dwOptions);
|
|
ulErr = NetDfsRemoveFtRootForced(GetStringParam(pptszArgv[0]),
|
|
GetStringParam(pptszArgv[1]),
|
|
GetStringParam(pptszArgv[2]),
|
|
GetStringParam(pptszArgv[3]),
|
|
dwOptions);
|
|
|
|
MSG(fDebug,
|
|
"Exiting RemoveFtRootForced(..) with %lu\n",
|
|
ulErr);
|
|
RETURN(ulErr);
|
|
}; //RemoveFtRootForced
|
|
|
|
|
|
|
|
|
|
|
|
//+---------------------------------------------------------------------------
|
|
//
|
|
// Function: AddStdRootForced
|
|
//
|
|
// Synopsis: This function performs NetDfsAddStdRootForced.
|
|
//
|
|
// Arguments: [dwArg] the number of arguments
|
|
// [pptszArg] the arguments
|
|
//
|
|
// Returns: ERROR_INVALID_PARAMETER
|
|
//
|
|
// Notes:
|
|
//
|
|
//----------------------------------------------------------------------------
|
|
ULONG AddStdRootForced(DWORD dwArgc, LPTSTR* pptszArgv)
|
|
{
|
|
ULONG ulErr = ERROR_SUCCESS;
|
|
DWORD dwOptions = 0;
|
|
|
|
MSG(fDebug,
|
|
"Entering AddStdRootForced(%lu,..)\n",
|
|
dwArgc);
|
|
if (dwArgc < 2 || dwArgc > 4 || NULL == pptszArgv)
|
|
{
|
|
MSG(fDebug,
|
|
"%lu < 3 || "
|
|
"%lu > 4 || "
|
|
"NULL == pptszArgv\n",
|
|
dwArgc,
|
|
dwArgc);
|
|
RETURN(ERROR_INVALID_PARAMETER);
|
|
} //if
|
|
|
|
MSG(fDebug,
|
|
"Calling NetDfsAddStdRootForced(%ws,%ws,%ws,%ws)\n",
|
|
GetStringParam(pptszArgv[0]),
|
|
GetStringParam(pptszArgv[1]),
|
|
GetStringParam(pptszArgv[2]),
|
|
GetStringParam(pptszArgv[3]));
|
|
ulErr = NetDfsAddStdRootForced(GetStringParam(pptszArgv[0]),
|
|
GetStringParam(pptszArgv[1]),
|
|
GetStringParam(pptszArgv[2]),
|
|
GetStringParam(pptszArgv[3]));
|
|
|
|
MSG(fDebug, "Exiting AddStdRootForced(..) with %lu\n", ulErr);
|
|
RETURN(ulErr);
|
|
}; //AddStdRoot
|
|
|
|
|
|
|
|
|
|
|
|
//+---------------------------------------------------------------------------
|
|
//
|
|
// Function: GetDcAddress
|
|
//
|
|
// Synopsis: This function performs NetDfsGetDcAddress.
|
|
//
|
|
// Arguments: [dwArg] the number of arguments
|
|
// [pptszArg] the arguments
|
|
//
|
|
// Returns: ERROR_INVALID_PARAMETER
|
|
//
|
|
// Notes:
|
|
//
|
|
//----------------------------------------------------------------------------
|
|
ULONG GetDcAddress(DWORD dwArgc, LPTSTR* pptszArgv)
|
|
{
|
|
ULONG ulErr = ERROR_SUCCESS;
|
|
DWORD dwOptions = 0;
|
|
LPTSTR ptszIpAddress = NULL;
|
|
BOOLEAN bIsRoot = FALSE;
|
|
ULONG ulTimeout = 0;
|
|
|
|
MSG(fDebug,
|
|
"Entering AddStdRootForced(%lu,..)\n",
|
|
dwArgc);
|
|
if (1 != dwArgc || NULL == pptszArgv)
|
|
{
|
|
MSG(fDebug,
|
|
"%lu != 1 || NULL == pptszArgv\n",
|
|
dwArgc);
|
|
RETURN(ERROR_INVALID_PARAMETER);
|
|
} //if
|
|
|
|
MSG(fDebug,
|
|
"Calling NetDfsGetDcAddress(%ws,...)\n",
|
|
GetStringParam(pptszArgv[0]));
|
|
ulErr = NetDfsGetDcAddress(GetStringParam(pptszArgv[0]),
|
|
&ptszIpAddress,
|
|
&bIsRoot,
|
|
&ulTimeout);
|
|
|
|
if (ERROR_SUCCESS == ulErr)
|
|
{
|
|
LPTSTR ptszIs = bIsRoot?_T("is"):_T("is not");
|
|
|
|
fprintf(stdout,
|
|
"%ws %ws a Dfs server and it will be "
|
|
"sticking to the DC having the %ws "
|
|
"address for %lu seconds\n",
|
|
GetStringParam(pptszArgv[0]),
|
|
ptszIs,
|
|
ptszIpAddress,
|
|
ulTimeout);
|
|
}
|
|
else
|
|
{
|
|
fprintf(stderr,
|
|
"Error %lu: cannot retrieve DC address "
|
|
"for %ws\n",
|
|
ulErr,
|
|
GetStringParam(pptszArgv[0]));
|
|
}
|
|
|
|
if (NULL != ptszIpAddress)
|
|
{
|
|
NetApiBufferFree(ptszIpAddress);
|
|
}
|
|
|
|
MSG(fDebug, "Exiting AddStdRootForced(..) with %lu\n", ulErr);
|
|
RETURN(ulErr);
|
|
}; //GetDcAddress
|
|
|
|
|
|
|
|
|
|
#if 0
|
|
//+---------------------------------------------------------------------------
|
|
//
|
|
// Function: SetDcAddress
|
|
//
|
|
// Synopsis: This function performs NetDfsSetDcAddress.
|
|
//
|
|
// Arguments: [dwArg] the number of arguments
|
|
// [pptszArg] the arguments
|
|
//
|
|
// Returns: ERROR_INVALID_PARAMETER
|
|
//
|
|
// Notes:
|
|
//
|
|
//----------------------------------------------------------------------------
|
|
ULONG SetDcAddress(DWORD dwArgc, LPTSTR* pptszArgv)
|
|
{
|
|
ULONG ulErr = ERROR_SUCCESS;
|
|
ULONG ulTimeout = 0;
|
|
ULONG ulFlags = 0;
|
|
|
|
MSG(fDebug,
|
|
"Entering SetDcAddress(%lu,..)\n",
|
|
dwArgc);
|
|
if (dwArgc < 2 || dwArgc > 4 || NULL == pptszArgv)
|
|
{
|
|
MSG(fDebug,
|
|
"%lu < 3 || "
|
|
"%lu > 4 || "
|
|
"NULL == pptszArgv\n",
|
|
dwArgc,
|
|
dwArgc);
|
|
RETURN(ERROR_INVALID_PARAMETER);
|
|
} //if
|
|
|
|
ulTimeout = (ULONG)_ttol(GetStringParam(pptszArgv[2]));
|
|
ulFlags = 0;
|
|
|
|
MSG(fDebug,
|
|
"Calling NetDfsSetDcAddress(%ws,%ws,%lu,%lu)\n",
|
|
GetStringParam(pptszArgv[0]),
|
|
GetStringParam(pptszArgv[1]),
|
|
ulTimeout,
|
|
ulFlags);
|
|
ulErr = NetDfsSetDcAddress(GetStringParam(pptszArgv[0]),
|
|
GetStringParam(pptszArgv[1]),
|
|
ulTimeout,
|
|
ulFlags);
|
|
|
|
MSG(fDebug, "Exiting NetDfsSetDcAddress(..) with %lu\n", ulErr);
|
|
RETURN(ulErr);
|
|
}; //AddStdRoot
|
|
#endif // 0
|
|
#endif // NOREBOOT
|
|
|
|
|
|
|
|
|
|
#if 0
|
|
//+---------------------------------------------------------------------------
|
|
//
|
|
// Function: AddConnection
|
|
//
|
|
// Synopsis: This function performs WNetAddConnectionX.
|
|
//
|
|
// Arguments: [dwArg] the number of arguments
|
|
// [pptszArg] the arguments
|
|
//
|
|
// Returns: ERROR_INVALID_PARAMETER
|
|
//
|
|
// Notes:
|
|
//
|
|
//----------------------------------------------------------------------------
|
|
ULONG AddConnection(DWORD dwArgc, LPTSTR* pptszArgv)
|
|
{
|
|
ULONG ulErr = ERROR_SUCCESS;
|
|
|
|
if (0 == dwArgc || NULL == pptszArgv)
|
|
{
|
|
RETURN(ERROR_INVALID_PARAMETER);
|
|
}
|
|
|
|
if (0 == _tcsicmp(pptszArgv[0], _T("1")))
|
|
{
|
|
ulErr = AddConnection1(dwArgc-1, pptszArgv+1);
|
|
}
|
|
else if (0 == _tcsicmp(pptszArgv[0], _T("2")))
|
|
{
|
|
ulErr = AddConnection2(dwArgc-1, pptszArgv+1);
|
|
}
|
|
else
|
|
{
|
|
MSG(fDebug,
|
|
"Error %lu: invalid level: %ws\n",
|
|
ulErr = ERROR_INVALID_PARAMETER,
|
|
pptszArgv[0]);
|
|
}
|
|
|
|
RETURN(ulErr);
|
|
}; //AddConnection
|
|
|
|
|
|
|
|
|
|
|
|
//+---------------------------------------------------------------------------
|
|
//
|
|
// Function: AddConnection1
|
|
//
|
|
// Synopsis: This function performs WNetAddConnection.
|
|
//
|
|
// Arguments: [dwArg] the number of arguments
|
|
// [pptszArg] the arguments
|
|
//
|
|
// Returns: ERROR_INVALID_PARAMETER
|
|
//
|
|
// Notes:
|
|
//
|
|
//----------------------------------------------------------------------------
|
|
ULONG AddConnection1(DWORD dwArgc, LPTSTR* pptszArgv)
|
|
{
|
|
RETURN(ERROR_INVALID_FUNCTION);
|
|
}; //AddConnection1
|
|
|
|
|
|
|
|
|
|
|
|
//+---------------------------------------------------------------------------
|
|
//
|
|
// Function: AddConnection2
|
|
//
|
|
// Synopsis: This function performs WNetAddConnection2.
|
|
//
|
|
// Arguments: [dwArg] the number of arguments
|
|
// [pptszArg] the arguments
|
|
//
|
|
// Returns: ERROR_INVALID_PARAMETER
|
|
//
|
|
// Notes:
|
|
//
|
|
//----------------------------------------------------------------------------
|
|
ULONG AddConnection2(DWORD dwArgc, LPTSTR* pptszArgv)
|
|
{
|
|
ULONG ulErr = ERROR_SUCCESS;
|
|
NETRESOURCE NetResource;
|
|
DWORD dwFlags = 0;
|
|
TCHAR tszLocalName[128+1];
|
|
ULONG ulLocalNameLen = 128;
|
|
|
|
MSG(fDebug,
|
|
"Entering AddConnection2(%lu, ..)\n",
|
|
dwArgc);
|
|
if (NULL == pptszArgv || dwArgc <= 5)
|
|
{
|
|
RETURN(ERROR_INVALID_PARAMETER);
|
|
}
|
|
|
|
memset(tszLocalName, 0, sizeof(tszLocalName));
|
|
ulErr = GetLocalName(tszLocalName,
|
|
ulLocalNameLen,
|
|
GetStringParam(pptszArgv[2]));
|
|
if (ERROR_SUCCESS != ulErr)
|
|
{
|
|
goto Error;
|
|
}
|
|
|
|
ulErr = GetNetResource(&NetResource,
|
|
GetStringParam(pptszArgv[3]), // type
|
|
tszLocalName, // localname
|
|
GetStringParam(pptszArgv[0]), // remotename
|
|
GetStringParam(pptszArgv[4])); // provider
|
|
if (ERROR_SUCCESS != ulErr)
|
|
{
|
|
goto Error;
|
|
}
|
|
|
|
ulErr = GetWNetConnectionFlags(&dwFlags,
|
|
dwArgc-6,
|
|
pptszArgv+6);
|
|
if (ERROR_SUCCESS != ulErr)
|
|
{
|
|
goto Error;
|
|
}
|
|
|
|
MSG(fDebug,
|
|
"Calling WNetAddConnection2(.., %ws, %ws, %lu)\n",
|
|
GetStringParam(pptszArgv[1]),
|
|
GetStringParam(pptszArgv[5]),
|
|
dwFlags);
|
|
ulErr = WNetAddConnection2(&NetResource,
|
|
GetStringParam(pptszArgv[1]),
|
|
GetStringParam(pptszArgv[5]),
|
|
dwFlags);
|
|
Error:;
|
|
|
|
MSG(fDebug,
|
|
"Exiting AddConnection2(..) with %lu\n",
|
|
ulErr);
|
|
RETURN(ulErr);
|
|
}; //AddConnection2
|
|
|
|
|
|
|
|
|
|
|
|
//+---------------------------------------------------------------------------
|
|
//
|
|
// Function: CancelConnection
|
|
//
|
|
// Synopsis: This function performs WNetCancelConnectionX.
|
|
//
|
|
// Arguments: [dwArg] the number of arguments
|
|
// [pptszArg] the arguments
|
|
//
|
|
// Returns: ERROR_INVALID_PARAMETER
|
|
//
|
|
// Notes:
|
|
//
|
|
//----------------------------------------------------------------------------
|
|
ULONG CancelConnection(DWORD dwArgc, LPTSTR* pptszArgv)
|
|
{
|
|
ULONG ulErr = ERROR_SUCCESS;
|
|
|
|
if (0 == dwArgc || NULL == pptszArgv)
|
|
{
|
|
RETURN(ERROR_INVALID_PARAMETER);
|
|
}
|
|
|
|
if (0 == _tcsicmp(pptszArgv[0], _T("1")))
|
|
{
|
|
ulErr = CancelConnection1(dwArgc-1, pptszArgv+1);
|
|
}
|
|
else if (0 == _tcsicmp(pptszArgv[0], _T("2")))
|
|
{
|
|
ulErr = CancelConnection2(dwArgc-1, pptszArgv+1);
|
|
}
|
|
else
|
|
{
|
|
MSG(fDebug,
|
|
"Error %lu: invalid level: %ws\n",
|
|
ulErr = ERROR_INVALID_PARAMETER,
|
|
pptszArgv[0]);
|
|
}
|
|
|
|
RETURN(ulErr);
|
|
}; //CancelConnection
|
|
|
|
|
|
|
|
|
|
|
|
//+---------------------------------------------------------------------------
|
|
//
|
|
// Function: CancelConnection1
|
|
//
|
|
// Synopsis: This function performs WNetCancelConnection.
|
|
//
|
|
// Arguments: [dwArg] the number of arguments
|
|
// [pptszArg] the arguments
|
|
//
|
|
// Returns: ERROR_INVALID_PARAMETER
|
|
//
|
|
// Notes:
|
|
//
|
|
//----------------------------------------------------------------------------
|
|
ULONG CancelConnection1(DWORD dwArgc, LPTSTR* pptszArgv)
|
|
{
|
|
RETURN(ERROR_INVALID_FUNCTION);
|
|
}; //CancelConnection1
|
|
|
|
|
|
|
|
|
|
|
|
//+---------------------------------------------------------------------------
|
|
//
|
|
// Function: CancelConnection2
|
|
//
|
|
// Synopsis: This function performs WNetCancelConnection2.
|
|
//
|
|
// Arguments: [dwArg] the number of arguments
|
|
// [pptszArg] the arguments
|
|
//
|
|
// Returns: ERROR_INVALID_PARAMETER
|
|
//
|
|
// Notes:
|
|
//
|
|
//----------------------------------------------------------------------------
|
|
ULONG CancelConnection2(DWORD dwArgc, LPTSTR* pptszArgv)
|
|
{
|
|
ULONG ulErr = ERROR_SUCCESS;
|
|
DWORD dwFlags = 0;
|
|
BOOL bForce = FALSE;
|
|
|
|
MSG(fDebug,
|
|
"Entering CancelConnection2(%lu, ..)\n",
|
|
dwArgc);
|
|
if (NULL == pptszArgv || dwArgc <= 0)
|
|
{
|
|
RETURN(ERROR_INVALID_PARAMETER);
|
|
}
|
|
|
|
if (2 == dwArgc &&
|
|
0 == _tcsicmp(_T("force"), pptszArgv[dwArgc-1]))
|
|
{
|
|
bForce = TRUE;
|
|
--dwArgc;
|
|
}
|
|
|
|
ulErr = GetWNetConnectionFlags(&dwFlags,
|
|
dwArgc-1,
|
|
pptszArgv+1);
|
|
if (ERROR_SUCCESS != ulErr)
|
|
{
|
|
goto Error;
|
|
}
|
|
|
|
MSG(fDebug,
|
|
"Calling WNetCancelConnection2(%ws, %lu, %ws)\n",
|
|
GetStringParam(pptszArgv[0]),
|
|
dwFlags,
|
|
bForce ? _T("TRUE") : _T("FALSE"));
|
|
ulErr = WNetCancelConnection2(GetStringParam(pptszArgv[0]),
|
|
dwFlags,
|
|
bForce);
|
|
|
|
Error:;
|
|
|
|
MSG(fDebug,
|
|
"Exiting CancelConnection2(..) with %lu\n",
|
|
ulErr);
|
|
RETURN(ulErr);
|
|
}; //CancelConnection2
|
|
|
|
|
|
#endif
|
|
|
|
|
|
//+---------------------------------------------------------------------------
|
|
//
|
|
// Function: GetLocalName
|
|
//
|
|
// Synopsis: This function returns the first available letter for net
|
|
// use
|
|
//
|
|
// Arguments: [...]
|
|
//
|
|
// Returns: ERROR_INVALID_PARAMETER
|
|
//
|
|
// Notes:
|
|
//
|
|
//----------------------------------------------------------------------------
|
|
ULONG GetLocalName(LPTSTR ptszLocalName,
|
|
ULONG ulLocalNameLen,
|
|
LPTSTR ptszArg)
|
|
{
|
|
ULONG ulErr = ERROR_SUCCESS;
|
|
CHAR szDrive[4];
|
|
BOOL bFound = FALSE;
|
|
|
|
MSG(fDebug,
|
|
"Entering GetNetResource(%ws, %lu, %ws)\n",
|
|
ptszLocalName,
|
|
ulLocalNameLen,
|
|
ptszArg);
|
|
if (NULL != ptszArg &&
|
|
0 != _tcsicmp(ptszArg, _T("available")) &&
|
|
0 != _tcsicmp(ptszArg, _T("*")))
|
|
{
|
|
if (ulLocalNameLen < _tcslen(ptszArg))
|
|
{
|
|
RETURN(ERROR_NO_SYSTEM_RESOURCES);
|
|
}
|
|
|
|
_tcscpy(ptszLocalName, ptszArg);
|
|
}
|
|
else
|
|
{
|
|
if (ulLocalNameLen < 2)
|
|
{
|
|
RETURN(ERROR_INVALID_PARAMETER);
|
|
}
|
|
}
|
|
|
|
szDrive[1] = ':';
|
|
szDrive[2] = '\\';
|
|
szDrive[3] = '\0';
|
|
for (CHAR C='C'; !bFound && C<='Z'; C++)
|
|
{
|
|
ULONG ulType = 0;
|
|
|
|
szDrive[0] = C;
|
|
switch (ulType = GetDriveTypeA(szDrive))
|
|
{
|
|
case 0:
|
|
case DRIVE_REMOVABLE:
|
|
case DRIVE_FIXED:
|
|
case DRIVE_REMOTE:
|
|
case DRIVE_CDROM:
|
|
case DRIVE_RAMDISK:
|
|
MSG(fDebug,
|
|
"%s is of type %lu\n",
|
|
szDrive,
|
|
ulType);
|
|
continue;
|
|
|
|
case 1:
|
|
bFound = TRUE;
|
|
break;
|
|
|
|
default:
|
|
ASSERT(FALSE);
|
|
}// switch
|
|
} //for
|
|
|
|
if (!bFound)
|
|
{
|
|
ulErr = ERROR_NO_SYSTEM_RESOURCES;
|
|
}
|
|
else
|
|
{
|
|
szDrive[2] = '\0';
|
|
#ifdef UNICODE
|
|
mbstowcs(ptszLocalName, szDrive, ulLocalNameLen);
|
|
#else
|
|
_strcpy(ptszLocalName, szDrive);
|
|
#endif
|
|
}
|
|
|
|
MSG(fDebug,
|
|
"Entering GetNetResource(%ws, %lu, %ws) with %lu\n",
|
|
ptszLocalName,
|
|
ulLocalNameLen,
|
|
ptszArg,
|
|
ulErr);
|
|
RETURN(ulErr);
|
|
}; //GetLocalName
|
|
|
|
|
|
|
|
|
|
//+---------------------------------------------------------------------------
|
|
//
|
|
// Function: GetNetResource
|
|
//
|
|
// Synopsis: This function fils a NETRESOURCE structure out
|
|
//
|
|
// Arguments: [...]
|
|
//
|
|
// Returns: ERROR_INVALID_PARAMETER
|
|
//
|
|
// Notes:
|
|
//
|
|
//----------------------------------------------------------------------------
|
|
ULONG GetNetResource(NETRESOURCE* pNetResource,
|
|
LPTSTR ptszType,
|
|
LPTSTR ptszLocalName,
|
|
LPTSTR ptszRemoteName,
|
|
LPTSTR ptszProvider)
|
|
{
|
|
ULONG ulErr = ERROR_SUCCESS;
|
|
DWORD dwType = 0;
|
|
|
|
MSG(fDebug,
|
|
"Entering GetNetResource(.., %ws, %ws, %ws, %ws)\n",
|
|
ptszType,
|
|
ptszLocalName,
|
|
ptszRemoteName,
|
|
ptszProvider);
|
|
if (NULL == pNetResource ||
|
|
NULL == ptszType)
|
|
{
|
|
RETURN(ERROR_INVALID_PARAMETER);
|
|
}
|
|
|
|
memset(pNetResource, 0, sizeof(NETRESOURCE));
|
|
if (0 == _tcsicmp(ptszType, _T("disk")))
|
|
{
|
|
dwType = RESOURCETYPE_DISK;
|
|
}
|
|
else if (0 == _tcsicmp(ptszType, _T("print")))
|
|
{
|
|
dwType = RESOURCETYPE_PRINT;
|
|
}
|
|
else if (0 == _tcsicmp(ptszType, _T("any")))
|
|
{
|
|
dwType = RESOURCETYPE_ANY;
|
|
}
|
|
else
|
|
{
|
|
MSG(fDebug,
|
|
"%ws is an invalid type\n",
|
|
ptszType);
|
|
RETURN(ERROR_INVALID_PARAMETER);
|
|
}
|
|
|
|
pNetResource->dwType = dwType;
|
|
pNetResource->lpLocalName = ptszLocalName;
|
|
pNetResource->lpRemoteName = ptszRemoteName;
|
|
pNetResource->lpProvider = ptszProvider;
|
|
|
|
MSG(fDebug,
|
|
"Entering GetNetResource(.., %ws, %ws, %ws, %ws) with %lu\n",
|
|
ptszType,
|
|
ptszLocalName,
|
|
ptszRemoteName,
|
|
ptszProvider,
|
|
ulErr);
|
|
RETURN(ulErr);
|
|
}; //GetNetResource
|
|
|
|
|
|
|
|
|
|
|
|
//+---------------------------------------------------------------------------
|
|
//
|
|
// Function: GetWNetConnectionFlags
|
|
//
|
|
// Synopsis: This function returns flags for WNetAddConnection2
|
|
//
|
|
// Arguments: [...]
|
|
//
|
|
// Returns: ERROR_INVALID_PARAMETER
|
|
//
|
|
// Notes:
|
|
//
|
|
//----------------------------------------------------------------------------
|
|
ULONG GetWNetConnectionFlags(DWORD* pdwFlags,
|
|
DWORD dwArgc,
|
|
LPTSTR* pptszArgv)
|
|
{
|
|
ULONG ulErr = ERROR_SUCCESS;
|
|
|
|
MSG(fDebug,
|
|
"Entering CWNetAddConnection2Flags(.., %lu, ..)\n",
|
|
dwArgc);
|
|
if (NULL == pdwFlags ||
|
|
NULL == pptszArgv)
|
|
{
|
|
RETURN(ERROR_INVALID_PARAMETER);
|
|
}
|
|
|
|
*pdwFlags = 0;
|
|
for (ULONG i=0; i<dwArgc; i++)
|
|
{
|
|
if (0 == _tcsicmp(_T("update_profile"), pptszArgv[i]))
|
|
{
|
|
*pdwFlags |= CONNECT_UPDATE_PROFILE;
|
|
}
|
|
else if (0 == _tcsicmp(_T("update_recent"), pptszArgv[i]))
|
|
{
|
|
*pdwFlags |= CONNECT_UPDATE_RECENT;
|
|
}
|
|
else if (0 == _tcsicmp(_T("temporary"), pptszArgv[i]))
|
|
{
|
|
*pdwFlags |= CONNECT_TEMPORARY;
|
|
}
|
|
else if (0 == _tcsicmp(_T("interactive"), pptszArgv[i]))
|
|
{
|
|
*pdwFlags |= CONNECT_INTERACTIVE;
|
|
}
|
|
else if (0 == _tcsicmp(_T("prompt"), pptszArgv[i]))
|
|
{
|
|
*pdwFlags |= CONNECT_PROMPT;
|
|
}
|
|
else if (0 == _tcsicmp(_T("need_drive"), pptszArgv[i]))
|
|
{
|
|
*pdwFlags |= CONNECT_NEED_DRIVE;
|
|
}
|
|
else if (0 == _tcsicmp(_T("refcount"), pptszArgv[i]))
|
|
{
|
|
*pdwFlags |= CONNECT_REFCOUNT;
|
|
}
|
|
else if (0 == _tcsicmp(_T("redirect"), pptszArgv[i]))
|
|
{
|
|
*pdwFlags |= CONNECT_REDIRECT;
|
|
}
|
|
else if (0 == _tcsicmp(_T("localdrive"), pptszArgv[i]))
|
|
{
|
|
*pdwFlags |= CONNECT_LOCALDRIVE;
|
|
}
|
|
else if (0 == _tcsicmp(_T("current_media"), pptszArgv[i]))
|
|
{
|
|
*pdwFlags |= CONNECT_CURRENT_MEDIA;
|
|
}
|
|
else if (0 == _tcsicmp(_T("deferred"), pptszArgv[i]))
|
|
{
|
|
*pdwFlags |= CONNECT_DEFERRED;
|
|
}
|
|
else
|
|
{
|
|
MSG(fDebug,
|
|
"Error %lu: %ws is an invalid flag\n",
|
|
ulErr = ERROR_INVALID_PARAMETER,
|
|
pptszArgv[i]);
|
|
}
|
|
} //for
|
|
|
|
MSG(fDebug,
|
|
"Exiting CWNetAddConnection2Flags(.., %lu, ..) with %lu\n",
|
|
dwArgc,
|
|
ulErr);
|
|
RETURN(ulErr);
|
|
}; //GetWNetAddconnection2Flags
|
|
|
|
|
|
|
|
#if 0
|
|
//+---------------------------------------------------------------------------
|
|
//
|
|
// Function: AddressToSite
|
|
//
|
|
// Synopsis: This function performs DsAddressToSiteNames
|
|
//
|
|
// Arguments: [dwArg] the number of arguments
|
|
// [pptszArg] the arguments
|
|
//
|
|
// Returns: ERROR_INVALID_PARAMETER
|
|
//
|
|
// Notes:
|
|
//
|
|
//----------------------------------------------------------------------------
|
|
ULONG AddressToSite(DWORD dwArgc,
|
|
LPTSTR* pptszArgv)
|
|
{
|
|
ULONG ulErr = ERROR_SUCCESS;
|
|
CString sIp;
|
|
CStringA sIpA;
|
|
ULONG ulIP = 0;
|
|
WSADATA wsaData;
|
|
PHOSTENT pHost = NULL;
|
|
SOCKET_ADDRESS SocketAddress;
|
|
SOCKADDR_IN SockAddrIn;
|
|
LPTSTR* pptszSites = NULL;
|
|
|
|
MSG(fDebug,
|
|
"Entering AddressToSite(%lu, ...)\n",
|
|
dwArgc);
|
|
|
|
if (2 != dwArgc || NULL == pptszArgv)
|
|
{
|
|
RETURN(ERROR_INVALID_PARAMETER);
|
|
}
|
|
|
|
if (NULL == GetStringParam(pptszArgv[1]))
|
|
{
|
|
RETURN(ERROR_INVALID_PARAMETER);
|
|
}
|
|
|
|
ulErr = sIp.Set(GetStringParam(pptszArgv[1]));
|
|
if (ERROR_SUCCESS != ulErr)
|
|
{
|
|
RETURN(ulErr);
|
|
}
|
|
|
|
ulErr = sIpA.Set(sIp);
|
|
if (ERROR_SUCCESS != ulErr)
|
|
{
|
|
RETURN(ulErr);
|
|
}
|
|
|
|
ulIP = inet_addr(sIpA.GetStringA());
|
|
if (INADDR_NONE == ulIP)
|
|
{
|
|
fprintf(stderr,
|
|
"Error %lu: invalid address %s\n",
|
|
ulErr = ERROR_INVALID_PARAMETER,
|
|
sIpA.GetStringA());
|
|
RETURN(ulErr);
|
|
}
|
|
|
|
ulErr = WSAStartup(MAKEWORD(2,2),
|
|
&wsaData);
|
|
if (ERROR_SUCCESS != ulErr)
|
|
{
|
|
fprintf(stderr,
|
|
"Error %lu: cannot startup sockets",
|
|
ulErr);
|
|
RETURN(ulErr);
|
|
}
|
|
|
|
pHost = gethostbyaddr((LPCSTR)&ulIP,
|
|
sizeof(ulIP),
|
|
AF_INET);
|
|
if (NULL == pHost)
|
|
{
|
|
fprintf(stderr,
|
|
"Error %lu: cannot retrieve host address "
|
|
"for %ws",
|
|
ulErr = WSAGetLastError(),
|
|
GetStringParam(pptszArgv[1]));
|
|
|
|
WSACleanup();
|
|
RETURN(ulErr);
|
|
}
|
|
|
|
|
|
SockAddrIn.sin_family = pHost->h_addrtype;
|
|
SockAddrIn.sin_port = 0;
|
|
memcpy(&SockAddrIn.sin_addr,
|
|
pHost->h_addr,
|
|
pHost->h_length);
|
|
|
|
SocketAddress.iSockaddrLength = sizeof(SockAddrIn);
|
|
SocketAddress.lpSockaddr = (LPSOCKADDR)&SockAddrIn;
|
|
|
|
ulErr = DsAddressToSiteNames(GetStringParam(pptszArgv[0]),
|
|
1,
|
|
&SocketAddress,
|
|
&pptszSites);
|
|
if (ERROR_SUCCESS == ulErr && NULL != pptszSites[0])
|
|
{
|
|
fprintf(stdout,
|
|
"The site of %ws on DC \\\\%ws is %ws\n",
|
|
GetStringParam(pptszArgv[1]),
|
|
GetStringParam(pptszArgv[0]),
|
|
pptszSites[0]);
|
|
NetApiBufferFree(pptszSites);
|
|
}
|
|
else if (ERROR_SUCCESS == ulErr && NULL == pptszSites[0])
|
|
{
|
|
fprintf(stdout,
|
|
"Error %lu: address %ws is not associated "
|
|
"to a site or it has an invalid format\n",
|
|
ulErr = ERROR_INVALID_PARAMETER,
|
|
GetStringParam(pptszArgv[1]));
|
|
}
|
|
else
|
|
{
|
|
fprintf(stderr,
|
|
"Error %lu: cannot retrieve site of "
|
|
"%ws from DC \\\\%ws\n",
|
|
ulErr,
|
|
GetStringParam(pptszArgv[0]),
|
|
GetStringParam(pptszArgv[1]));
|
|
}
|
|
|
|
WSACleanup();
|
|
|
|
MSG(fDebug,
|
|
"Exiting AddressToSite(%lu, ...) with %lu\n",
|
|
dwArgc,
|
|
ulErr);
|
|
RETURN(ulErr);
|
|
}; // AddressToSite
|
|
|
|
|
|
|
|
#endif
|
|
|
|
//+---------------------------------------------------------------------------
|
|
//
|
|
// Function: PrintDfsInfo
|
|
//
|
|
// Synopsis: This function prints a DFS_INFO_XXX buffer out.
|
|
//
|
|
// Arguments: [dwLevel] the info level
|
|
// [pBuffer] the info buffer
|
|
//
|
|
// Returns: ERROR_INVALID_PARAMETER
|
|
//
|
|
// Notes:
|
|
//
|
|
//----------------------------------------------------------------------------
|
|
ULONG PrintDfsInfo(DWORD dwLevel, LPBYTE pBuffer)
|
|
{
|
|
ULONG ulErr = ERROR_SUCCESS;
|
|
|
|
MSG(fDebug,
|
|
"Entering PrintDfsInfo(%lu,..)\n",
|
|
dwLevel);
|
|
if (NULL == pBuffer)
|
|
{
|
|
RETURN(ERROR_INVALID_PARAMETER);
|
|
}
|
|
|
|
switch (dwLevel)
|
|
{
|
|
case 1:
|
|
ulErr = PrintDfsInfo1((PDFS_INFO_1)pBuffer);
|
|
break;
|
|
case 2:
|
|
ulErr = PrintDfsInfo2((PDFS_INFO_2)pBuffer);
|
|
break;
|
|
case 3:
|
|
ulErr = PrintDfsInfo3((PDFS_INFO_3)pBuffer);
|
|
break;
|
|
case 4:
|
|
ulErr = PrintDfsInfo4((PDFS_INFO_4)pBuffer);
|
|
break;
|
|
case 200:
|
|
ulErr = PrintDfsInfo200((PDFS_INFO_200)pBuffer);
|
|
break;
|
|
case 300:
|
|
ulErr = PrintDfsInfo300((PDFS_INFO_300)pBuffer);
|
|
break;
|
|
|
|
default:
|
|
RETURN(ERROR_INVALID_PARAMETER);
|
|
} //switch
|
|
|
|
MSG(fDebug,
|
|
"Exiting PrintDfsInfo(..) with %lu\n",
|
|
ulErr);
|
|
RETURN(ulErr);
|
|
}; //PrintDfsInfo
|
|
|
|
|
|
|
|
|
|
|
|
//+---------------------------------------------------------------------------
|
|
//
|
|
// Function: PrintDfsInfo1
|
|
//
|
|
// Synopsis: This function prints a DFS_INFO_1 buffer out.
|
|
//
|
|
// Arguments: [pBuffer] the info buffer
|
|
//
|
|
// Returns: ERROR_INVALID_PARAMETER
|
|
//
|
|
// Notes:
|
|
//
|
|
//----------------------------------------------------------------------------
|
|
ULONG PrintDfsInfo1(PDFS_INFO_1 pBuffer)
|
|
{
|
|
ULONG ulErr = ERROR_SUCCESS;
|
|
|
|
MSG(fDebug,
|
|
"Entering PrintDfsInfo1(..)\n");
|
|
if (NULL == pBuffer)
|
|
{
|
|
RETURN(ERROR_INVALID_PARAMETER);
|
|
}
|
|
|
|
fprintf(stdout, "%ws\n", pBuffer->EntryPath);
|
|
|
|
MSG(fDebug,
|
|
"Exiting PrintDfsInfo1(..) witb %lu\n",
|
|
ulErr);
|
|
RETURN(ulErr);
|
|
}; //PrintDfsInfo1
|
|
|
|
|
|
|
|
|
|
|
|
//+---------------------------------------------------------------------------
|
|
//
|
|
// Function: PrintDfsInfo2
|
|
//
|
|
// Synopsis: This function prints a DFS_INFO_2 buffer out.
|
|
//
|
|
// Arguments: [pBuffer] the info buffer
|
|
//
|
|
// Returns: ERROR_INVALID_PARAMETER
|
|
//
|
|
// Notes:
|
|
//
|
|
//----------------------------------------------------------------------------
|
|
ULONG PrintDfsInfo2(PDFS_INFO_2 pBuffer)
|
|
{
|
|
ULONG ulErr = ERROR_SUCCESS;
|
|
|
|
MSG(fDebug,
|
|
"Entering PrintDfsInfo2(..)\n");
|
|
if (NULL == pBuffer)
|
|
{
|
|
RETURN(ERROR_INVALID_PARAMETER);
|
|
}
|
|
|
|
fprintf(stdout, "%ws ", pBuffer->EntryPath);
|
|
fprintf(stdout, "\"%ws\" ", pBuffer->Comment);
|
|
|
|
switch (pBuffer->State & 0xff)
|
|
{
|
|
case DFS_VOLUME_STATE_OK:
|
|
fprintf(stdout, "OK ");
|
|
break;
|
|
case DFS_VOLUME_STATE_INCONSISTENT:
|
|
fprintf(stdout, "INCONS ");
|
|
break;
|
|
case DFS_VOLUME_STATE_ONLINE:
|
|
fprintf(stdout, "ONLINE ");
|
|
break;
|
|
case DFS_VOLUME_STATE_OFFLINE:
|
|
fprintf(stdout, "OFFLINE ");
|
|
break;
|
|
default:
|
|
RETURN(ERROR_INVALID_PARAMETER);
|
|
} //switch
|
|
switch (pBuffer->State & DFS_VOLUME_FLAVORS)
|
|
{
|
|
case DFS_VOLUME_FLAVOR_STANDALONE:
|
|
fprintf(stdout, "Standalone ");
|
|
break;
|
|
case DFS_VOLUME_FLAVOR_AD_BLOB:
|
|
fprintf(stdout, "Ad Blob ");
|
|
break;
|
|
} //switch
|
|
|
|
fprintf(stdout, "%lu\n", pBuffer->NumberOfStorages);
|
|
|
|
MSG(fDebug,
|
|
"Exiting PrintDfsInfo2(..) with %lu\n",
|
|
ulErr);
|
|
RETURN(ulErr);
|
|
}; //PrintDfsInfo2
|
|
|
|
|
|
|
|
|
|
|
|
//+---------------------------------------------------------------------------
|
|
//
|
|
// Function: PrintDfsInfo3
|
|
//
|
|
// Synopsis: This function prints a DFS_INFO_3 buffer out.
|
|
//
|
|
// Arguments: [pBuffer] the info buffer
|
|
//
|
|
// Returns: ERROR_INVALID_PARAMETER
|
|
//
|
|
// Notes:
|
|
//
|
|
//----------------------------------------------------------------------------
|
|
ULONG PrintDfsInfo3(PDFS_INFO_3 pBuffer)
|
|
{
|
|
ULONG ulErr = ERROR_SUCCESS;
|
|
DWORD i = 0;
|
|
PDFS_STORAGE_INFO pStorage = NULL;
|
|
|
|
MSG(fDebug,
|
|
"Entering PrintDfsInfo3(..)\n");
|
|
if (NULL == pBuffer)
|
|
{
|
|
RETURN(ERROR_INVALID_PARAMETER);
|
|
}
|
|
|
|
fprintf(stdout, "%ws ", pBuffer->EntryPath);
|
|
fprintf(stdout, "\"%ws\" ", pBuffer->Comment);
|
|
switch (pBuffer->State & 0xff)
|
|
{
|
|
case DFS_VOLUME_STATE_OK:
|
|
fprintf(stdout, "OK ");
|
|
break;
|
|
case DFS_VOLUME_STATE_INCONSISTENT:
|
|
fprintf(stdout, "INCONS ");
|
|
break;
|
|
case DFS_VOLUME_STATE_ONLINE:
|
|
fprintf(stdout, "ONLINE ");
|
|
break;
|
|
case DFS_VOLUME_STATE_OFFLINE:
|
|
fprintf(stdout, "OFFLINE ");
|
|
break;
|
|
default:
|
|
RETURN(ERROR_INVALID_PARAMETER);
|
|
} //switch
|
|
switch (pBuffer->State & DFS_VOLUME_FLAVORS)
|
|
{
|
|
case DFS_VOLUME_FLAVOR_STANDALONE:
|
|
fprintf(stdout, "Standalone ");
|
|
break;
|
|
case DFS_VOLUME_FLAVOR_AD_BLOB:
|
|
fprintf(stdout, "Ad Blob ");
|
|
break;
|
|
} //switch
|
|
|
|
fprintf(stdout, "%lu\n", pBuffer->NumberOfStorages);
|
|
for (i=0, pStorage=pBuffer->Storage;
|
|
i<pBuffer->NumberOfStorages && ERROR_SUCCESS == ulErr;
|
|
i++,pStorage=pBuffer->Storage+i)
|
|
{
|
|
ulErr = PrintStgInfo(pStorage);
|
|
}
|
|
|
|
MSG(fDebug,
|
|
"Exiting PrintDfsInfo3(..) with %lu\n", ulErr);
|
|
RETURN(ulErr);
|
|
}; //PrintDfsInfo3
|
|
|
|
|
|
|
|
|
|
|
|
//+---------------------------------------------------------------------------
|
|
//
|
|
// Function: PrintDfsInfo4
|
|
//
|
|
// Synopsis: This function prints a DFS_INFO_4 buffer out.
|
|
//
|
|
// Arguments: [pBuffer] the info buffer
|
|
//
|
|
// Returns: ERROR_INVALID_PARAMETER
|
|
//
|
|
// Notes:
|
|
//
|
|
//----------------------------------------------------------------------------
|
|
ULONG PrintDfsInfo4(PDFS_INFO_4 pBuffer)
|
|
{
|
|
ULONG ulErr = ERROR_SUCCESS;
|
|
DWORD i = 0;
|
|
PDFS_STORAGE_INFO pStorage = NULL;
|
|
|
|
MSG(fDebug,
|
|
"Entering PrintDfsInfo4(..)\n");
|
|
if (NULL == pBuffer)
|
|
{
|
|
RETURN(ERROR_INVALID_PARAMETER);
|
|
}
|
|
|
|
fprintf(stdout, "%ws ", pBuffer->EntryPath);
|
|
fprintf(stdout, "\"%ws\" ", pBuffer->Comment);
|
|
switch (pBuffer->State & 0xff)
|
|
{
|
|
case DFS_VOLUME_STATE_OK:
|
|
fprintf(stdout, "OK ");
|
|
break;
|
|
case DFS_VOLUME_STATE_INCONSISTENT:
|
|
fprintf(stdout, "INCONS ");
|
|
break;
|
|
case DFS_VOLUME_STATE_ONLINE:
|
|
fprintf(stdout, "ONLINE ");
|
|
break;
|
|
case DFS_VOLUME_STATE_OFFLINE:
|
|
fprintf(stdout, "OFFLINE ");
|
|
break;
|
|
default:
|
|
RETURN(ERROR_INVALID_PARAMETER);
|
|
} //switch
|
|
switch (pBuffer->State & DFS_VOLUME_FLAVORS)
|
|
{
|
|
case DFS_VOLUME_FLAVOR_STANDALONE:
|
|
fprintf(stdout, "Standalone ");
|
|
break;
|
|
case DFS_VOLUME_FLAVOR_AD_BLOB:
|
|
fprintf(stdout, "Ad Blob ");
|
|
break;
|
|
} //switch
|
|
|
|
fprintf(stdout, "%lus ", pBuffer->Timeout);
|
|
fprintf(stdout, "%lu storage(s)\n", pBuffer->NumberOfStorages);
|
|
|
|
for (i=0, pStorage=pBuffer->Storage;
|
|
i<pBuffer->NumberOfStorages && ERROR_SUCCESS == ulErr;
|
|
i++,pStorage=pBuffer->Storage+i)
|
|
{
|
|
ulErr = PrintStgInfo(pStorage);
|
|
}
|
|
|
|
MSG(fDebug,
|
|
"Exiting PrintDfsInfo4(..) with %lu\n",
|
|
ulErr);
|
|
RETURN(ulErr);
|
|
}; //PrintDfsInfo4
|
|
|
|
|
|
|
|
|
|
|
|
//+---------------------------------------------------------------------------
|
|
//
|
|
// Function: PrintDfsInfo200
|
|
//
|
|
// Synopsis: This function prints a DFS_INFO_200 buffer out.
|
|
//
|
|
// Arguments: [pBuffer] the info buffer
|
|
//
|
|
// Returns: ERROR_INVALID_PARAMETER
|
|
//
|
|
// Notes:
|
|
//
|
|
//----------------------------------------------------------------------------
|
|
ULONG PrintDfsInfo200(PDFS_INFO_200 pBuffer)
|
|
{
|
|
ULONG ulErr = ERROR_SUCCESS;
|
|
|
|
MSG(fDebug,
|
|
"Entering PrintDfsInfo200(..)\n");
|
|
if (NULL == pBuffer)
|
|
{
|
|
RETURN(ERROR_INVALID_PARAMETER);
|
|
}
|
|
|
|
fprintf(stdout, "%ws\n", pBuffer->FtDfsName);
|
|
|
|
MSG(fDebug,
|
|
"Exiting PrintDfsInfo200(..) with %lu\n",
|
|
ulErr);
|
|
RETURN(ulErr);
|
|
}; //PrintDfsInfo4
|
|
|
|
|
|
//+---------------------------------------------------------------------------
|
|
//
|
|
// Function: PrintDfsInfo300
|
|
//
|
|
// Synopsis: This function prints a DFS_INFO_200 buffer out.
|
|
//
|
|
// Arguments: [pBuffer] the info buffer
|
|
//
|
|
// Returns: ERROR_INVALID_PARAMETER
|
|
//
|
|
// Notes:
|
|
//
|
|
//----------------------------------------------------------------------------
|
|
ULONG PrintDfsInfo300(PDFS_INFO_300 pBuffer)
|
|
{
|
|
ULONG ulErr = ERROR_SUCCESS;
|
|
|
|
MSG(fDebug,
|
|
"Entering PrintDfsInfo300(..)\n");
|
|
if (NULL == pBuffer)
|
|
{
|
|
RETURN(ERROR_INVALID_PARAMETER);
|
|
}
|
|
|
|
fprintf(stdout, "%ws:", pBuffer->DfsName);
|
|
fprintf(stdout, "Flavor: %x\n", pBuffer->Flags);
|
|
|
|
MSG(fDebug,
|
|
"Exiting PrintDfsInfo300(..) with %lu\n",
|
|
ulErr);
|
|
RETURN(ulErr);
|
|
}; //PrintDfsInfo4
|
|
|
|
|
|
|
|
|
|
|
|
//+---------------------------------------------------------------------------
|
|
//
|
|
// Function: PrintStgInfo
|
|
//
|
|
// Synopsis: This function prints a DFS_STORAGE_INFO buffer out.
|
|
//
|
|
// Arguments: [pBuffer] the info buffer
|
|
//
|
|
// Returns: ERROR_INVALID_PARAMETER
|
|
//
|
|
// Notes:
|
|
//
|
|
//----------------------------------------------------------------------------
|
|
ULONG PrintStgInfo(PDFS_STORAGE_INFO pBuffer)
|
|
{
|
|
ULONG ulErr = ERROR_SUCCESS;
|
|
|
|
MSG(fDebug,
|
|
"Entering PrintStgInfo(..)\n");
|
|
if (NULL == pBuffer)
|
|
{
|
|
RETURN(ERROR_INVALID_PARAMETER);
|
|
}
|
|
|
|
fprintf(stdout, "\t\\\\%ws\\%ws\t",
|
|
pBuffer->ServerName, pBuffer->ShareName);
|
|
|
|
if (pBuffer->State & DFS_STORAGE_STATE_ONLINE)
|
|
{
|
|
fprintf(stdout, "online ");
|
|
|
|
if (pBuffer->State & DFS_STORAGE_STATE_OFFLINE)
|
|
{
|
|
RETURN(ERROR_INVALID_DATA);
|
|
}
|
|
} //if
|
|
|
|
if (pBuffer->State & DFS_STORAGE_STATE_OFFLINE)
|
|
{
|
|
fprintf(stdout, "offline ");
|
|
|
|
if (pBuffer->State & DFS_STORAGE_STATE_ONLINE)
|
|
{
|
|
RETURN(ERROR_INVALID_DATA);
|
|
}
|
|
} //if
|
|
|
|
if (pBuffer->State & DFS_STORAGE_STATE_ACTIVE)
|
|
{
|
|
fprintf(stdout, "active ");
|
|
}
|
|
|
|
fprintf(stdout, "\n");
|
|
|
|
MSG(fDebug,
|
|
"Exiting PrintStgInfo(..) with %lu\n",
|
|
ulErr);
|
|
RETURN(ulErr);
|
|
}; //PrintStgInfo
|
|
|
|
|
|
|
|
|
|
|
|
//+---------------------------------------------------------------------------
|
|
//
|
|
// Function: GetStringParam
|
|
//
|
|
// Synopsis: This function receives a string and it returns the
|
|
// string itself if it is a "good" one (not null, not
|
|
// empty, etc).
|
|
//
|
|
// Arguments: [ptszParam] the string to evaluate
|
|
//
|
|
// Returns: the string itself or NULL.
|
|
//
|
|
// Notes:
|
|
//
|
|
//----------------------------------------------------------------------------
|
|
LPTSTR GetStringParam(LPTSTR ptszParam)
|
|
{
|
|
if (NULL == ptszParam ||
|
|
_T('\0') == ptszParam[0] ||
|
|
0 == _tcscmp(_T("\"\""), ptszParam))
|
|
{
|
|
return(NULL);
|
|
}
|
|
|
|
return(ptszParam);
|
|
}; //GetStringParam
|