|
|
/*++
Copyright (c) 1991 Microsoft Corporation
Module Name:
wstest.c
Abstract:
Test program for the NetWksta and NetUse APIs. Run this test after starting the Workstation service.
Author:
Rita Wong (ritaw) 12-Mar-1991
Revision History:
--*/
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <nt.h>
#include <ntrtl.h>
#include <nturtl.h>
#include <winerror.h>
#include <windef.h> // Win32 type definitions
#include <winbase.h> // Win32 base API prototypes
#include <lm.h> // LAN Man definitions
#include <netdebug.h> // NetpDbgDisplayWksta()
#include <netlib.h>
#include <tstring.h>
#ifdef UNICODE
#define FORMAT_STR "ws "
#else
#define FORMAT_STR "s "
#endif
#define CHANGE_HEURISTICS \
for (i = 0, ptr = &(redir->wki502_use_opportunistic_locking); i < 14; \ i++, ptr++) { \ if (*ptr) { \ *ptr = FALSE; \ } \ else { \ *ptr = TRUE; \ } \ }
CHAR WorkBuffer[(DEVLEN + RMLEN + PWLEN + UNLEN + DNLEN + 5) * sizeof(TCHAR) + sizeof(PUSE_INFO_2)];
LPWSTR TargetMachine = NULL;
VOID WsTestWkstaInfo( VOID );
VOID WsTestWkstaTransportEnum( VOID );
VOID WsTestUse( VOID );
VOID TestUseAdd( IN LPBYTE Buffer, IN DWORD ExpectedStatus );
VOID TestUseDel( IN LPTSTR UseName, IN DWORD ForceLevel, IN DWORD ExpectedStatus );
VOID TestUseEnum( DWORD PreferedMaximumLength, IN OUT LPDWORD ResumeHandle OPTIONAL );
VOID TestUseGetInfo( LPTSTR UseName, DWORD ExpectedStatus );
VOID PrintUseInfo1( PUSE_INFO_1 UseInfo );
VOID PrintUseInfo2( PUSE_INFO_2 UseInfo );
VOID __cdecl main( int argc, char *argv[] ) { if (argc > 1) {
if (argc == 3) { TargetMachine = NetpAllocWStrFromStr(argv[2]);
if (TargetMachine != NULL) {
printf("New Target is %ws\n", TargetMachine); } }
WsTestWkstaInfo();
WsTestWkstaTransportEnum();
if (TargetMachine != NULL) { NetApiBufferFree(TargetMachine); } }
WsTestUse(); }
VOID WsTestWkstaInfo( VOID ) { NET_API_STATUS status;
PWKSTA_INFO_502 redir;
PWKSTA_INFO_102 systeminfo102; PWKSTA_INFO_100 systeminfo100; PWKSTA_INFO_101 systeminfo101;
PWKSTA_USER_INFO_0 UserInfo0; PWKSTA_USER_INFO_1 UserInfo;
DWORD ErrorParameter; DWORD i = 0; BOOL *ptr = NULL;
DWORD ResumeHandle = 0; DWORD EntriesRead; DWORD TotalEntries;
printf("In wstest.exe\n\n");
status = NetWkstaGetInfo( TargetMachine, 502, (LPBYTE *) &redir );
printf("NetWkstaGetInfo Test:status=%lu\n", status);
if (status != NERR_Success) { goto TrySomethingElse; }
redir->wki502_char_wait++; redir->wki502_maximum_collection_count++; redir->wki502_collection_time++;
redir->wki502_keep_conn++; redir->wki502_siz_char_buf++;
redir->wki502_max_cmds++; // Not settable: should be ignored
redir->wki502_sess_timeout++; redir->wki502_lock_quota++; redir->wki502_lock_increment++; redir->wki502_lock_maximum++; redir->wki502_pipe_increment++; redir->wki502_pipe_maximum++;
redir->wki502_cache_file_timeout++;
CHANGE_HEURISTICS;
status = NetWkstaSetInfo( TargetMachine, 502, (LPBYTE) redir, &ErrorParameter );
printf("NetWkstaSetInfo Test:status=%lu\n", status);
//
// Free the get info buffer. We are getting another buffer from the
// next get.
//
NetApiBufferFree(redir);
if (status != NERR_Success) { if (status == ERROR_INVALID_PARAMETER) { printf( "NetWkstaSetInfo parameter %lu causes ERROR_INVALID_PARAMETER\n", ErrorParameter ); } goto TrySomethingElse; }
status = NetWkstaGetInfo( TargetMachine, 502, (LPBYTE *) &redir );
printf("NetWkstaGetInfo again: status=%lu\n", status);
if (status != NERR_Success) { goto TrySomethingElse; }
printf("\nAfter NetWkstaSetInfo, all values should be 1 extra" " maxcmds\n");
redir->wki502_char_wait--; redir->wki502_collection_time--; redir->wki502_maximum_collection_count--;
redir->wki502_keep_conn--; redir->wki502_siz_char_buf--;
//redir->wki502_max_cmds--; // Not settable
redir->wki502_sess_timeout--; redir->wki502_lock_quota--; redir->wki502_lock_increment--; redir->wki502_lock_maximum--; redir->wki502_pipe_increment--; redir->wki502_pipe_maximum--;
redir->wki502_cache_file_timeout--;
CHANGE_HEURISTICS;
status = NetWkstaSetInfo( TargetMachine, 502, (LPBYTE) redir, NULL );
NetApiBufferFree(redir);
printf("NetWkstaGetInfo to reset to original values: status=%lu\n", status);
TrySomethingElse: //
// Get system info 102
//
status = NetWkstaGetInfo( TargetMachine, 102, (LPBYTE *) &systeminfo102 );
if (status == NERR_Success) { NetApiBufferFree(systeminfo102); } else { printf("NetWkstaGetInfo level 102: FAILED %lu\n", status); }
//
// Get system info 100
//
status = NetWkstaGetInfo( TargetMachine, 100, (LPBYTE *) &systeminfo100 );
if (status == NERR_Success) { NetApiBufferFree(systeminfo100); } else { printf("NetWkstaGetInfo level 100: FAILED %lu\n", status); }
//
// Get system info 101
//
status = NetWkstaGetInfo( TargetMachine, 101, (LPBYTE *) &systeminfo101 );
if (status == NERR_Success) { NetApiBufferFree(systeminfo101); } else { printf("NetWkstaGetInfo level 101: FAILED %lu\n", status); }
//
// Get user info level 1
//
status = NetWkstaUserGetInfo( NULL, 1, (LPBYTE *) &UserInfo );
if (status == NERR_Success) { printf("NetWkstaUserGetInfo level 1:\n" "username=" FORMAT_LPTSTR "\nlogon domain=" FORMAT_LPTSTR "\nother domains=" FORMAT_LPTSTR "\nlogon server=" FORMAT_LPTSTR "\n", UserInfo->wkui1_username, UserInfo->wkui1_logon_domain, UserInfo->wkui1_oth_domains, UserInfo->wkui1_logon_server );
NetApiBufferFree(UserInfo); } else { printf("NetWkstaUserGetInfo level 1: FAILED %lu", status); }
//
// Get user info level 0
//
status = NetWkstaUserGetInfo( NULL, 0, (LPBYTE *) &UserInfo0 );
if (status == NERR_Success) { printf("NetWkstaUserGetInfo level 0:\nusername=" FORMAT_LPTSTR "\n", UserInfo0->wkui0_username );
NetApiBufferFree(UserInfo0); } else { printf("NetWkstaUserGetInfo level 0: FAILED %lu", status); }
status = NetWkstaUserEnum ( TargetMachine, 1, (LPBYTE *) &UserInfo, MAXULONG, &EntriesRead, &TotalEntries, &ResumeHandle );
if (status == NERR_Success) {
PWKSTA_USER_INFO_1 TmpPtr = UserInfo;
printf("NetWkstaUserEnum level 1: EntriesRead=%lu, TotalEntries=%lu\n", EntriesRead, TotalEntries);
for (i = 0; i < EntriesRead; i++, UserInfo++) {
printf(" username=" FORMAT_LPTSTR "\nlogon domain=" FORMAT_LPTSTR "\nother domains=" FORMAT_LPTSTR "\nlogon server=" FORMAT_LPTSTR "\n", UserInfo->wkui1_username, UserInfo->wkui1_logon_domain, UserInfo->wkui1_oth_domains, UserInfo->wkui1_logon_server ); }
NetApiBufferFree(TmpPtr); } else { printf("NetWkstaUserEnum level 1: FAILED %lu", status); }
}
VOID WsTestWkstaTransportEnum( VOID ) { NET_API_STATUS status; LPBYTE Buffer; DWORD EntriesRead, TotalEntries, ResumeHandle = 0;
status = NetWkstaTransportEnum( NULL, 0, &Buffer, MAXULONG, &EntriesRead, &TotalEntries, &ResumeHandle );
printf("NetWkstaTransportEnum Test:status=%lu\n", status);
if (status == NERR_Success) {
printf(" EntriesRead=%lu, TotalEntries=%lu\n", EntriesRead, TotalEntries);
NetApiBufferFree(Buffer); } }
VOID WsTestUse( VOID ) { PUSE_INFO_2 UseInfo = (PUSE_INFO_2) WorkBuffer; DWORD ResumeHandle = 0;
DWORD i;
LPTSTR PasswordSavePtr; LPTSTR UserNameSavePtr; LPTSTR DomainNameSavePtr;
//
// Initialize string pointers. Local device points to the bottom
// of Info 2 structure; Shared resource points to the middle of
// buffer (away from everything so there's no chance of overwriting
// or being overwritten.
//
UseInfo->ui2_local = (LPTSTR) &WorkBuffer[sizeof(USE_INFO_2)];
UseInfo->ui2_remote = (LPTSTR) ((DWORD) UseInfo->ui2_local) + (DEVLEN + 1) * sizeof(TCHAR);
UseInfo->ui2_password = NULL; PasswordSavePtr = (LPTSTR) ((DWORD) UseInfo->ui2_remote) + (RMLEN + 1) * sizeof(TCHAR);
UseInfo->ui2_username = NULL; UserNameSavePtr = (LPTSTR) ((DWORD) PasswordSavePtr) + (PWLEN + 1) * sizeof(TCHAR);
UseInfo->ui2_domainname = NULL; DomainNameSavePtr = (LPTSTR) ((DWORD) UserNameSavePtr) + (DNLEN + 1) * sizeof(TCHAR);
UseInfo->ui2_asg_type = USE_DISKDEV;
//
// Test with explicit username and password
//
UseInfo->ui2_username = UserNameSavePtr; UseInfo->ui2_password = PasswordSavePtr; UseInfo->ui2_domainname = DomainNameSavePtr;
STRCPY(UseInfo->ui2_username, TEXT("NTBUILD")); STRCPY(UseInfo->ui2_password, TEXT("NTBUILD")); STRCPY(UseInfo->ui2_domainname, TEXT("NtWins")); STRCPY(UseInfo->ui2_local, TEXT("k:")); STRCPY(UseInfo->ui2_remote, TEXT("\\\\kernel\\razzle2")); TestUseAdd(WorkBuffer, NERR_Success); TestUseGetInfo(TEXT("K:"), NERR_Success);
UseInfo->ui2_password = NULL; UseInfo->ui2_domainname = NULL;
//
// Connect to \\kernel\razzle2 again with only the username
//
STRCPY(UseInfo->ui2_local, TEXT("j:")); TestUseAdd(WorkBuffer, NERR_Success);
//
// Add 5 \\ritaw2\public
//
UseInfo->ui2_username = NULL;
STRCPY(UseInfo->ui2_local, TEXT("")); STRCPY(UseInfo->ui2_remote, TEXT("\\\\ritaw2\\public")); for (i = 0; i < 5; i++) { TestUseAdd(WorkBuffer, NERR_Success); }
TestUseDel( TEXT("j:"), USE_LOTS_OF_FORCE, NERR_Success );
TestUseDel( TEXT("k:"), USE_LOTS_OF_FORCE, NERR_Success );
//
// Add p: \\ritaw2\public
//
STRCPY(UseInfo->ui2_local, TEXT("p:")); TestUseAdd(WorkBuffer, NERR_Success);
//
// Add U: \\ritaw2\public
//
STRCPY(UseInfo->ui2_local, TEXT("U:")); TestUseAdd(WorkBuffer, NERR_Success);
//
// Add s: \\ritaw2\testdir
//
STRCPY(UseInfo->ui2_local, TEXT("s:")); STRCPY(UseInfo->ui2_remote, TEXT("\\\\ritaw2\\testdir")); TestUseAdd(WorkBuffer, NERR_Success); TestUseAdd(WorkBuffer, ERROR_ALREADY_ASSIGNED); TestUseGetInfo(TEXT("\\\\ritaw2\\testdir"), NERR_UseNotFound);
//
// Add 3 \\ritaw2\testdir
//
STRCPY(UseInfo->ui2_local, TEXT("")); for (i = 0; i < 3; i++) { TestUseAdd(WorkBuffer, NERR_Success); }
//
// Create implicit connections
//
system("ls \\\\ritaw2\\pub2"); system("ls \\\\ritaw2\\tmp");
//
// Delete implicit connection \\ritaw2\tmp USE_NOFORCE.
//
TestUseDel( TEXT("\\\\ritaw2\\tmp"), USE_NOFORCE, NERR_Success );
//
// Enumerate all connections
//
TestUseEnum(MAXULONG, NULL);
TestUseEnum(150, &ResumeHandle);
TestUseEnum(100, &ResumeHandle);
for (i = 0; i < 3; i++) { TestUseEnum(50, &ResumeHandle); }
TestUseEnum(150, NULL);
//
// Get info
//
TestUseGetInfo(TEXT("\\\\ritaw2\\public"), NERR_Success);
TestUseGetInfo(TEXT("p:"), NERR_Success);
TestUseGetInfo(TEXT("\\\\ritaw2\\Z"), NERR_UseNotFound);
TestUseGetInfo(TEXT("\\\\ritaw2\\Testdir"), NERR_Success);
TestUseGetInfo(TEXT("S:"), NERR_Success);
//
// Delete \\ritaw2\public USE_NOFORCE. Decrements usecount from 5 to 4.
//
TestUseDel( TEXT("\\\\ritaw2\\public"), USE_NOFORCE, NERR_Success );
//
// Delete \\ritaw2\public USE_FORCE. This should delete all 4 usecounts.
//
TestUseDel( TEXT("\\\\ritaw2\\public"), USE_FORCE, NERR_Success );
TestUseDel( TEXT("\\\\ritaw2\\public"), USE_FORCE, NERR_UseNotFound );
//
// Delete s: USE_FORCE
//
TestUseDel( TEXT("s:"), USE_LOTS_OF_FORCE, NERR_Success );
//
// Add s: \\ritaw2\z
//
STRCPY(UseInfo->ui2_local, TEXT("s:")); STRCPY(UseInfo->ui2_remote, TEXT("\\\\ritaw2\\z")); TestUseAdd(WorkBuffer, NERR_Success);
//
// Delete p: USE_NOFORCE. Second time should get NERR_UseNotFound.
//
TestUseDel( TEXT("p:"), USE_LOTS_OF_FORCE, NERR_Success );
TestUseDel( TEXT("p:"), USE_LOTS_OF_FORCE, NERR_UseNotFound );
//
// Delete \\ritaw2\testdir USE_NOFORCE. 4th time should be
// NERR_UseNotFound.
//
for (i = 0; i < 3; i++) { TestUseDel( TEXT("\\\\ritaw2\\testdir"), USE_NOFORCE, NERR_Success ); }
TestUseDel( TEXT("\\\\ritaw2\\testdir"), USE_NOFORCE, NERR_UseNotFound );
//
// Add prn: \\ritaw2\prn
//
UseInfo->ui2_asg_type = USE_SPOOLDEV;
STRCPY(UseInfo->ui2_local, TEXT("prn")); STRCPY(UseInfo->ui2_remote, TEXT("\\\\prt21088\\laserii")); TestUseAdd(WorkBuffer, NERR_Success);
//
// Add lpt1: \\ritaw2\laser, should get ERROR_ALREADY_ASSIGNED because prn:
// is converted to lpt1.
//
STRCPY(UseInfo->ui2_local, TEXT("lpt1:")); STRCPY(UseInfo->ui2_remote, TEXT("\\\\prt21088\\laserii")); TestUseAdd(WorkBuffer, ERROR_ALREADY_ASSIGNED);
//
// Delete LPT1 USE_LOTS_OF_FORCE, should succeed
//
TestUseDel( TEXT("prn:"), USE_LOTS_OF_FORCE, NERR_Success );
//
// Bad device type
//
STRCPY(UseInfo->ui2_local, TEXT("")); STRCPY(UseInfo->ui2_remote, TEXT("\\\\ritaw2\\public")); UseInfo->ui2_asg_type = 12345678; TestUseAdd(WorkBuffer, NERR_BadAsgType);
TestUseDel( TEXT("S:"), USE_LOTS_OF_FORCE, NERR_Success );
TestUseDel( TEXT("U:"), USE_LOTS_OF_FORCE, NERR_Success ); }
VOID TestUseAdd( IN LPBYTE Buffer, IN DWORD ExpectedStatus ) { NET_API_STATUS status; DWORD ErrorParameter;
status = NetUseAdd( NULL, 2, Buffer, &ErrorParameter );
printf("NetUseAdd %-5" FORMAT_STR "%-25" FORMAT_STR, ((PUSE_INFO_2) Buffer)->ui2_local, ((PUSE_INFO_2) Buffer)->ui2_remote);
if (status != ExpectedStatus) { printf("FAILED: Got %lu, expected %lu\n", status, ExpectedStatus); } else { printf("OK: Got expected status %lu\n", status); }
if (status == ERROR_INVALID_PARAMETER) { printf("NetUseAdd parameter %lu is cause of ERROR_INVALID_PARAMETER\n", ErrorParameter); } }
VOID TestUseDel( IN LPTSTR UseName, IN DWORD ForceLevel, IN DWORD ExpectedStatus ) { NET_API_STATUS status;
PWCHAR Force[3] = { L"NOFORCE", L"FORCE", L"LOTS_OF_FORCE" };
printf("NetUseDel %-17" FORMAT_STR "%-13" FORMAT_STR, UseName, Force[ForceLevel]);
status = NetUseDel( NULL, UseName, ForceLevel );
if (status != ExpectedStatus) { printf("FAILED: Got %lu, expected %lu\n", status, ExpectedStatus); } else { printf("OK: Got expected status %lu\n", status); } }
VOID TestUseGetInfo( LPTSTR UseName, DWORD ExpectedStatus ) {
NET_API_STATUS status; PUSE_INFO_2 UseInfo;
printf("NetUseGetInfo %-27" FORMAT_STR, UseName);
status = NetUseGetInfo( NULL, UseName, 2, (LPBYTE *) &UseInfo );
if (status != ExpectedStatus) { printf("FAILED: Got %lu, expected %lu\n", status, ExpectedStatus); } else { printf("OK: Got expected status %lu\n", status); }
if (status == NERR_Success) { PrintUseInfo2(UseInfo); NetApiBufferFree(UseInfo); } }
VOID TestUseEnum( IN DWORD PreferedMaximumLength, IN OUT LPDWORD ResumeHandle OPTIONAL ) { DWORD i; NET_API_STATUS status; DWORD EntriesRead, TotalEntries;
PUSE_INFO_1 UseInfo, saveptr;
if (ARGUMENT_PRESENT(ResumeHandle)) { printf("\nInput ResumeHandle=x%08lx\n", *ResumeHandle); } status = NetUseEnum( NULL, 1, (LPBYTE *) &UseInfo, PreferedMaximumLength, &EntriesRead, &TotalEntries, ResumeHandle );
saveptr = UseInfo;
if (status != NERR_Success && status != ERROR_MORE_DATA) { printf("NetUseEnum FAILED %lu\n", status); } else { printf("Return code from NetUseEnum %lu\n", status);
printf("EntriesRead=%lu, TotalEntries=%lu\n", EntriesRead, TotalEntries);
if (ARGUMENT_PRESENT(ResumeHandle)) { printf("Output ResumeHandle=x%08lx\n", *ResumeHandle); }
for (i = 0; i < EntriesRead; i++, UseInfo++) { PrintUseInfo1(UseInfo); }
//
// Free buffer allocated for us.
//
NetApiBufferFree(saveptr); }
}
VOID PrintUseInfo1( PUSE_INFO_1 UseInfo ) {
switch(UseInfo->ui1_status) {
case USE_OK: printf("OK "); break;
case USE_PAUSED: printf("Paused "); break;
case USE_SESSLOST: printf("Disconnected "); break;
case USE_NETERR: printf("Net error "); break;
case USE_CONN: printf("Connecting "); break;
case USE_RECONN: printf("Reconnecting "); break;
default: printf("Unknown "); }
printf(" %-7" FORMAT_STR "%-25" FORMAT_STR, UseInfo->ui1_local, UseInfo->ui1_remote); printf("usecount=%lu, refcount=%lu\n", UseInfo->ui1_usecount, UseInfo->ui1_refcount);
}
VOID PrintUseInfo2( PUSE_INFO_2 UseInfo ) {
switch(UseInfo->ui2_status) {
case USE_OK: printf("OK "); break;
case USE_PAUSED: printf("Paused "); break;
case USE_SESSLOST: printf("Disconnected "); break;
case USE_NETERR: printf("Net error "); break;
case USE_CONN: printf("Connecting "); break;
case USE_RECONN: printf("Reconnecting "); break;
default: printf("Unknown "); }
printf(" %-7" FORMAT_STR "%-" FORMAT_STR, UseInfo->ui2_local, UseInfo->ui2_remote);
printf("\n %-25" FORMAT_STR "%-" FORMAT_STR, UseInfo->ui2_username, UseInfo->ui2_domainname);
printf("\n usecount=%02lu, refcount=%02lu\n", UseInfo->ui2_usecount, UseInfo->ui2_refcount);
}
|