162 lines
3.8 KiB
C++
162 lines
3.8 KiB
C++
//============================================================================
|
|
// Copyright(c) 1996, Microsoft Corporation
|
|
//
|
|
// File: ipcfg.cpp
|
|
//
|
|
// History:
|
|
// 08/30/96 Ram Cherala Created
|
|
//
|
|
// Implementation of IP Packet Filters Configuration
|
|
//============================================================================
|
|
|
|
#include "stdafx.h"
|
|
#include "rtrfiltr.h"
|
|
#include "ipfltr.h"
|
|
#include "format.h"
|
|
|
|
#ifdef _DEBUG
|
|
#define new DEBUG_NEW
|
|
#undef THIS_FILE
|
|
static char THIS_FILE[] = __FILE__;
|
|
#endif
|
|
|
|
//-----------------------------------------------------------------------------
|
|
// Function: IpFilterConfig
|
|
//
|
|
// Handles connecting to router, getting interface info, creating the IP filter
|
|
// configuration dialog and saving the Filters back to the registry.
|
|
// Uses CRouterInfo and other classes implemented in ..\common library.
|
|
//------------------------------------------------------------------------------
|
|
|
|
DWORD APIENTRY
|
|
IpFilterConfig(
|
|
IN CWnd* pParent,
|
|
IN LPCWSTR pwsMachineName,
|
|
IN LPCWSTR pwsInterfaceName,
|
|
IN DWORD dwFilterType // FILTER_INBOUND, FILTER_OUTBOUND
|
|
) {
|
|
|
|
DWORD dwErr;
|
|
HANDLE hMprConfig = NULL, hInterface = NULL, hIfTransport = NULL;
|
|
TCHAR* pszMachine;
|
|
SPIRouterInfo spRouterInfo;
|
|
SPIRtrMgrInterfaceInfo spRmIf;
|
|
SPIInfoBase spInfoBase;
|
|
HRESULT hr = hrOK;
|
|
|
|
//
|
|
// Convert the machine name from Unicode
|
|
//
|
|
|
|
if (!pwsMachineName) { pszMachine = NULL; }
|
|
else {
|
|
|
|
pszMachine = (TCHAR *) alloca((StrLenW(pwsMachineName)+3) * sizeof(TCHAR));
|
|
|
|
StrCpyTFromW(pszMachine, pwsMachineName);
|
|
}
|
|
|
|
// Connect to the server first
|
|
dwErr = ::MprConfigServerConnect((LPWSTR)pwsMachineName, &hMprConfig);
|
|
|
|
if (dwErr != NO_ERROR) { return dwErr; }
|
|
|
|
// create a CRouterInfo object
|
|
CreateRouterInfo(&spRouterInfo, NULL, pwsMachineName);
|
|
|
|
CWaitCursor wait;
|
|
|
|
// Now load the RouterInfo data from the registry
|
|
hr = spRouterInfo->Load((LPCTSTR)pszMachine, hMprConfig);
|
|
|
|
if (!FHrSucceeded(hr)) { return WIN32_FROM_HRESULT(hr); }
|
|
|
|
// Get the pointer to the CRmInterfaceInfo object for the specified
|
|
// protocol and interface
|
|
LookupRtrMgrInterface(spRouterInfo,
|
|
pwsInterfaceName,
|
|
PID_IP,
|
|
&spRmIf);
|
|
|
|
if (!spRmIf) { return ERROR_INVALID_DATA ;}
|
|
|
|
// Load the data for the specified interface
|
|
hr = spRmIf->Load(pszMachine, hMprConfig, NULL, NULL);
|
|
|
|
if (!FHrSucceeded(hr))
|
|
return WIN32_FROM_HRESULT(hr);
|
|
|
|
spRmIf->GetInfoBase(hMprConfig, NULL, NULL, &spInfoBase);
|
|
|
|
//
|
|
// Display the IP filter configuration dialog
|
|
//
|
|
if (IpFilterConfigInfoBase(pParent->GetSafeHwnd(),
|
|
spInfoBase,
|
|
spRmIf,
|
|
dwFilterType) == hrOK)
|
|
{
|
|
hr = spRmIf->Save(pszMachine,
|
|
hMprConfig,
|
|
NULL,
|
|
NULL,
|
|
spInfoBase,
|
|
0);
|
|
if (FHrSucceeded(hr))
|
|
dwErr = ERROR_SUCCESS;
|
|
else
|
|
dwErr = WIN32_FROM_HRESULT(hr);
|
|
}
|
|
|
|
//
|
|
//
|
|
//
|
|
// do clean up here and return
|
|
//
|
|
|
|
::MprConfigServerDisconnect( hMprConfig );
|
|
|
|
return dwErr;
|
|
}
|
|
|
|
|
|
HRESULT APIENTRY
|
|
IpFilterConfigInfoBase(
|
|
IN HWND hwndParent,
|
|
IN IInfoBase * pInfoBase,
|
|
IN IRtrMgrInterfaceInfo *pRmIf,
|
|
IN DWORD dwFilterType // FILTER_INBOUND, FILTER_OUTBOUND
|
|
) {
|
|
|
|
HRESULT hr = hrOK;
|
|
|
|
if (dwFilterType == FILTER_DEMAND_DIAL)
|
|
{
|
|
//
|
|
// Display the IP filter configuration dialog
|
|
//
|
|
|
|
CIpFltrDD dlg(CWnd::FromHandle(hwndParent), pInfoBase, dwFilterType );
|
|
|
|
if (dlg.DoModal() == IDOK)
|
|
hr = hrOK;
|
|
else
|
|
hr = hrFalse;
|
|
}
|
|
else
|
|
{
|
|
//
|
|
// Display the IP filter configuration dialog
|
|
//
|
|
|
|
CIpFltr dlg(CWnd::FromHandle(hwndParent), pInfoBase, dwFilterType );
|
|
|
|
if (dlg.DoModal() == IDOK)
|
|
hr = hrOK;
|
|
else
|
|
hr = hrFalse;
|
|
}
|
|
|
|
return hr;
|
|
}
|