//============================================================================ // 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\ 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_