235 lines
5.8 KiB
C++
235 lines
5.8 KiB
C++
|
//+---------------------------------------------------------------------------
|
||
|
//
|
||
|
// 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;
|
||
|
}
|
||
|
|