972 lines
21 KiB
C
972 lines
21 KiB
C
|
/*++
|
|||
|
|
|||
|
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);
|
|||
|
|
|||
|
}
|