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