/*++ Copyright (c) 1991 Microsoft Corporation Module Name: mprdata.h Abstract: Contains data structures and function prototypes that are internal to MPR. Author: Dan Lafferty (danl) 07-Sept-1991 Environment: User Mode -Win32 Revision History: 05-May-1999 jschwart Make provider addition/removal dynamic 01-Mar-1994 Danl Created a separate location for the Credential Managers GetCaps() function. This way if a provider has both a credential manager dll and a network dll, we will be able to direct calls to the correct GetCaps() function. 07-Jan-1993 Danl Add NPLogonNotify and NPPasswordChangeNotify and AuthentDllName to PROVIDER structure. Also added CREDENTIAL_TYPE InitClass. 04-Aug-1992 chuckc added MprEnterLoadLibCritSect, MprLeaveLoadLibCritSect. 07-Sept-1991 danl created --*/ // // Includes // //======================= // Data Structures //======================= typedef struct _PROVIDER { NETRESOURCE Resource; DWORD Type; // WNNC_NET_MSNet, WNNC_NET_LanMan, WNNC_NET_NetWare HMODULE Handle; // Handle to the provider DLL. LPTSTR DllName; // set to NULL after loaded. HMODULE AuthentHandle; // Handle to authenticator DLL. LPTSTR AuthentDllName; // Authenticator Dll. DWORD InitClass; // Network or Authentication provider. DWORD ConnectCaps; // Cached result of GetCaps(WNNC_CONNECTION) DWORD ConnectFlagCaps;// Cached result of GetCaps(WNNC_CONNECTION_FLAGS) PF_NPAddConnection AddConnection; PF_NPAddConnection3 AddConnection3; PF_NPGetReconnectFlags GetReconnectFlags; PF_NPCancelConnection CancelConnection; PF_NPGetConnection GetConnection; PF_NPGetConnection3 GetConnection3; PF_NPGetUser GetUser; PF_NPOpenEnum OpenEnum; PF_NPEnumResource EnumResource; PF_NPCloseEnum CloseEnum; PF_NPGetCaps GetCaps; PF_NPGetDirectoryType GetDirectoryType; PF_NPDirectoryNotify DirectoryNotify; PF_NPPropertyDialog PropertyDialog; PF_NPGetPropertyText GetPropertyText; PF_NPSearchDialog SearchDialog; PF_NPFormatNetworkName FormatNetworkName; PF_NPLogonNotify LogonNotify; PF_NPPasswordChangeNotify PasswordChangeNotify; PF_NPGetCaps GetAuthentCaps; PF_NPFMXGetPermCaps FMXGetPermCaps; PF_NPFMXEditPerm FMXEditPerm; PF_NPFMXGetPermHelp FMXGetPermHelp; PF_NPGetUniversalName GetUniversalName; PF_NPGetResourceParent GetResourceParent; PF_NPGetResourceInformation GetResourceInformation; PF_NPGetConnectionPerformance GetConnectionPerformance; }PROVIDER, *LPPROVIDER; //======================= // MACROS //======================= #define IS_EMPTY_STRING(pch) ( !pch || !*(pch) ) #define LENGTH(array) (sizeof(array)/sizeof((array)[0])) #define INIT_IF_NECESSARY(level,status) ASSERT(MPRProviderLock.Have()); \ if(!(GlobalInitLevel & level)) { \ status = MprLevel2Init(level); \ if (status != WN_SUCCESS) { \ SetLastError(status); \ return(status); \ } \ } #define MPR_IS_INITIALIZED(level) (GlobalInitLevel & level ## _LEVEL) #define ASSERT_INITIALIZED(level) ASSERT(MPR_IS_INITIALIZED(level) && \ MPRProviderLock.Have()); #define MPR_EXCEPTION_FILTER (GetExceptionCode() == STATUS_POSSIBLE_DEADLOCK ? \ EXCEPTION_CONTINUE_SEARCH : EXCEPTION_EXECUTE_HANDLER) //======================= // INLINE FUNCTIONS //======================= inline void PROBE_FOR_WRITE( LPDWORD pdw ) // WARNING: This function can throw an exception. It must be called from // within a try-except block. { *(volatile DWORD *)pdw = *(volatile DWORD *)pdw; } inline BOOL IS_BAD_BYTE_BUFFER( LPVOID lpBuffer, LPDWORD lpBufferSize // in bytes ) // WARNING: This function can throw an exception. It must be called from // within a try-except block. { PROBE_FOR_WRITE(lpBufferSize); return IsBadWritePtr(lpBuffer, *lpBufferSize); } inline BOOL IS_BAD_WCHAR_BUFFER( LPVOID lpBuffer, LPDWORD lpBufferSize // in Unicode characters ) // WARNING: This function can throw an exception. It must be called from // within a try-except block. { PROBE_FOR_WRITE(lpBufferSize); return IsBadWritePtr(lpBuffer, *lpBufferSize * sizeof(WCHAR)); } //======================= // CONSTANTS //======================= #define DEFAULT_MAX_PROVIDERS 25 // Bit masks for remembering error codes #define BAD_NAME 0x00000001 #define NO_NET 0x00000002 #define NOT_CONNECTED 0x00000004 #define NOT_CONTAINER 0x00000008 #define NO_DEVICES 0x00000010 #define OTHER_ERRS 0xFFFFFFFF #define REDIR_DEVICE 0x00000001 #define REMOTE_NAME 0x00000002 #define LOCAL_NAME REDIR_DEVICE #define DA_READ 0x00000001 #define DA_WRITE 0x00000002 #define DA_DELETE 0x00000004 // // Timeout values for restoring connections and notifying // Credential Managers. // #define DEFAULT_WAIT_TIME 60000 // Default timeout if providers don't // specify. #define MAX_ALLOWED_WAIT_TIME 300000 // Max timeout a provider can specify #define RECONNECT_SLEEP_INCREMENT 3000 // number of seconds to sleep #define PROVIDER_WILL_NOT_START 0x00000000 // The provider will not be starting #define NO_TIME_ESTIMATE 0xffffffff // The provider cannot predict the // amount of time it will take to // start. #define NET_PROVIDER_KEY TEXT("system\\CurrentControlSet\\Control\\NetworkProvider") #define RESTORE_WAIT_VALUE TEXT("RestoreTimeout") #define RESTORE_CONNECTION_VALUE TEXT("RestoreConnection") #define DEFER_CONNECTION_VALUE TEXT("DeferConnection") // // GlobalInitLevels & InitClasses // // NOTE: The WN_???_CLASS values are bit masks. // // GlobalInitLevel #define FIRST_LEVEL 0x00000001 #define NETWORK_LEVEL 0x00000002 #define CREDENTIAL_LEVEL 0x00000004 #define NOTIFIEE_LEVEL 0x00000008 // // // InitClasses #define NETWORK_TYPE WN_NETWORK_CLASS #define CREDENTIAL_TYPE (WN_CREDENTIAL_CLASS | WN_PRIMARY_AUTHENT_CLASS) // The path in the registry for user's persistent connections is found in // the following key: // // "\HKEY_CURRENT_USER\Network" // // Subkeys of the network section listed by local drive names. These // keys contain the following values: // RemotePath, Type, ProviderName, UserName // // d: RemotePath = \\cyclops\scratch // Type = RESOURCE_TYPE_DISK // ProviderName = LanMan // UserName = Ernie #define CONNECTION_KEY_NAME TEXT("Network") #define REMOTE_PATH_NAME TEXT("RemotePath") #define USER_NAME TEXT("UserName") #define PROVIDER_NAME TEXT("ProviderName") #define PROVIDER_TYPE TEXT("ProviderType") #define PROVIDER_FLAGS TEXT("ProviderFlags") #define DEFER_FLAGS TEXT("DeferFlags") #define CONNECTION_TYPE TEXT("ConnectionType") #define PRINT_CONNECTION_KEY_NAME TEXT("Printers\\RestoredConnections") //======================= // Global data //======================= extern LPPROVIDER GlobalProviderInfo; // pArray of PROVIDER Structures extern DWORD GlobalNumProviders; extern DWORD MprDebugLevel; extern HANDLE MprLoadLibSemaphore; // used to protect DLL handles extern volatile DWORD GlobalInitLevel; extern CRITICAL_SECTION MprErrorRecCritSec; extern WCHAR g_wszEntireNetwork[40]; //========================== // Functions from support.c //========================== VOID MprDeleteIndexArray( VOID ); DWORD MprFindCallOrder( IN LPTSTR NameInfo, OUT LPDWORD *IndexArrayPtr, OUT LPDWORD IndexArrayCount, IN DWORD InitClass ); DWORD MprDeviceType( IN LPCTSTR DeviceName ); BOOL MprGetProviderIndex( IN LPCTSTR ProviderName, OUT LPDWORD IndexPtr ); LPPROVIDER MprFindProviderByName( IN LPCWSTR ProviderName ); LPPROVIDER MprFindProviderByType( IN DWORD ProviderType ); DWORD MprFindProviderForPath( IN LPWSTR lpPathName, OUT LPDWORD lpProviderIndex ); VOID MprInitIndexArray( LPDWORD IndexArray, DWORD NumEntries ); VOID MprEndCallOrder( VOID ); VOID MprFreeAllErrorRecords( VOID ); BOOL MprNetIsAvailable( VOID) ; //========================= // Functions from mprreg.c //========================= BOOL MprOpenKey( HKEY hKey, LPTSTR lpSubKey, PHKEY phKeyHandle, DWORD desiredAccess ); BOOL MprGetKeyValue( HKEY KeyHandle, LPTSTR ValueName, LPTSTR *ValueString ); BOOL MprGetKeyDwordValue( IN HKEY KeyHandle, IN LPCWSTR ValueName, OUT DWORD * Value ); LONG MprGetKeyNumberValue( IN HKEY KeyHandle, IN LPCWSTR ValueName, IN LONG Default ); DWORD MprEnumKey( IN HKEY KeyHandle, IN DWORD SubKeyIndex, OUT LPTSTR *SubKeyName, IN DWORD MaxSubKeyNameLen ); BOOL MprGetKeyInfo( IN HKEY KeyHandle, OUT LPDWORD TitleIndex OPTIONAL, OUT LPDWORD NumSubKeys, OUT LPDWORD MaxSubKeyLen, OUT LPDWORD NumValues OPTIONAL, OUT LPDWORD MaxValueLen ); DWORD MprGetPrintKeyInfo(HKEY KeyHandle, LPDWORD NumValueNames, LPDWORD MaxValueNameLength, LPDWORD MaxValueLen) ; BOOL MprFindDriveInRegistry ( IN LPCTSTR DriveName, OUT LPTSTR *RemoteName ); DWORD MprSaveDeferFlags( IN HKEY RegKey, IN DWORD DeferFlags ); DWORD MprSetRegValue( IN HKEY KeyHandle, IN LPTSTR ValueName, IN LPCTSTR ValueString, IN DWORD LongValue ); DWORD MprCreateRegKey( IN HKEY BaseKeyHandle, IN LPCTSTR KeyName, OUT PHKEY KeyHandlePtr ); BOOL MprReadConnectionInfo( IN HKEY KeyHandle, IN LPCTSTR DriveName, IN DWORD Index, OUT LPDWORD ProviderFlags, OUT LPDWORD DeferFlags, OUT LPTSTR *UserNamePtr, OUT LPNETRESOURCEW NetResource, OUT HKEY *SubKeyHandleOut, IN DWORD MaxSubKeyLen ); VOID MprForgetRedirConnection( IN LPCTSTR lpName ); DWORD MprForgetPrintConnection( IN LPTSTR lpName ); BOOL MprGetRemoteName( IN LPTSTR lpLocalName, IN OUT LPDWORD lpBufferSize, OUT LPTSTR lpRemoteName, OUT LPDWORD lpStatus ) ; //========================= // Functions from strbuf.c //========================= BOOL NetpCopyStringToBuffer ( IN LPWSTR String OPTIONAL, IN DWORD CharacterCount, IN LPWSTR FixedDataEnd, IN OUT LPWSTR *EndOfVariableData, OUT LPWSTR *VariableDataPointer ); //========================= // Other functions //========================= VOID MprCheckProviders( VOID ); DWORD MprLevel1Init( VOID ); DWORD MprLevel2Init( DWORD InitClass ); DWORD MprEnterLoadLibCritSect ( VOID ) ; DWORD MprLeaveLoadLibCritSect ( VOID ) ; VOID MprClearString ( LPWSTR lpString ) ; DWORD MprGetConnection ( IN LPCWSTR lpLocalName, OUT LPWSTR lpRemoteName, IN OUT LPDWORD lpBufferSize, OUT LPDWORD lpProviderIndex OPTIONAL ) ; DWORD OutputStringToAnsiInPlace( IN LPWSTR UnicodeIn );