Leaked source code of windows server 2003
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

490 lines
13 KiB

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