|
|
/*++
Copyright (c) 1998 Microsoft Corporation
Module Name:
rasmon.c
Abstract:
Main rasmon file.
Revision History:
pmay
--*/
#include "precomp.h"
GUID g_RasmontrGuid = RASMONTR_GUID; GUID g_NetshGuid = NETSH_ROOT_GUID;
#define RAS_HELPER_VERSION 1
CMD_ENTRY g_RasAddCmdTable[] = { CREATE_CMD_ENTRY(RASFLAG_AUTHTYPE_ADD, HandleRasflagAuthtypeAdd), CREATE_CMD_ENTRY(RASFLAG_LINK_ADD, HandleRasflagLinkAdd), CREATE_CMD_ENTRY(RASFLAG_MLINK_ADD, HandleRasflagMlinkAdd), CREATE_CMD_ENTRY(DOMAIN_REGISTER, HandleDomainRegister), };
CMD_ENTRY g_RasDelCmdTable[] = { CREATE_CMD_ENTRY(RASFLAG_AUTHTYPE_DEL, HandleRasflagAuthtypeDel), CREATE_CMD_ENTRY(RASFLAG_LINK_DEL, HandleRasflagLinkDel), CREATE_CMD_ENTRY(RASFLAG_MLINK_DEL, HandleRasflagMlinkDel), CREATE_CMD_ENTRY(DOMAIN_UNREGISTER, HandleDomainUnregister), };
CMD_ENTRY g_RasSetCmdTable[] = { CREATE_CMD_ENTRY(TRACE_SET, HandleTraceSet), CREATE_CMD_ENTRY(RASUSER_SET, HandleUserSet), CREATE_CMD_ENTRY(RASFLAG_AUTHMODE_SET, HandleRasflagAuthmodeSet), };
CMD_ENTRY g_RasShowCmdTable[] = { CREATE_CMD_ENTRY(TRACE_SHOW, HandleTraceShow), CREATE_CMD_ENTRY(RASUSER_SHOW, HandleUserShow), CREATE_CMD_ENTRY(RASFLAG_AUTHMODE_SHOW, HandleRasflagAuthmodeShow), CREATE_CMD_ENTRY(RASFLAG_AUTHTYPE_SHOW, HandleRasflagAuthtypeShow), CREATE_CMD_ENTRY(RASFLAG_LINK_SHOW, HandleRasflagLinkShow), CREATE_CMD_ENTRY(RASFLAG_MLINK_SHOW, HandleRasflagMlinkShow), CREATE_CMD_ENTRY(DOMAIN_SHOWREG, HandleDomainShowRegistration), CREATE_CMD_ENTRY(SHOW_SERVERS, HandleRasShowServers), CREATE_CMD_ENTRY(SHOW_CLIENT, HandleClientShow), };
CMD_GROUP_ENTRY g_RasCmdGroups[] = { CREATE_CMD_GROUP_ENTRY(GROUP_ADD, g_RasAddCmdTable), CREATE_CMD_GROUP_ENTRY(GROUP_DEL, g_RasDelCmdTable), CREATE_CMD_GROUP_ENTRY(GROUP_SET, g_RasSetCmdTable), CREATE_CMD_GROUP_ENTRY(GROUP_SHOW, g_RasShowCmdTable), };
ULONG g_ulNumGroups = sizeof(g_RasCmdGroups)/sizeof(CMD_GROUP_ENTRY);
HANDLE g_hModule; BOOL g_bCommit; DWORD g_dwNumTableEntries; RASMON_SERVERINFO g_ServerInfo, *g_pServerInfo = NULL;
ULONG g_ulInitCount;
NS_CONTEXT_CONNECT_FN RasConnect; DWORD ParentVersion; BOOL g_bRasDirty = FALSE;
DWORD Connect( IN LPCWSTR pwszServer );
DWORD WINAPI RasCommit( IN DWORD dwAction ) { BOOL bCommit, bFlush = FALSE;
switch(dwAction) { case NETSH_COMMIT: { if(g_bCommit) { return NO_ERROR; }
g_bCommit = TRUE;
break; }
case NETSH_UNCOMMIT: { g_bCommit = FALSE;
return NO_ERROR; }
case NETSH_SAVE: { if(g_bCommit) { return NO_ERROR; }
break; }
case NETSH_FLUSH: { //
// Action is a flush. If current state is commit, then
// nothing to be done.
//
if(g_bCommit) { return NO_ERROR; }
bFlush = TRUE;
break; }
default: { return NO_ERROR; } }
//
// Switched to commit mode. So set all valid info in the
// strutures. Free memory and invalidate the info.
//
return NO_ERROR; }
DWORD WINAPI RasStartHelper( IN CONST GUID *pguidParent, IN DWORD dwVersion ) { DWORD dwErr; NS_CONTEXT_ATTRIBUTES attMyAttributes;
ParentVersion = dwVersion;
ZeroMemory(&attMyAttributes, sizeof(attMyAttributes));
attMyAttributes.pwszContext = L"ras"; attMyAttributes.guidHelper = g_RasmontrGuid; attMyAttributes.dwVersion = 1; attMyAttributes.dwFlags = 0; attMyAttributes.ulNumTopCmds = 0; attMyAttributes.pTopCmds = NULL; attMyAttributes.ulNumGroups = g_ulNumGroups; attMyAttributes.pCmdGroups = (CMD_GROUP_ENTRY (*)[])&g_RasCmdGroups; attMyAttributes.pfnCommitFn = RasCommit; attMyAttributes.pfnDumpFn = RasDump; attMyAttributes.pfnConnectFn = RasConnect;
dwErr = RegisterContext( &attMyAttributes );
return dwErr; }
VOID Disconnect() { if (g_pServerInfo->hkMachine) { RegCloseKey( g_pServerInfo->hkMachine ); }
// Clear out any server handles
//
UserServerInfoUninit(g_pServerInfo);
// Free up the server name if needed
if (g_pServerInfo->pszServer) { RutlFree(g_pServerInfo->pszServer); g_pServerInfo->pszServer = NULL; } }
DWORD WINAPI RasUnInit( IN DWORD dwReserved ) { if(InterlockedDecrement(&g_ulInitCount) isnot 0) { return NO_ERROR; }
Disconnect();
return NO_ERROR; }
BOOL WINAPI RasDllEntry( HINSTANCE hInstDll, DWORD fdwReason, LPVOID pReserved ) { switch (fdwReason) { case DLL_PROCESS_ATTACH: { g_hModule = hInstDll;
DisableThreadLibraryCalls(hInstDll);
break; } case DLL_PROCESS_DETACH: { break; }
default: { break; } }
return TRUE; }
DWORD WINAPI InitHelperDll( IN DWORD dwNetshVersion, OUT PVOID pReserved ) { DWORD dwSize = 0, dwErr; NS_HELPER_ATTRIBUTES attMyAttributes;
//
// See if this is the first time we are being called
//
if(InterlockedIncrement(&g_ulInitCount) != 1) { return NO_ERROR; }
g_bCommit = TRUE;
// Initialize the global server info
g_pServerInfo = &g_ServerInfo; ZeroMemory(g_pServerInfo, sizeof(RASMON_SERVERINFO)); Connect(NULL);
// Register this module as a helper to the netsh root
// context.
//
ZeroMemory( &attMyAttributes, sizeof(attMyAttributes) ); attMyAttributes.dwVersion = RAS_HELPER_VERSION; attMyAttributes.guidHelper = g_RasmontrGuid; attMyAttributes.pfnStart = RasStartHelper; attMyAttributes.pfnStop = NULL;
RegisterHelper( &g_NetshGuid, &attMyAttributes );
// Register any sub contexts implemented in this dll
//
dwErr = RasContextInstallSubContexts(); if (dwErr isnot NO_ERROR) { RasUnInit(0); return dwErr; }
return NO_ERROR; }
DWORD Connect( IN LPCWSTR pwszServer ) { DWORD dwErr, dwSize;
do { // Try to connect to the new router
ZeroMemory(g_pServerInfo, sizeof(RASMON_SERVERINFO)); if (pwszServer) { // Calculate the size to initialize the server name
dwSize = (wcslen(pwszServer) + 1) * sizeof(WCHAR); if (*pwszServer != L'\\') { dwSize += 2 * sizeof(WCHAR); } // Allocate the server name
g_pServerInfo->pszServer = RutlAlloc(dwSize, FALSE); if(g_pServerInfo->pszServer is NULL) { dwErr = GetLastError(); break; } if (*pwszServer != L'\\') { wcscpy(g_pServerInfo->pszServer, L"\\\\"); wcscpy(g_pServerInfo->pszServer + 2, pwszServer); } else { wcscpy(g_pServerInfo->pszServer, pwszServer); } } // Initialize the build number for the server
dwErr = RutlGetOsVersion( g_pServerInfo ); if (dwErr) { break; }
// As soon as this doesn't cause a hang (bug in netcfg), readd it here.
//
// dwErr = UserServerInfoInit( g_pServerInfo );
} while (FALSE);
return dwErr; }
DWORD RasConnectToServer( IN LPCWSTR pwszServer ) { DWORD dwErr = NO_ERROR, dwSize;
do {
if ((g_pServerInfo->pszServer != pwszServer) && (!pwszServer || !g_pServerInfo->pszServer || wcscmp(pwszServer, g_pServerInfo->pszServer))) { // Disconnect from the old router
Disconnect(); dwErr = Connect(pwszServer); }
} while (FALSE);
return dwErr; }
DWORD WINAPI RasConnect( IN LPCWSTR pwszMachineName ) { // If context info is dirty, reregister it
if (g_bRasDirty) { RasStartHelper(NULL, ParentVersion); }
return RasConnectToServer(pwszMachineName); }
|