|
|
/*++
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 );
|