533 lines
15 KiB
C
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_
|
|
|