Source code of Windows XP (NT5)
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.
 
 
 
 
 
 

234 lines
5.8 KiB

//+---------------------------------------------------------------------------
//
// Microsoft Windows
// Copyright (C) Microsoft Corporation, 1998 - 2001
//
// File : hnetmon.cpp
//
// Contents : helper initialization code
//
// Notes :
//
// Author : Raghu Gatta (rgatta) 11 May 2001
//
//----------------------------------------------------------------------------
#include "precomp.h"
#pragma hdrstop
//
// Global variables.
//
HANDLE g_hModule = 0;
BOOL
WINAPI
DllMain(
HINSTANCE hInstDll,
DWORD fdwReason,
LPVOID pReserved
)
{
HANDLE hDll;
switch (fdwReason)
{
case DLL_PROCESS_ATTACH:
{
g_hModule = hInstDll;
//DisableThreadLibraryCalls(hInstDll);
break;
}
case DLL_PROCESS_DETACH:
{
//
// Clean up any structures used for commit
//
break;
}
default:
{
break;
}
}
return TRUE;
}
DWORD
WINAPI
InitHelperDll(
IN DWORD dwNetshVersion,
OUT PVOID pReserved
)
{
DWORD dwRet;
NS_HELPER_ATTRIBUTES attMyAttributes;
//
// Register helpers
// We have a single helper only (BRIDGE)
//
ZeroMemory(&attMyAttributes, sizeof(attMyAttributes));
attMyAttributes.dwVersion = BRIDGEMON_HELPER_VERSION;
attMyAttributes.pfnStart = BridgeStartHelper;
attMyAttributes.pfnStop = BridgeStopHelper;
attMyAttributes.guidHelper = g_BridgeGuid;
//
// Specify g_RootGuid as the parent helper to indicate
// that any contexts registered by this helper will be top
// level contexts.
//
dwRet = RegisterHelper(
&g_RootGuid,
&attMyAttributes
);
return dwRet;
}
DWORD
WINAPI
BridgeStartHelper(
IN CONST GUID * pguidParent,
IN DWORD dwVersion
)
{
DWORD dwRet = ERROR_INVALID_PARAMETER;
NS_CONTEXT_ATTRIBUTES attMyContextAttributes;
ZeroMemory(&attMyContextAttributes, sizeof(attMyContextAttributes));
attMyContextAttributes.dwVersion = BRIDGEMON_HELPER_VERSION;
attMyContextAttributes.dwFlags = 0;
attMyContextAttributes.ulPriority = DEFAULT_CONTEXT_PRIORITY;
attMyContextAttributes.pwszContext = TOKEN_BRIDGE;
attMyContextAttributes.guidHelper = g_BridgeGuid;
attMyContextAttributes.ulNumTopCmds = g_ulBridgeNumTopCmds;
attMyContextAttributes.pTopCmds = (CMD_ENTRY (*)[])g_BridgeCmds;
attMyContextAttributes.ulNumGroups = g_ulBridgeNumGroups;
attMyContextAttributes.pCmdGroups = (CMD_GROUP_ENTRY (*)[])g_BridgeCmdGroups;
attMyContextAttributes.pfnCommitFn = BridgeCommit;
attMyContextAttributes.pfnConnectFn = BridgeConnect;
attMyContextAttributes.pfnDumpFn = BridgeDump;
dwRet = RegisterContext(&attMyContextAttributes);
return dwRet;
}
DWORD
WINAPI
BridgeStopHelper(
IN DWORD dwReserved
)
{
return NO_ERROR;
}
DWORD
WINAPI
BridgeCommit(
IN DWORD dwAction
)
{
//
// The handling of this action is admittedly simple in this example.
// We simply have two copies of the data that we persist and consider
// one the "online" set of data and one the "offline" set of data.
// However, since neither the offline nor online sets of data need to
// be "applied" to anything, it makes the distinction between them
// somewhat meaningless. The scheme used to support online/offline modes
// is generally left up to the developer.
//
switch (dwAction)
{
case NETSH_COMMIT:
//
// Change to commit mode, otherwise known as online.
//
break;
case NETSH_UNCOMMIT:
//
// Change to uncommit mode, otherwise known as offline.
//
break;
case NETSH_FLUSH:
//
// Flush all uncommitted changes.
//
break;
case NETSH_SAVE:
//
// Save all uncommitted changes.
//
break;
default:
//
// Not supported.
//
break;
}
return NO_ERROR;
}
DWORD
WINAPI
BridgeConnect(
IN LPCWSTR pwszMachine
)
{
//
// This function is called whenever the machine name changes.
// If the context this was called for (you can specify a connect
// function on a per context basis, see RegisterContext) is
// supposed to be remotable, then the helper should verify
// connectivity to the machine specified by pwszMachine and
// return an error if unable to reach the machine.
//
//
// This is also where the helper might want to call RegisterContext
// again on a context to remove or add commands at will. This allows
// the commands in your context to be dynamic, that is, commands
// may be added and removed at will. However, the versioning
// functions tend to make a dynamic context unnecessary, as most
// dynamic command changes are needed because of differing OS's the
// commands are used on. Note that NULL for pwszMachine indicates
// that the machine to be connected to is the local machine. When
// and if the connect function returns an error code, the command
// that was going to be executed (whether a context command or
// entering a context) will fail.
//
//
// Uncomment this line to see how often the Connect function is called
// and what gets passed to it.
//
//PrintMessageFromModule(g_hModule, GEN_CONNECT_SHOWSTRING, pwszMachine);
return NO_ERROR;
}