windows-nt/Source/XPSP1/NT/net/rras/inc/rtcfg.h
2020-09-26 16:20:57 +08:00

533 lines
15 KiB
C

//============================================================================
// Copyright (c) 1996, Microsoft Corporation
//
// File: rtcfg.h
//
// History:
// 05/04/96 Abolade-Gbadegesin Created.
//
// Contains private declarations for the router-configuration access APIs.
//
// The handles supplied by the MprConfig APIs are actually pointers
// to context-blocks defined below. MprConfigServerConnect supplies
// a handle which is a pointer to a SERVERCB. The other handles are pointers
// to contexts which are in lists hanging off the master SERVERCB.
// For instance, when MprConfigInterfaceGetHandle is called, an INTERFACECB
// is allocated and linked into the SERVERCB's list of interfaces,
// and the registry key for the interface is saved in the INTERFACECB.
// When MprConfigServerDisconnect is called, all the open registry keys
// are closed and all the contexts are freed.
//
// The following shows the structure of the relevant sections of the registry:
//
// HKLM\System\CurrentControlSet\Services
// RemoteAccess
// Parameters
// RouterType = REG_DWORD 0x0
// RouterManagers
// Stamp = REG_DWORD 0x0
// IP
// ProtocolId = REG_SZ 0x21
// DLLPath = REG_EXPAND_SZ ...
// Interfaces
// Stamp = REG_DWORD 0x0
// 0
// Stamp = REG_DWORD 0x0
// InterfaceName = REG_SZ EPRO1
// Type = REG_DWORD 0x3
// IP
// ProtocolId = REG_DWORD 0x21
//
// When modifying this file, respect its coding conventions and organization.
//============================================================================
#ifndef _RTCFG_H_
#define _RTCFG_H_
//----------------------------------------------------------------------------
// Structure: SERVERCB
//
// Context block created as a handle by 'MprConfigServerConnect'.
//----------------------------------------------------------------------------
typedef struct _SERVERCB {
//
// Signiture to validate this structure
//
DWORD dwSigniture;
//
// name of router machine
//
LPWSTR lpwsServerName;
//
// handle to remote HKEY_LOCAL_MACHINE
//
HKEY hkeyMachine;
//
// handle to remote RemoteAccess\Parameters registry key,
// and last-write-time
//
HKEY hkeyParameters;
FILETIME ftParametersStamp;
//
// handle to remote RemoteAccess\RouterManagers registry key,
// and last-write-time
//
HKEY hkeyTransports;
FILETIME ftTransportsStamp;
//
// handle to remote RemoteAccess\Interfaces registry key,
// and last-write-time
//
HKEY hkeyInterfaces;
FILETIME ftInterfacesStamp;
//
// 'RouterType' setting, and flag indicating it is loaded
//
DWORD fRouterType;
BOOL bParametersLoaded;
//
// head of sorted TRANSPORTCB list, and flag indicating list is loaded
//
LIST_ENTRY lhTransports;
BOOL bTransportsLoaded;
//
// head of sorted INTERFACECB list, and flag indicating list is loaded
//
LIST_ENTRY lhInterfaces;
BOOL bInterfacesLoaded;
//
// handle to data used to provide mapping of interface name to guid name
// and vice versa.
//
HANDLE hGuidMap;
//
// reference count to this server control block
//
DWORD dwRefCount;
} SERVERCB;
//----------------------------------------------------------------------------
// Structure: TRANSPORTCB
//
// Context block created as a handle by 'MprConfigTransportGetHandle'.
//----------------------------------------------------------------------------
typedef struct _TRANSPORTCB {
//
// transport ID of transport
//
DWORD dwTransportId;
//
// name of the registry key for the transport
//
LPWSTR lpwsTransportKey;
//
// handle to remote RemoteAccess\RouterManagers subkey for transport
//
HKEY hkey;
//
// Deletion flag, set when we detect the transport was removed.
//
BOOL bDeleted;
//
// node in the SERVERCB's list of transports
//
LIST_ENTRY leNode;
} TRANSPORTCB;
//----------------------------------------------------------------------------
// Structure: INTERFACECB
//
// Context block created as a handle by 'MprConfigInterfaceGetHandle'.
//----------------------------------------------------------------------------
typedef struct _INTERFACECB {
//
// name of this interface
//
LPWSTR lpwsInterfaceName;
//
// name of the registry key for the interface
//
LPWSTR lpwsInterfaceKey;
//
// Type of interface (see mprapi.h)
//
DWORD dwIfType;
//
// Is this interface marked as persistant?
//
BOOL fEnabled;
//
// Dialout hours restriction (optional)
//
LPWSTR lpwsDialoutHoursRestriction;
//
// handle to remote RemoteAccess\Interfaces subkey for interface
//
HKEY hkey;
//
// Last-write-time for the key, and deletion flag
//
FILETIME ftStamp;
BOOL bDeleted;
//
// node in the SERVERCB's list of interfaces
//
LIST_ENTRY leNode;
//
// head of this interface's sorted IFTRANSPORTCB list,
// and flag indicating list is loaded
//
LIST_ENTRY lhIfTransports;
BOOL bIfTransportsLoaded;
} INTERFACECB;
//----------------------------------------------------------------------------
// Structure: IFTRANSPORTCB
//
// Context block created as a handle by MprConfigInterfaceGetTransportHandle
//----------------------------------------------------------------------------
typedef struct _IFTRANSPORTCB {
//
// transport ID of transport
//
DWORD dwTransportId;
//
// name of the registry key for the interface-transport
//
LPWSTR lpwsIfTransportKey;
//
// handle to remote RemoteAccess\Interfaces\<interface> subkey for transport
//
HKEY hkey;
//
// Deletion flag, set when we detect the interface-transport was removed.
//
BOOL bDeleted;
//
// node in an INTERFACECB's list of transports
//
LIST_ENTRY leNode;
} IFTRANSPORTCB;
//----------------------------------------------------------------------------
// Macros: Malloc
// Free
// Free0
//
// Allocations are done from the process-heap using these macros.
//----------------------------------------------------------------------------
#define Malloc(s) HeapAlloc(GetProcessHeap(), 0, (s))
#define Free(p) HeapFree(GetProcessHeap(), 0, (p))
#define Free0(p) ((p) ? Free(p) : TRUE)
//----------------------------------------------------------------------------
// Function: AccessRouterSubkey
//
// Creates/opens a subkey of the Router service key on 'hkeyMachine'.
// When a key is created, 'lpwsSubkey' must be a child of the Router key.
//----------------------------------------------------------------------------
DWORD
AccessRouterSubkey(
IN HKEY hkeyMachine,
IN LPCWSTR lpwsSubkey,
IN BOOL bCreate,
OUT HKEY* phkeySubkey
);
//----------------------------------------------------------------------------
// Function: EnableBackupPrivilege
//
// Enables/disables backup privilege for the current process.
//----------------------------------------------------------------------------
DWORD
EnableBackupPrivilege(
IN BOOL bEnable,
IN LPWSTR pszPrivilege
);
//----------------------------------------------------------------------------
// Function: FreeInterface
//
// Frees the context for an interface.
// Assumes the interface is no longer in the list of interfaces.
//----------------------------------------------------------------------------
VOID
FreeInterface(
IN INTERFACECB* pinterface
);
//----------------------------------------------------------------------------
// Function: FreeIfTransport
//
// Frees the context for an interface-transport.
// Assumes the interface-transport is no longer in any list.
//----------------------------------------------------------------------------
VOID
FreeIfTransport(
IN IFTRANSPORTCB* piftransport
);
//----------------------------------------------------------------------------
// Function: FreeTransport
//
// Frees the context for a transport.
// Assumes the transport is no longer in the list of transports.
//----------------------------------------------------------------------------
VOID
FreeTransport(
IN TRANSPORTCB* ptransport
);
//----------------------------------------------------------------------------
// Function: GetLocalMachine
//
// Retrieves the name of the local machine (e.g. "\\MACHINE").
// Assumes the string supplied can hold MAX_COMPUTERNAME_LENGTH + 3 characters.
//----------------------------------------------------------------------------
VOID
GetLocalMachine(
IN LPWSTR lpszMachine
);
//----------------------------------------------------------------------------
// Function: GetSizeOfDialoutHoursRestriction
//
// Will return the size of the dialout hours restriction in bytes. This
// is a MULTI_SZ. The count will include the terminating NULL characters.
//----------------------------------------------------------------------------
DWORD
GetSizeOfDialoutHoursRestriction(
IN LPWSTR lpwsDialoutHoursRestriction
);
//----------------------------------------------------------------------------
// Function: IsNt40Machine
//
// Returns whether the given hkeyMachine belongs to an nt40 registry
//----------------------------------------------------------------------------
DWORD
IsNt40Machine (
IN HKEY hkeyMachine,
OUT PBOOL pbIsNt40
);
//----------------------------------------------------------------------------
// Function: LoadIfTransports
//
// Loads all the transports added to an interface.
//----------------------------------------------------------------------------
DWORD
LoadIfTransports(
IN INTERFACECB* pinterface
);
//----------------------------------------------------------------------------
// Function: LoadInterfaces
//
// Loads all the interfaces.
//----------------------------------------------------------------------------
DWORD
LoadInterfaces(
IN SERVERCB* pserver
);
//----------------------------------------------------------------------------
// Function: LoadParameters
//
// Loads all the parameters
//----------------------------------------------------------------------------
DWORD
LoadParameters(
IN SERVERCB* pserver
);
//----------------------------------------------------------------------------
// Function: LoadTransports
//
// Loads all the transports
//----------------------------------------------------------------------------
DWORD
LoadTransports(
IN SERVERCB* pserver
);
//----------------------------------------------------------------------------
// Function: QueryValue
//
// Queries the 'hkey' for the value 'lpwsValue', allocating memory
// for the resulting data
//----------------------------------------------------------------------------
DWORD
QueryValue(
IN HKEY hkey,
IN LPCWSTR lpwsValue,
IN OUT LPBYTE* lplpValue,
OUT LPDWORD lpdwSize
);
//----------------------------------------------------------------------------
// Function: RegDeleteTree
//
// Removes an entire subtree from the registry.
//----------------------------------------------------------------------------
DWORD
RegDeleteTree(
IN HKEY hkey,
IN LPWSTR lpwsSubkey
);
//----------------------------------------------------------------------------
// Function: RestoreAndTranslateInterfaceKey
//
// Restores the interfaces key from the given file and then maps lan interface
// names from friendly versions to their guid equivalents.
//
//----------------------------------------------------------------------------
DWORD
RestoreAndTranslateInterfaceKey(
IN SERVERCB * pserver,
IN CHAR* pszFileName,
IN DWORD dwFlags
);
//----------------------------------------------------------------------------
// Function: StrDupW
//
// Returns a heap-allocated copy of the specified string.
//----------------------------------------------------------------------------
LPWSTR
StrDupW(
IN LPCWSTR lpsz
);
//----------------------------------------------------------------------------
// Function: TimeStampChanged
//
// Checks the current last-write-time for the given key,
// and returns TRUE if it is different from the given file-time.
// The new last-write-time is saved in 'pfiletime'.
//----------------------------------------------------------------------------
BOOL
TimeStampChanged(
IN HKEY hkey,
IN OUT FILETIME* pfiletime
);
//----------------------------------------------------------------------------
// Function: TranslateAndSaveInterfaceKey
//
// Saves the interfaces key in the router's registry into the given file. All
// lan interfaces are stored with friendly interface names.
//
//----------------------------------------------------------------------------
DWORD
TranslateAndSaveInterfaceKey(
IN SERVERCB * pserver,
IN PWCHAR pwsFileName,
IN LPSECURITY_ATTRIBUTES lpSecurityAttributes
);
//----------------------------------------------------------------------------
// Function: UpdateTimeStamp
//
// Creates (or sets) a value named 'Stamp' under the given key,
// and saves the last-write-time for the key in 'pfiletime'.
//----------------------------------------------------------------------------
DWORD
UpdateTimeStamp(
IN HKEY hkey,
OUT FILETIME* pfiletime
);
//
// Private ex version of this function that allows you to specify
// whether you want all interfaces loaded, or just those that are
// up according to pnp. (see MPRFLAG_IF_* for values for dwFlags)
//
DWORD APIENTRY
MprConfigInterfaceEnumInternal(
IN HANDLE hMprConfig,
IN DWORD dwLevel,
IN OUT LPBYTE* lplpBuffer,
IN DWORD dwPrefMaxLen,
OUT LPDWORD lpdwEntriesRead,
OUT LPDWORD lpdwTotalEntries,
IN OUT LPDWORD lpdwResumeHandle, OPTIONAL
IN DWORD dwFlags
);
#endif // _RTCFG_H_