/*++ 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 #include #include #include #include #include #include #include // Win32 type definitions #include // Win32 base API prototypes #include // LAN Man definitions #include // NetpDbgDisplayWksta() #include 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); }