windows-nt/Source/XPSP1/NT/ds/netapi/svcdlls/wkssvc/client/wstinv.c

450 lines
8.7 KiB
C
Raw Normal View History

2020-09-26 03:20:57 -05:00
/*++
Copyright (c) 1991 Microsoft Corporation
Module Name:
wstinv.c
Abstract:
This module tests invalid parameters to NetUse APIs.
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 <tstring.h>
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
PrintUseInfo(
PUSE_INFO_1 UseInfo
);
VOID __cdecl
main(
int argc,
char *argv[]
)
{
WsTestUse();
}
VOID
WsTestUse(
VOID
)
{
CHAR Buffer[1024];
PUSE_INFO_2 UseInfo = (PUSE_INFO_2) Buffer;
DWORD ResumeHandle = 0;
DWORD i;
//
// 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) ((DWORD) UseInfo + sizeof(USE_INFO_2));
UseInfo->ui2_remote = (LPTSTR) &Buffer[601];
UseInfo->ui2_password = NULL;
UseInfo->ui2_username = NULL;
UseInfo->ui2_domainname = NULL;
UseInfo->ui2_asg_type = USE_DISKDEV;
//
// Add \\ritaw2\public
//
UseInfo->ui2_local = NULL;
STRCPY(UseInfo->ui2_remote, L"\\\\ritaw2\\public");
TestUseAdd(Buffer, NERR_Success);
UseInfo->ui2_local = (LPTSTR) ((DWORD) UseInfo + sizeof(USE_INFO_2));
//
// Add &: \\ritaw2\public
//
STRCPY(UseInfo->ui2_local, L"&:");
TestUseAdd(Buffer, ERROR_INVALID_PARAMETER);
//
// Add 5: \\ritaw2\public
//
STRCPY(UseInfo->ui2_local, L"5:");
TestUseAdd(Buffer, ERROR_INVALID_PARAMETER);
//
// Add x: \\ritaw2\public\tmp
//
STRCPY(UseInfo->ui2_local, L"x:");
STRCPY(UseInfo->ui2_remote, L"\\\\ritaw2\\public\\tmp");
TestUseAdd(Buffer, ERROR_INVALID_PARAMETER);
//
// Add x: \\\
//
STRCPY(UseInfo->ui2_local, L"x:");
STRCPY(UseInfo->ui2_remote, L"\\\\\\");
TestUseAdd(Buffer, ERROR_INVALID_PARAMETER);
//
// Add *: \\ritaw2\testdir
//
STRCPY(UseInfo->ui2_local, L"*:");
STRCPY(UseInfo->ui2_remote, L"\\\\ritaw2\\testdir");
TestUseAdd(Buffer, ERROR_INVALID_PARAMETER);
//
// Get info
//
TestUseGetInfo(L"$:", NERR_UseNotFound);
TestUseGetInfo(L"", NERR_UseNotFound);
TestUseGetInfo(NULL, ERROR_INVALID_ADDRESS);
TestUseGetInfo(L"\\\\ritaw2\\public\\tmp", NERR_UseNotFound);
TestUseGetInfo(L"\\\\\\", NERR_UseNotFound);
//
// Delete %: USE_NOFORCE.
//
TestUseDel(
L"%:",
USE_NOFORCE,
NERR_UseNotFound
);
//
// Delete \\ritaw2\public with invalid force level.
//
TestUseDel(
L"\\\\ritaw2\\public",
999,
ERROR_INVALID_PARAMETER
);
//
// Delete \\ritaw2\public USE_FORCE.
//
TestUseDel(
L"\\\\ritaw2\\public",
USE_FORCE,
NERR_Success
);
//
// Add prn: \\sparkle\laserjet
//
UseInfo->ui2_asg_type = USE_SPOOLDEV;
STRCPY(UseInfo->ui2_local, L"prn");
STRCPY(UseInfo->ui2_remote, L"\\\\sparkle\\laserjet");
TestUseAdd(Buffer, NERR_Success);
//
// Add aux: \\sparkle\laserjet
//
UseInfo->ui2_asg_type = USE_CHARDEV;
STRCPY(UseInfo->ui2_local, L"aux");
TestUseAdd(Buffer, ERROR_BAD_DEV_TYPE);
//
// Add lpt1: \\ritaw2\laser, should get ERROR_ALREADY_ASSIGNED because prn:
// is converted to lpt1.
//
UseInfo->ui2_asg_type = USE_SPOOLDEV;
STRCPY(UseInfo->ui2_local, L"lpt1:");
STRCPY(UseInfo->ui2_remote, L"\\\\ritaw2\\printer");
TestUseAdd(Buffer, ERROR_ALREADY_ASSIGNED);
//
// Delete LPT1 USE_LOTS_OF_FORCE, should succeed
//
TestUseDel(
L"prn:",
USE_LOTS_OF_FORCE,
NERR_Success
);
//
// Bad device type
//
STRCPY(UseInfo->ui2_local, L"");
STRCPY(UseInfo->ui2_remote, L"\\\\ritaw2\\public");
UseInfo->ui2_asg_type = 12345678;
TestUseAdd(Buffer, NERR_BadAsgType);
}
VOID
TestUseAdd(
IN LPBYTE Buffer,
IN DWORD ExpectedStatus
)
{
NET_API_STATUS status;
DWORD ErrorParameter;
status = NetUseAdd(
NULL,
2,
Buffer,
&ErrorParameter
);
printf("NetUseAdd %-5ws %-25ws ", ((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;
DWORD Level;
PWCHAR Force[4] = {
L"NOFORCE",
L"FORCE",
L"LOTS_OF_FORCE",
L"INVALID FORCE"
};
if (ForceLevel > 2) {
Level = 3;
}
else {
Level = ForceLevel;
}
printf("NetUseDel %-17ws %-13ws ", UseName, Force[Level]);
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_1 UseInfo;
printf("NetUseGetInfo %-27ws ", 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) {
PrintUseInfo(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++) {
PrintUseInfo(UseInfo);
}
//
// Free buffer allocated for us.
//
NetApiBufferFree(saveptr);
}
}
VOID
PrintUseInfo(
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(" %-7ws %-25ws", UseInfo->ui1_local,
UseInfo->ui1_remote);
printf("usecount=%lu, refcount=%lu\n",
UseInfo->ui1_usecount, UseInfo->ui1_refcount);
}