#include "precomp.h" #pragma hdrstop /*++ Copyright (c) 1991 Microsoft Corporation Module Name: netcon.c Abstract: This file has the Wnet network connection routines Author: Sunil Pai (sunilp) July 1991 --*/ typedef DWORD (APIENTRY *PFWNETPROC)(); #define DRIVE_LETTER_RANGE ('Z'+1-'A') LPSTR apUncPath [ DRIVE_LETTER_RANGE ] = { NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL }; VOID DeleteAllConnectionsWorker( VOID ) { CHAR chDrive[3] = "A:" ; INT i ; for ( i = 0 ; i < DRIVE_LETTER_RANGE ; i++ ) { if ( apUncPath[i] ) { // Delete the connection. This automatically cleans up // the UNC path table. chDrive[0] = 'A' + i ; DeleteNetConnectionWorker( chDrive, "TRUE" ) ; } } } // // Check to see if a connection is already known to the given UNC name. // Return the drive letter if so or zero if not. // CHAR CheckNetConnection( LPSTR szUNCName ) { INT i ; for ( i = 0 ; i < DRIVE_LETTER_RANGE ; i++ ) { if ( apUncPath[i] ) { if ( _strcmpi( szUNCName, apUncPath[i] ) == 0 ) return 'A'+i ; } } return 0 ; } BOOL GetMprProcAddr( LPSTR szProcName, PFWNETPROC * ppFunc ) { static HMODULE WNetModule = NULL ; // // Load the wnet dll if necessary (first cycle) // if ( WNetModule == NULL ) { if((WNetModule = LoadLibrary("mpr.dll")) == NULL) { SetErrorText(IDS_ERROR_NONETWORK); return(FALSE); } } // // Get the addresses of the WNetAddConnection entry point // *ppFunc = (PFWNETPROC)GetProcAddress( WNetModule, szProcName ); if( *ppFunc == NULL ) { SetErrorText(IDS_ERROR_NONETWORK); return(FALSE); } return TRUE ; } // arg0 = Remote name // arg1 = Password // arg2 = Local Name BOOL AddNetConnectionWorker( LPSTR szUNCName, LPSTR szPassword, LPSTR szLocalName ) { DWORD dwStatus; PFWNETPROC PFWNetAddConnection2; NETRESOURCE NetResource; LPSTR szUNCSave ; INT i ; if ( ! GetMprProcAddr( "WNetAddConnection2A", & PFWNetAddConnection2 ) ) { return FALSE ; } // // Build the netresource structure and call the function // NetResource.dwScope = 0; NetResource.dwType = RESOURCETYPE_DISK; NetResource.dwUsage = 0; NetResource.lpLocalName = szLocalName; NetResource.lpRemoteName = szUNCName; NetResource.lpComment = NULL; NetResource.lpProvider = NULL; dwStatus = PFWNetAddConnection2( &NetResource, szPassword, NULL, 0 ); switch (dwStatus) { case WN_SUCCESS: // Success: create an entry in the UNC mapping table i = toupper( szLocalName[0] ) - 'A' ; if ( i >= 0 && i < DRIVE_LETTER_RANGE && szLocalName[1] == ':' && (szUNCSave = SAlloc( strlen( szUNCName ) + 1 )) ) { strcpy( szUNCSave, szUNCName ) ; apUncPath[i] = szUNCSave ; } return ( TRUE ); case WN_BAD_NETNAME: SetErrorText(IDS_ERROR_BADNETNAME); break; case WN_BAD_LOCALNAME: SetErrorText(IDS_ERROR_BADLOCALNAME); break; case WN_BAD_PASSWORD: SetErrorText(IDS_ERROR_BADPASSWORD); break; case WN_ALREADY_CONNECTED: SetErrorText(IDS_ERROR_ALREADYCONNECTED); break; case WN_ACCESS_DENIED: SetErrorText(IDS_ERROR_ACCESSDENIED); break; case WN_NO_NETWORK: default: SetErrorText(IDS_ERROR_NONETWORK); break; } return ( FALSE ); } // // Arg[0]: Local Name // Arg[1]: Force closure -- "TRUE" | "FALSE" // BOOL DeleteNetConnectionWorker( LPSTR szLocalName, LPSTR szForceClosure ) { DWORD dwStatus; PFWNETPROC PFWNetCancelConnection; INT i ; if ( ! GetMprProcAddr( "WNetCancelConnectionA", & PFWNetCancelConnection ) ) { return FALSE ; } // Remove the UNC path data from the table regardless of // the result of the connection cancellation. i = toupper( szLocalName[0] ) - 'A' ; if ( i >= 0 && i < DRIVE_LETTER_RANGE && szLocalName[1] == ':' && apUncPath[i] != NULL ) { SFree( apUncPath[i] ) ; apUncPath[i] = NULL ; } dwStatus = PFWNetCancelConnection(szLocalName, !lstrcmpi(szForceClosure, "TRUE")); switch (dwStatus) { case WN_SUCCESS: return ( TRUE ); case WN_OPEN_FILES: SetErrorText(IDS_ERROR_NETOPENFILES); break; case WN_NOT_CONNECTED: default: SetErrorText(IDS_ERROR_NOTCONNECTED); break; } return ( FALSE ); }