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);
|
|||
|
|
|||
|
}
|