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.
289 lines
7.6 KiB
289 lines
7.6 KiB
//////////////////////////////////////////////////////////////////////////////
|
|
//
|
|
// Copyright Microsoft Corporation
|
|
//
|
|
// Module Name:
|
|
//
|
|
// aaaamon.c
|
|
//
|
|
//////////////////////////////////////////////////////////////////////////////
|
|
#define AAAA_HELPER_VERSION 1
|
|
|
|
#include <windows.h>
|
|
#include "strdefs.h"
|
|
#include "rmstring.h"
|
|
#include <netsh.h>
|
|
#include "aaaamontr.h"
|
|
#include "context.h"
|
|
#include "aaaahndl.h"
|
|
#include "aaaaconfig.h"
|
|
#include "aaaaversion.h"
|
|
|
|
GUID g_AaaamontrGuid = AAAAMONTR_GUID;
|
|
GUID g_NetshGuid = NETSH_ROOT_GUID;
|
|
|
|
//
|
|
// Reminder
|
|
//
|
|
// #define CREATE_CMD_ENTRY(t,f) {CMD_##t, f, HLP_##t, HLP_##t##_EX, CMD_FLAG_PRIVATE}
|
|
// #define CREATE_CMD_ENTRY_EX(t,f,i) {CMD_##t, f, HLP_##t, HLP_##t##_EX, i}
|
|
// #define CMD_FLAG_PRIVATE 0x01 // not valid in sub-contexts
|
|
// #define CMD_FLAG_INTERACTIVE 0x02 // not valid from outside netsh
|
|
// #define CMD_FLAG_IMMEDIATE 0x04 // not valid from ancestor contexts
|
|
// #define CMD_FLAG_LOCAL 0x08 // not valid from a remote machine
|
|
// #define CMD_FLAG_ONLINE 0x10 // not valid in offline/non-commit mode
|
|
|
|
CMD_ENTRY g_AaaaSetCmdTable[] =
|
|
{
|
|
CREATE_CMD_ENTRY_EX(AAAACONFIG_SET, HandleAaaaConfigSet,(CMD_FLAG_PRIVATE | CMD_FLAG_ONLINE)),
|
|
};
|
|
|
|
CMD_ENTRY g_AaaaShowCmdTable[] =
|
|
{
|
|
CREATE_CMD_ENTRY_EX(AAAAVERSION_SHOW, HandleAaaaConfigShow,(CMD_FLAG_PRIVATE | CMD_FLAG_ONLINE)),
|
|
CREATE_CMD_ENTRY_EX(AAAACONFIG_SHOW, HandleAaaaConfigShow,(CMD_FLAG_PRIVATE | CMD_FLAG_ONLINE)),
|
|
CREATE_CMD_ENTRY_EX(AAAACONFIG_SERVER_SETTINGS, HandleAaaaConfigShow,(CMD_FLAG_PRIVATE | CMD_FLAG_ONLINE)),
|
|
CREATE_CMD_ENTRY_EX(AAAACONFIG_CLIENTS, HandleAaaaConfigShow,(CMD_FLAG_PRIVATE | CMD_FLAG_ONLINE)),
|
|
CREATE_CMD_ENTRY_EX(AAAACONFIG_CONNECTION_REQUEST_POLICIES, HandleAaaaConfigShow,(CMD_FLAG_PRIVATE | CMD_FLAG_ONLINE)),
|
|
CREATE_CMD_ENTRY_EX(AAAACONFIG_LOGGING, HandleAaaaConfigShow,(CMD_FLAG_PRIVATE | CMD_FLAG_ONLINE)),
|
|
CREATE_CMD_ENTRY_EX(AAAACONFIG_REMOTE_ACCESS_POLICIES, HandleAaaaConfigShow,(CMD_FLAG_PRIVATE | CMD_FLAG_ONLINE)),
|
|
};
|
|
|
|
|
|
CMD_GROUP_ENTRY g_AaaaCmdGroups[] =
|
|
{
|
|
CREATE_CMD_GROUP_ENTRY(GROUP_SET, g_AaaaSetCmdTable),
|
|
CREATE_CMD_GROUP_ENTRY(GROUP_SHOW, g_AaaaShowCmdTable),
|
|
|
|
};
|
|
|
|
ULONG g_ulNumGroups = sizeof(g_AaaaCmdGroups)/sizeof(CMD_GROUP_ENTRY);
|
|
|
|
HANDLE g_hModule;
|
|
BOOL g_bCommit;
|
|
DWORD g_dwNumTableEntries;
|
|
DWORD ParentVersion;
|
|
BOOL g_bAaaaDirty = FALSE;
|
|
NS_CONTEXT_CONNECT_FN AaaaConnect;
|
|
|
|
ULONG g_ulInitCount;
|
|
|
|
//////////////////////////////////////////////////////////////////////////////
|
|
// AaaaCommit
|
|
//////////////////////////////////////////////////////////////////////////////
|
|
DWORD
|
|
WINAPI
|
|
AaaaCommit(
|
|
IN DWORD dwAction
|
|
)
|
|
{
|
|
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;
|
|
}
|
|
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;
|
|
}
|
|
|
|
|
|
//////////////////////////////////////////////////////////////////////////////
|
|
// AaaaStartHelper
|
|
//////////////////////////////////////////////////////////////////////////////
|
|
DWORD
|
|
WINAPI
|
|
AaaaStartHelper(
|
|
IN CONST GUID *pguidParent,
|
|
IN DWORD dwVersion
|
|
)
|
|
{
|
|
DWORD dwErr;
|
|
NS_CONTEXT_ATTRIBUTES attMyAttributes;
|
|
|
|
ParentVersion = dwVersion;
|
|
|
|
ZeroMemory( &attMyAttributes, sizeof(attMyAttributes) );
|
|
|
|
attMyAttributes.pwszContext = L"aaaa";
|
|
attMyAttributes.guidHelper = g_AaaamontrGuid;
|
|
attMyAttributes.dwVersion = 1;
|
|
attMyAttributes.dwFlags = CMD_FLAG_LOCAL;
|
|
attMyAttributes.ulNumTopCmds = 0;
|
|
attMyAttributes.pTopCmds = NULL;
|
|
attMyAttributes.ulNumGroups = g_ulNumGroups;
|
|
attMyAttributes.pCmdGroups = (CMD_GROUP_ENTRY (*)[])&g_AaaaCmdGroups;
|
|
attMyAttributes.pfnCommitFn = AaaaCommit;
|
|
attMyAttributes.pfnDumpFn = AaaaDump;
|
|
attMyAttributes.pfnConnectFn= AaaaConnect;
|
|
|
|
dwErr = RegisterContext( &attMyAttributes );
|
|
|
|
return dwErr;
|
|
}
|
|
|
|
|
|
//////////////////////////////////////////////////////////////////////////////
|
|
// AaaaUnInit
|
|
//////////////////////////////////////////////////////////////////////////////
|
|
DWORD
|
|
WINAPI
|
|
AaaaUnInit(
|
|
IN DWORD dwReserved
|
|
)
|
|
{
|
|
if(InterlockedDecrement(&g_ulInitCount) != 0)
|
|
{
|
|
return NO_ERROR;
|
|
}
|
|
|
|
return NO_ERROR;
|
|
}
|
|
|
|
|
|
//////////////////////////////////////////////////////////////////////////////
|
|
// AaaaDllEntry
|
|
//////////////////////////////////////////////////////////////////////////////
|
|
BOOL
|
|
WINAPI
|
|
DllMain(
|
|
HINSTANCE hInstDll,
|
|
DWORD fdwReason,
|
|
LPVOID pReserved
|
|
)
|
|
{
|
|
switch (fdwReason)
|
|
{
|
|
case DLL_PROCESS_ATTACH:
|
|
{
|
|
g_hModule = hInstDll;
|
|
DisableThreadLibraryCalls(hInstDll);
|
|
break;
|
|
}
|
|
case DLL_PROCESS_DETACH:
|
|
{
|
|
g_hModule = NULL;
|
|
break;
|
|
}
|
|
|
|
default:
|
|
{
|
|
break;
|
|
}
|
|
}
|
|
|
|
return TRUE;
|
|
}
|
|
|
|
|
|
//////////////////////////////////////////////////////////////////////////////
|
|
// InitHelperDll
|
|
//////////////////////////////////////////////////////////////////////////////
|
|
DWORD WINAPI
|
|
InitHelperDll(
|
|
IN DWORD dwNetshVersion,
|
|
OUT PVOID pReserved
|
|
)
|
|
{
|
|
DWORD 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;
|
|
|
|
// Register this module as a helper to the netsh root
|
|
// context.
|
|
//
|
|
ZeroMemory( &attMyAttributes, sizeof(attMyAttributes) );
|
|
attMyAttributes.guidHelper = g_AaaamontrGuid;
|
|
attMyAttributes.dwVersion = AAAA_HELPER_VERSION;
|
|
attMyAttributes.pfnStart = AaaaStartHelper;
|
|
attMyAttributes.pfnStop = NULL;
|
|
RegisterHelper( &g_NetshGuid, &attMyAttributes );
|
|
|
|
// Register any sub contexts implemented in this dll
|
|
//
|
|
dwErr = AaaaContextInstallSubContexts();
|
|
if (dwErr != NO_ERROR)
|
|
{
|
|
AaaaUnInit(0);
|
|
return dwErr;
|
|
}
|
|
|
|
return NO_ERROR;
|
|
}
|
|
|
|
|
|
//////////////////////////////////////////////////////////////////////////////
|
|
// AaaaConnect
|
|
//////////////////////////////////////////////////////////////////////////////
|
|
DWORD WINAPI
|
|
AaaaConnect(
|
|
IN LPCWSTR pwszRouter
|
|
)
|
|
{
|
|
// If context info is dirty, reregister it
|
|
if (g_bAaaaDirty)
|
|
{
|
|
AaaaStartHelper(NULL, ParentVersion);
|
|
}
|
|
|
|
return NO_ERROR;
|
|
}
|