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.
904 lines
22 KiB
904 lines
22 KiB
//+----------------------------------------------------------------------------
|
|
//
|
|
// Copyright (C) 1992, Microsoft Corporation
|
|
//
|
|
// File: netdfs.c
|
|
//
|
|
// Contents: Code to test the NetDfsXXX APIs
|
|
//
|
|
// Classes:
|
|
//
|
|
// Functions:
|
|
//
|
|
// History: 10 Jan 95 Milans Created.
|
|
//
|
|
//-----------------------------------------------------------------------------
|
|
|
|
#include <stdio.h>
|
|
#include <stdlib.h>
|
|
#include <windows.h>
|
|
#include <lm.h>
|
|
#include <lmdfs.h>
|
|
|
|
// BUGBUG!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
|
|
NET_API_STATUS NET_API_FUNCTION
|
|
NetDfsGetPathInfo(
|
|
IN LPWSTR Path, // Win32 path
|
|
IN DWORD Level, // Level of information requested
|
|
OUT LPBYTE* Buffer // API allocates and returns buffer with requested info
|
|
)
|
|
{
|
|
return ERROR_INVALID_FUNCTION;
|
|
}
|
|
|
|
typedef ULONG (*API_TEST_FUNC)(
|
|
LPWSTR wszDfsName,
|
|
LPWSTR wszDfsEntryPath,
|
|
LPWSTR wszNewEntryPath,
|
|
LPWSTR wszServerName,
|
|
LPWSTR wszShareName,
|
|
LPWSTR wszComment,
|
|
DWORD Level,
|
|
DWORD Flag,
|
|
DWORD State,
|
|
DWORD PrefMaxLen,
|
|
DWORD ResumeHandle);
|
|
|
|
ULONG DfsAdd(
|
|
LPWSTR wszDfsName,
|
|
LPWSTR wszDfsEntryPath,
|
|
LPWSTR wszNewEntryPath,
|
|
LPWSTR wszServerName,
|
|
LPWSTR wszShareName,
|
|
LPWSTR wszComment,
|
|
DWORD Level,
|
|
DWORD Flag,
|
|
DWORD State,
|
|
DWORD PrefMaxLen,
|
|
DWORD ResumeHandle);
|
|
|
|
ULONG DfsRemove(
|
|
LPWSTR wszDfsName,
|
|
LPWSTR wszDfsEntryPath,
|
|
LPWSTR wszNewEntryPath,
|
|
LPWSTR wszServerName,
|
|
LPWSTR wszShareName,
|
|
LPWSTR wszComment,
|
|
DWORD Level,
|
|
DWORD Flag,
|
|
DWORD State,
|
|
DWORD PrefMaxLen,
|
|
DWORD ResumeHandle);
|
|
|
|
ULONG DfsSetInfo(
|
|
LPWSTR wszDfsName,
|
|
LPWSTR wszDfsEntryPath,
|
|
LPWSTR wszNewEntryPath,
|
|
LPWSTR wszServerName,
|
|
LPWSTR wszShareName,
|
|
LPWSTR wszComment,
|
|
DWORD Level,
|
|
DWORD Flag,
|
|
DWORD State,
|
|
DWORD PrefMaxLen,
|
|
DWORD ResumeHandle);
|
|
|
|
|
|
ULONG DfsGetInfo(
|
|
LPWSTR wszDfsName,
|
|
LPWSTR wszDfsEntryPath,
|
|
LPWSTR wszNewEntryPath,
|
|
LPWSTR wszServerName,
|
|
LPWSTR wszShareName,
|
|
LPWSTR wszComment,
|
|
DWORD Level,
|
|
DWORD Flag,
|
|
DWORD State,
|
|
DWORD PrefMaxLen,
|
|
DWORD ResumeHandle);
|
|
|
|
ULONG DfsGetPathInfo(
|
|
LPWSTR wszDfsName,
|
|
LPWSTR wszDfsEntryPath,
|
|
LPWSTR wszNewEntryPath,
|
|
LPWSTR wszServerName,
|
|
LPWSTR wszShareName,
|
|
LPWSTR wszComment,
|
|
DWORD Level,
|
|
DWORD Flag,
|
|
DWORD State,
|
|
DWORD PrefMaxLen,
|
|
DWORD ResumeHandle);
|
|
|
|
ULONG DfsEnum(
|
|
LPWSTR wszDfsName,
|
|
LPWSTR wszDfsEntryPath,
|
|
LPWSTR wszNewEntryPath,
|
|
LPWSTR wszServerName,
|
|
LPWSTR wszShareName,
|
|
LPWSTR wszComment,
|
|
DWORD Level,
|
|
DWORD Flag,
|
|
DWORD State,
|
|
DWORD PrefMaxLen,
|
|
DWORD ResumeHandle);
|
|
|
|
ULONG DfsMove(
|
|
LPWSTR wszDfsName,
|
|
LPWSTR wszDfsEntryPath,
|
|
LPWSTR wszNewEntryPath,
|
|
LPWSTR wszServerName,
|
|
LPWSTR wszShareName,
|
|
LPWSTR wszComment,
|
|
DWORD Level,
|
|
DWORD Flag,
|
|
DWORD State,
|
|
DWORD PrefMaxLen,
|
|
DWORD ResumeHandle);
|
|
|
|
ULONG DfsRename(
|
|
LPWSTR wszDfsName,
|
|
LPWSTR wszDfsEntryPath,
|
|
LPWSTR wszNewEntryPath,
|
|
LPWSTR wszServerName,
|
|
LPWSTR wszShareName,
|
|
LPWSTR wszComment,
|
|
DWORD Level,
|
|
DWORD Flag,
|
|
DWORD State,
|
|
DWORD PrefMaxLen,
|
|
DWORD ResumeHandle);
|
|
|
|
const struct {
|
|
LPWSTR wszApiName;
|
|
LPWSTR wszApiComment;
|
|
API_TEST_FUNC fnApiTest;
|
|
} rgApiInfo[] = {
|
|
{ L"NetDfsAdd", L"(flags: -e -v -r [-c] -f)", DfsAdd },
|
|
{ L"NetDfsRemove", L"(flags: -e -v -r)", DfsRemove },
|
|
{ L"NetDfsSetInfo", L"(flags: -e [-v] [-r] -l -s [1 = offline, 2 = online]) (levels 100, 101)", DfsSetInfo },
|
|
{ L"NetDfsGetInfo", L"(flags: -e [-v] [-r] -l) (levels 100, 101)", DfsGetInfo },
|
|
{ L"NetDfsGetPathInfo", L"(flags: -e -l) (levels 200, 201, 202)", DfsGetPathInfo },
|
|
{ L"NetDfsEnum", L"(flags: -d -l) (levels 1, 2, 3)", DfsEnum },
|
|
// Some aliases for convenience...
|
|
{ L"Add", L"", DfsAdd },
|
|
{ L"Remove", L"", DfsRemove },
|
|
{ L"SetInfo", L"", DfsSetInfo },
|
|
{ L"GetInfo", L"", DfsGetInfo},
|
|
{ L"GetPathInfo", L"", DfsGetPathInfo },
|
|
{ L"Enum", L"", DfsEnum}
|
|
};
|
|
|
|
VOID Usage();
|
|
|
|
BOOLEAN fQuiet = FALSE;
|
|
|
|
VOID
|
|
errmsg( char *text, ULONG code )
|
|
{
|
|
int i;
|
|
char msg[ 100 ];
|
|
|
|
i = FormatMessageA( FORMAT_MESSAGE_FROM_SYSTEM | sizeof( msg ),
|
|
NULL,
|
|
code,
|
|
0,
|
|
msg,
|
|
sizeof(msg),
|
|
NULL );
|
|
|
|
if( i )
|
|
fprintf( stderr, "%s: %s\n", text, msg );
|
|
else
|
|
fprintf( stderr, "%s: error 0x%X (%u)\n", text, code, code );
|
|
}
|
|
|
|
|
|
//+----------------------------------------------------------------------------
|
|
//
|
|
// Function: main
|
|
//
|
|
// Synopsis:
|
|
//
|
|
// Arguments:
|
|
//
|
|
// Returns:
|
|
//
|
|
//-----------------------------------------------------------------------------
|
|
|
|
ULONG __cdecl
|
|
main(
|
|
int argc,
|
|
char *argv[])
|
|
{
|
|
WCHAR wszApiName[32];
|
|
WCHAR wszDfsName[32];
|
|
WCHAR wszDfsEntryPath[MAX_PATH];
|
|
WCHAR wszNewEntryPath[MAX_PATH];
|
|
WCHAR wszServerName[80];
|
|
WCHAR wszShareName[NNLEN+1];
|
|
WCHAR wszComment[80];
|
|
DWORD Level;
|
|
DWORD Flag;
|
|
DWORD State;
|
|
DWORD PrefMaxLen;
|
|
DWORD ResumeHandle;
|
|
|
|
int i;
|
|
char *curtok;
|
|
BOOL fCmdError = FALSE;
|
|
|
|
//
|
|
// Initialize vars to defaults...
|
|
//
|
|
|
|
wszApiName[0] = UNICODE_NULL;
|
|
wszDfsName[0] = UNICODE_NULL;
|
|
wszDfsEntryPath[0] = UNICODE_NULL;
|
|
wszNewEntryPath[0] = UNICODE_NULL;
|
|
wszServerName[0] = UNICODE_NULL;
|
|
wszShareName[0] = UNICODE_NULL;
|
|
wszComment[0] = UNICODE_NULL;
|
|
|
|
Level = 1;
|
|
Flag = 0;
|
|
State = 0;
|
|
PrefMaxLen = (DWORD) ~0;
|
|
ResumeHandle = 0;
|
|
|
|
//
|
|
// Parse out the args...
|
|
//
|
|
|
|
for (i = 1; i < argc && !fCmdError; i++) {
|
|
|
|
curtok = argv[i];
|
|
|
|
if (curtok[0] == '-' || curtok[0] == '\\') {
|
|
|
|
#define NEXT_STRING_ARG(wszDest) \
|
|
i++; \
|
|
if (i < argc) { \
|
|
mbstowcs(wszDest, argv[i], strlen(argv[i]) + 1); \
|
|
} else { \
|
|
fCmdError = TRUE; \
|
|
}
|
|
|
|
#define NEXT_DWORD_ARG(k) \
|
|
i++; \
|
|
if (i < argc) { \
|
|
k = (DWORD) atoi(argv[i]); \
|
|
} else { \
|
|
fCmdError = TRUE; \
|
|
}
|
|
|
|
|
|
switch (curtok[1]) {
|
|
case 'a':
|
|
NEXT_STRING_ARG(wszApiName);
|
|
break;
|
|
|
|
case 'c':
|
|
NEXT_STRING_ARG(wszComment);
|
|
break;
|
|
|
|
case 'd':
|
|
NEXT_STRING_ARG(wszDfsName);
|
|
break;
|
|
|
|
case 'q':
|
|
fQuiet = 1 - fQuiet;
|
|
break;
|
|
|
|
case 'e':
|
|
NEXT_STRING_ARG(wszDfsEntryPath);
|
|
break;
|
|
|
|
case 'f':
|
|
NEXT_DWORD_ARG(Flag);
|
|
break;
|
|
|
|
case 'h':
|
|
NEXT_DWORD_ARG(ResumeHandle);
|
|
break;
|
|
|
|
case 'l':
|
|
NEXT_DWORD_ARG(Level);
|
|
break;
|
|
|
|
case 'n':
|
|
NEXT_STRING_ARG(wszNewEntryPath);
|
|
break;
|
|
|
|
case 'm':
|
|
NEXT_DWORD_ARG(PrefMaxLen);
|
|
break;
|
|
|
|
case 'r':
|
|
NEXT_STRING_ARG(wszShareName);
|
|
break;
|
|
|
|
case 's':
|
|
NEXT_DWORD_ARG(State);
|
|
break;
|
|
|
|
case 'v':
|
|
NEXT_STRING_ARG(wszServerName);
|
|
break;
|
|
|
|
default:
|
|
fCmdError = TRUE;
|
|
break;
|
|
}
|
|
|
|
} else {
|
|
|
|
fCmdError = TRUE;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
if (wszApiName[0] == UNICODE_NULL) {
|
|
|
|
fCmdError = TRUE;
|
|
|
|
}
|
|
|
|
if (!fCmdError) {
|
|
|
|
fCmdError = TRUE; // ...because we haven't
|
|
// yet found a valid API name
|
|
|
|
for (i = 0;
|
|
i < sizeof(rgApiInfo) / sizeof(rgApiInfo[0]) && fCmdError;
|
|
i++) {
|
|
|
|
if (_wcsicmp( wszApiName, rgApiInfo[i].wszApiName ) == 0) {
|
|
|
|
return rgApiInfo[i].fnApiTest(
|
|
wszDfsName,
|
|
wszDfsEntryPath,
|
|
wszNewEntryPath,
|
|
wszServerName,
|
|
wszShareName,
|
|
wszComment,
|
|
Level,
|
|
Flag,
|
|
State,
|
|
PrefMaxLen,
|
|
ResumeHandle);
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
if (fCmdError) {
|
|
Usage();
|
|
}
|
|
|
|
return 1;
|
|
|
|
}
|
|
|
|
//+----------------------------------------------------------------------------
|
|
//
|
|
// Function: DfsAdd
|
|
//
|
|
// Synopsis: Test function for NetDfsAdd
|
|
//
|
|
// Arguments:
|
|
//
|
|
// Returns:
|
|
//
|
|
//-----------------------------------------------------------------------------
|
|
|
|
ULONG DfsAdd(
|
|
LPWSTR wszDfsName,
|
|
LPWSTR wszDfsEntryPath,
|
|
LPWSTR wszNewEntryPath,
|
|
LPWSTR wszServerName,
|
|
LPWSTR wszShareName,
|
|
LPWSTR wszComment,
|
|
DWORD Level,
|
|
DWORD Flag,
|
|
DWORD State,
|
|
DWORD PrefMaxLen,
|
|
DWORD ResumeHandle)
|
|
{
|
|
NET_API_STATUS status;
|
|
|
|
if( fQuiet == FALSE ) {
|
|
printf("Calling NetDfsAdd...\n");
|
|
printf("\tDfsEntryPath: [%ws]\n"
|
|
"\tServerName: [%ws]\n"
|
|
"\tShareName: [%ws]\n"
|
|
"\tComment: [%ws]\n"
|
|
"\tFlag: %d\n",
|
|
wszDfsEntryPath, wszServerName, wszShareName, wszComment, Flag);
|
|
}
|
|
|
|
status = NetDfsAdd(
|
|
wszDfsEntryPath,
|
|
wszServerName,
|
|
wszShareName,
|
|
wszComment,
|
|
Flag);
|
|
|
|
if (status == NERR_Success) {
|
|
if( fQuiet == FALSE ) printf("NetDfsAdd succeeded!\n");
|
|
} else {
|
|
errmsg("NetDfsAdd", status);
|
|
}
|
|
|
|
return status;
|
|
}
|
|
|
|
//+----------------------------------------------------------------------------
|
|
//
|
|
// Function: DfsRemove
|
|
//
|
|
// Synopsis: Test function for NetDfsRemove
|
|
//
|
|
// Arguments:
|
|
//
|
|
// Returns:
|
|
//
|
|
//-----------------------------------------------------------------------------
|
|
|
|
ULONG DfsRemove(
|
|
LPWSTR wszDfsName,
|
|
LPWSTR wszDfsEntryPath,
|
|
LPWSTR wszNewEntryPath,
|
|
LPWSTR wszServerName,
|
|
LPWSTR wszShareName,
|
|
LPWSTR wszComment,
|
|
DWORD Level,
|
|
DWORD Flag,
|
|
DWORD State,
|
|
DWORD PrefMaxLen,
|
|
DWORD ResumeHandle)
|
|
{
|
|
NET_API_STATUS status;
|
|
|
|
if( fQuiet == FALSE ) {
|
|
printf("Calling NetDfsRemove...\n");
|
|
printf("\tDfsEntryPath: [%ws]\n"
|
|
"\tServerName: [%ws]\n"
|
|
"\tShareName: [%ws]\n",
|
|
wszDfsEntryPath, wszServerName, wszShareName);
|
|
}
|
|
|
|
status = NetDfsRemove(
|
|
wszDfsEntryPath,
|
|
wszServerName,
|
|
wszShareName);
|
|
|
|
if (status == NERR_Success) {
|
|
if( fQuiet == FALSE )printf("NetDfsRemove succeeded!\n");
|
|
} else {
|
|
errmsg("NetDfsRemove", status);
|
|
}
|
|
|
|
return status;
|
|
}
|
|
|
|
//+----------------------------------------------------------------------------
|
|
//
|
|
// Function: DfsSetInfo
|
|
//
|
|
// Synopsis: Test function for NetDfsSetInfo
|
|
//
|
|
// Arguments:
|
|
//
|
|
// Returns:
|
|
//
|
|
//-----------------------------------------------------------------------------
|
|
|
|
ULONG DfsSetInfo(
|
|
LPWSTR wszDfsName,
|
|
LPWSTR wszDfsEntryPath,
|
|
LPWSTR wszNewEntryPath,
|
|
LPWSTR wszServerName,
|
|
LPWSTR wszShareName,
|
|
LPWSTR wszComment,
|
|
DWORD Level,
|
|
DWORD Flag,
|
|
DWORD State,
|
|
DWORD PrefMaxLen,
|
|
DWORD ResumeHandle)
|
|
{
|
|
NET_API_STATUS status;
|
|
DFS_INFO_100 DfsInfo;
|
|
LPDFS_INFO_100 pDfsInfo0 = (LPDFS_INFO_100) &DfsInfo;
|
|
LPDFS_INFO_101 pDfsInfo1 = (LPDFS_INFO_101) &DfsInfo;
|
|
|
|
if( fQuiet == FALSE ) {
|
|
printf("Calling NetDfsSetInfo...\n");
|
|
printf("\tDfsEntryPath: [%ws]\n"
|
|
"\tServer: [%ws]\n"
|
|
"\tShare: [%ws]\n"
|
|
"\tLevel: %d\n",
|
|
wszDfsEntryPath, wszServerName, wszShareName, Level);
|
|
}
|
|
if (Level == 100) {
|
|
if( fQuiet == FALSE) printf("\tComment: [%ws]\n", wszComment);
|
|
pDfsInfo0->Comment = wszComment;
|
|
} else if (Level == 101) {
|
|
if( fQuiet == FALSE) printf("\tState: %d\n", State);
|
|
pDfsInfo1->State = State;
|
|
} else {
|
|
printf("\tUnrecognized Level, passing garbage for Buffer\n");
|
|
}
|
|
|
|
status = NetDfsSetInfo(
|
|
wszDfsEntryPath,
|
|
wszServerName,
|
|
wszShareName,
|
|
Level,
|
|
(LPBYTE) &DfsInfo);
|
|
|
|
if (status == NERR_Success) {
|
|
if( fQuiet == FALSE )printf("NetDfsSetInfo succeeded!\n");
|
|
} else {
|
|
errmsg("NetDfsSetInfo", status);
|
|
}
|
|
return status;
|
|
}
|
|
|
|
//+----------------------------------------------------------------------------
|
|
//
|
|
// Function: DfsGetInfo
|
|
//
|
|
// Synopsis: Test function for NetDfsGetInfo
|
|
//
|
|
// Arguments:
|
|
//
|
|
// Returns: Nothing
|
|
//
|
|
//-----------------------------------------------------------------------------
|
|
|
|
ULONG DfsGetInfo(
|
|
LPWSTR wszDfsName,
|
|
LPWSTR wszDfsEntryPath,
|
|
LPWSTR wszNewEntryPath,
|
|
LPWSTR wszServerName,
|
|
LPWSTR wszShareName,
|
|
LPWSTR wszComment,
|
|
DWORD Level,
|
|
DWORD Flag,
|
|
DWORD State,
|
|
DWORD PrefMaxLen,
|
|
DWORD ResumeHandle)
|
|
{
|
|
NET_API_STATUS status;
|
|
LPBYTE Buffer;
|
|
DWORD i;
|
|
|
|
if( fQuiet == FALSE ) {
|
|
printf("Calling NetDfsGetInfo...\n");
|
|
printf("\tDfsEntryPath: [%ws]\n"
|
|
"\tServerName: [%ws]\n"
|
|
"\tShareName: [%ws]\n"
|
|
"\tLevel: %d\n\n",
|
|
wszDfsEntryPath, wszServerName, wszShareName, Level);
|
|
}
|
|
|
|
status = NetDfsGetInfo(
|
|
wszDfsEntryPath,
|
|
wszServerName,
|
|
wszShareName,
|
|
Level,
|
|
&Buffer);
|
|
|
|
if (status == NERR_Success) {
|
|
|
|
LPDFS_INFO_3 pDfsInfoX = (LPDFS_INFO_3) Buffer;
|
|
LPDFS_INFO_100 pDfsInfo100 = (LPDFS_INFO_100) Buffer;
|
|
LPDFS_INFO_101 pDfsInfo101 = (LPDFS_INFO_101) Buffer;
|
|
|
|
if( fQuiet == FALSE )printf("NetDfsGetInfo Succeeded!\n");
|
|
|
|
switch (Level) {
|
|
case 1:
|
|
case 2:
|
|
case 3:
|
|
printf("EntryPath: [%ws]\n", pDfsInfoX->EntryPath);
|
|
if (Level == 1)
|
|
break;
|
|
printf("Comment: [%ws]\n", pDfsInfoX->Comment);
|
|
printf("State: %d\n", pDfsInfoX->State);
|
|
printf("NumberOfStorages: %d\n", pDfsInfoX->NumberOfStorages);
|
|
if (Level == 2)
|
|
break;
|
|
for (i = 0; i < pDfsInfoX->NumberOfStorages; i++) {
|
|
printf(" %d. \\\\%ws\\%ws -- State %d\n",
|
|
i, pDfsInfoX->Storage[i].ServerName,
|
|
pDfsInfoX->Storage[i].ShareName,
|
|
pDfsInfoX->Storage[i].State);
|
|
}
|
|
break;
|
|
|
|
case 100:
|
|
printf("Comment: [%ws]\n", pDfsInfo100->Comment);
|
|
break;
|
|
|
|
case 101:
|
|
printf("State: %d\n", pDfsInfo101->State);
|
|
break;
|
|
|
|
default:
|
|
printf("Unrecognized Level %d\n", Level);
|
|
break;
|
|
|
|
}
|
|
|
|
NetApiBufferFree( Buffer );
|
|
|
|
} else {
|
|
|
|
errmsg("NetDfsGetInfo", status);
|
|
|
|
}
|
|
|
|
return status;
|
|
|
|
}
|
|
|
|
//+----------------------------------------------------------------------------
|
|
//
|
|
// Function: DfsGetPathInfo
|
|
//
|
|
// Synopsis: Test function for NetDfsGetPathInfo
|
|
//
|
|
// Arguments:
|
|
//
|
|
// Returns: Nothing
|
|
//
|
|
//-----------------------------------------------------------------------------
|
|
|
|
ULONG DfsGetPathInfo(
|
|
LPWSTR wszDfsName,
|
|
LPWSTR wszDfsEntryPath,
|
|
LPWSTR wszNewEntryPath,
|
|
LPWSTR wszServerName,
|
|
LPWSTR wszShareName,
|
|
LPWSTR wszComment,
|
|
DWORD Level,
|
|
DWORD Flag,
|
|
DWORD State,
|
|
DWORD PrefMaxLen,
|
|
DWORD ResumeHandle)
|
|
{
|
|
NET_API_STATUS status;
|
|
LPBYTE Buffer;
|
|
DWORD i;
|
|
|
|
printf("BUGUBG: NetDfsGetPathInfo unimplemented\n");
|
|
return NO_ERROR;
|
|
|
|
printf("Calling NetDfsGetPathInfo...\n");
|
|
printf("\tDfsEntryPath: [%ws]\n"
|
|
"\tLevel: %d\n\n",
|
|
wszDfsEntryPath, Level);
|
|
|
|
status = NetDfsGetPathInfo(
|
|
wszDfsEntryPath,
|
|
Level,
|
|
&Buffer);
|
|
|
|
if (status == NERR_Success) {
|
|
|
|
LPDFS_INFO_200 pDfsInfo200 = (LPDFS_INFO_200) Buffer;
|
|
LPDFS_INFO_201 pDfsInfo201 = (LPDFS_INFO_201) Buffer;
|
|
LPDFS_INFO_202 pDfsInfo202 = (LPDFS_INFO_202) Buffer;
|
|
|
|
printf("NetDfsGetPathInfo Succeeded!\n");
|
|
|
|
do // for break
|
|
{
|
|
printf("PathType: [");
|
|
switch (pDfsInfo200->PathType)
|
|
{
|
|
case DFS_PATH_NONDFS: printf("non-Dfs"); break;
|
|
case DFS_PATH_REDIRECTED: printf("redirected"); break;
|
|
case DFS_PATH_LOCAL: printf("local"); break;
|
|
case DFS_PATH_UNC_IN_DFS: printf("UNC in Dfs"); break;
|
|
case DFS_PATH_UNIVERSAL: printf("Universal"); break;
|
|
default: printf("UNKNOWN"); break;
|
|
}
|
|
printf("]\n");
|
|
|
|
if (Level == 200)
|
|
break;
|
|
|
|
if (pDfsInfo201->PathType != DFS_PATH_NONDFS)
|
|
{
|
|
printf("DfsUniversalPath: [%ws]\n", pDfsInfo201->DfsUniversalPath);
|
|
}
|
|
|
|
if (Level == 201)
|
|
break;
|
|
|
|
if (pDfsInfo202->PathType != DFS_PATH_NONDFS)
|
|
{
|
|
printf("EntryPathLen: [%d]\n", pDfsInfo202->EntryPathLen);
|
|
}
|
|
} while (0);
|
|
|
|
NetApiBufferFree( Buffer );
|
|
|
|
} else {
|
|
|
|
errmsg("NetDfsGetPathInfo", status);
|
|
|
|
}
|
|
|
|
return status;
|
|
|
|
}
|
|
|
|
//+----------------------------------------------------------------------------
|
|
//
|
|
// Function: DfsEnum
|
|
//
|
|
// Synopsis: Test function for NetDfsEnum
|
|
//
|
|
// Arguments:
|
|
//
|
|
// Returns: Nothing
|
|
//
|
|
//-----------------------------------------------------------------------------
|
|
|
|
ULONG DfsEnum(
|
|
LPWSTR wszDfsName,
|
|
LPWSTR wszDfsEntryPath,
|
|
LPWSTR wszNewEntryPath,
|
|
LPWSTR wszServerName,
|
|
LPWSTR wszShareName,
|
|
LPWSTR wszComment,
|
|
DWORD Level,
|
|
DWORD Flag,
|
|
DWORD State,
|
|
DWORD PrefMaxLen,
|
|
DWORD ResumeHandle)
|
|
{
|
|
NET_API_STATUS status;
|
|
LPBYTE Buffer;
|
|
DWORD EntriesRead;
|
|
PDFS_INFO_3 pDfsInfo, pNextDfsInfo;
|
|
|
|
if( fQuiet == FALSE ) {
|
|
printf("Calling NetDfsEnum...\n");
|
|
printf("\tDfsName: [%ws]\n"
|
|
"\tLevel: %d\n"
|
|
"\t PrefMaxLen: %d\n"
|
|
"\tResumeHandle: %d\n\n",
|
|
wszDfsName, Level, PrefMaxLen, ResumeHandle);
|
|
}
|
|
|
|
status = NetDfsEnum(
|
|
wszDfsName,
|
|
Level,
|
|
PrefMaxLen,
|
|
&Buffer,
|
|
&EntriesRead,
|
|
&ResumeHandle);
|
|
|
|
if (status == NERR_Success) {
|
|
|
|
DWORD k, j;
|
|
LPDFS_STORAGE_INFO lpStorage;
|
|
|
|
if( fQuiet == FALSE )printf("NetDfsEnum succeeded!\n");
|
|
printf("\tEntries Read = %d\n", EntriesRead);
|
|
printf("\tResume Handle = %d\n", ResumeHandle);
|
|
|
|
printf("\tReturned Entries:\n");
|
|
|
|
pDfsInfo = (LPDFS_INFO_3) Buffer;
|
|
|
|
for (k = 0; k < EntriesRead; k++) {
|
|
|
|
switch (Level) {
|
|
case 1:
|
|
case 2:
|
|
case 3:
|
|
printf("\t % 3d. [%ws]\n", k, pDfsInfo->EntryPath);
|
|
|
|
if (Level == 1) {
|
|
|
|
pDfsInfo = (LPDFS_INFO_3)
|
|
((LPBYTE) pDfsInfo + sizeof(DFS_INFO_1));
|
|
|
|
break;
|
|
}
|
|
|
|
printf("\t [%ws]\n", pDfsInfo->Comment);
|
|
|
|
printf("\t State:%d Storages:%d\n",
|
|
pDfsInfo->State,
|
|
pDfsInfo->NumberOfStorages);
|
|
|
|
if (Level == 2) {
|
|
|
|
pDfsInfo = (LPDFS_INFO_3)
|
|
((LPBYTE) pDfsInfo + sizeof(DFS_INFO_2));
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
lpStorage = pDfsInfo->Storage;
|
|
|
|
for (j = 0; j < pDfsInfo->NumberOfStorages; j++) {
|
|
|
|
printf("\t \\\\%ws\\%ws\n",
|
|
lpStorage[j].ServerName,
|
|
lpStorage[j].ShareName);
|
|
|
|
}
|
|
|
|
pDfsInfo = (LPDFS_INFO_3)
|
|
((LPBYTE) pDfsInfo + sizeof(DFS_INFO_3));
|
|
|
|
break;
|
|
|
|
default:
|
|
printf("Unrecognized Level %d\n", Level);
|
|
break;
|
|
|
|
} // end switch
|
|
|
|
} // end for
|
|
|
|
NetApiBufferFree( Buffer );
|
|
|
|
} else {
|
|
|
|
errmsg("NetDfsEnum", status);
|
|
|
|
}
|
|
|
|
return status;
|
|
|
|
}
|
|
|
|
//+----------------------------------------------------------------------------
|
|
//
|
|
// Function: Usage
|
|
//
|
|
// Synopsis: Prints out usage command line for this program.
|
|
//
|
|
// Arguments: None
|
|
//
|
|
// Returns: Nothing
|
|
//
|
|
//-----------------------------------------------------------------------------
|
|
|
|
VOID Usage()
|
|
{
|
|
ULONG i;
|
|
|
|
printf("Usage: netdfs -a <api name> [options]\n");
|
|
printf("Options:\n");
|
|
printf("\t-c Comment -- Comment to pass to API\n");
|
|
printf("\t-d DfsName -- Name of Dfs Root\n");
|
|
printf("\t-e EntryPath -- Name of Dfs Volume\n");
|
|
printf("\t-f Flag -- Flag to pass to NetDfsAdd, 1 = add volume, 2 = add dfs link\n");
|
|
printf("\t-h ResumeHandle -- ResumeHandle or State value to pass to API\n");
|
|
printf("\t-l Level -- Level of info requested\n");
|
|
printf("\t-m PrefMaxLen -- Preferred Maximum Length of return buffer\n");
|
|
printf("\t-n NewEntryPath -- NewEntryPath to pass to API\n");
|
|
printf("\t-r ShareName -- ShareName to pass to API\n");
|
|
printf("\t-s State -- State to pass to NetDfsSetInfo for Level 101\n");
|
|
printf("\t-v ServerName -- ServerName to pass to API\n");
|
|
printf("\t-q -- quiet mode\n" );
|
|
printf("\nValid API names:\n" );
|
|
|
|
for (i = 0; i < sizeof(rgApiInfo) / sizeof(rgApiInfo[0]) ; i++ ) {
|
|
printf( "\t%ws %ws\n", rgApiInfo[i].wszApiName, rgApiInfo[i].wszApiComment );
|
|
}
|
|
|
|
}
|