VBoxNetFltNobj.cpp revision 7e9ca60730092c625220814121c54a593ad20997
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync/* $Id$ */
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync/** @file
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync * VBoxNetFltNobj.cpp - Notify Object for Bridged Networking Driver.
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync * Used to filter Bridged Networking Driver bindings
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync */
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync/*
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync * Copyright (C) 2011 Oracle Corporation
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync *
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync * This file is part of VirtualBox Open Source Edition (OSE), as
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync * available from http://www.virtualbox.org. This file is free software;
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync * you can redistribute it and/or modify it under the terms of the GNU
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync * General Public License (GPL) as published by the Free Software
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync * Foundation, in version 2 as it comes in the "COPYING" file of the
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync * VirtualBox OSE distribution. VirtualBox OSE is distributed in the
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync * hope that it will be useful, but WITHOUT ANY WARRANTY of any kind.
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync */
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync#include "VBoxNetFltNobj.h"
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync#include <Ntddndis.h>
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync#include <assert.h>
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync#include <stdio.h>
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync#include <VBoxNetFltNobjT_i.c>
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync//# define VBOXNETFLTNOTIFY_DEBUG_BIND
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync#ifdef DEBUG
7e9ca60730092c625220814121c54a593ad20997vboxsync# define NonStandardAssert(a) assert(a)
7e9ca60730092c625220814121c54a593ad20997vboxsync# define NonStandardAssertBreakpoint() assert(0)
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync#else
7e9ca60730092c625220814121c54a593ad20997vboxsync# define NonStandardAssert(a) do{}while (0)
7e9ca60730092c625220814121c54a593ad20997vboxsync# define NonStandardAssertBreakpoint() do{}while (0)
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync#endif
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync
3331475701a5b12f98b3cfea07d5dca60072530fvboxsyncVBoxNetFltNobj::VBoxNetFltNobj() :
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync mpNetCfg(NULL),
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync mpNetCfgComponent(NULL),
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync mbInstalling(FALSE)
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync{
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync}
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync
3331475701a5b12f98b3cfea07d5dca60072530fvboxsyncVBoxNetFltNobj::~VBoxNetFltNobj()
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync{
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync cleanup();
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync}
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync
3331475701a5b12f98b3cfea07d5dca60072530fvboxsyncvoid VBoxNetFltNobj::cleanup()
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync{
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync if (mpNetCfg)
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync {
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync mpNetCfg->Release();
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync mpNetCfg = NULL;
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync }
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync if (mpNetCfgComponent)
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync {
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync mpNetCfgComponent->Release();
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync mpNetCfgComponent = NULL;
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync }
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync}
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync
3331475701a5b12f98b3cfea07d5dca60072530fvboxsyncvoid VBoxNetFltNobj::init(IN INetCfgComponent *pNetCfgComponent, IN INetCfg *pNetCfg, IN BOOL bInstalling)
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync{
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync cleanup();
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync
7e9ca60730092c625220814121c54a593ad20997vboxsync NonStandardAssert(pNetCfg);
7e9ca60730092c625220814121c54a593ad20997vboxsync NonStandardAssert(pNetCfgComponent);
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync if (pNetCfg)
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync {
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync pNetCfg->AddRef();
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync mpNetCfg = pNetCfg;
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync }
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync if (pNetCfgComponent)
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync {
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync pNetCfgComponent->AddRef();
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync mpNetCfgComponent = pNetCfgComponent;
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync }
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync mbInstalling = bInstalling;
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync}
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync/* INetCfgComponentControl methods */
3331475701a5b12f98b3cfea07d5dca60072530fvboxsyncSTDMETHODIMP VBoxNetFltNobj::Initialize(IN INetCfgComponent *pNetCfgComponent, IN INetCfg *pNetCfg, IN BOOL bInstalling)
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync{
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync init(pNetCfgComponent, pNetCfg, bInstalling);
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync return S_OK;
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync}
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync
3331475701a5b12f98b3cfea07d5dca60072530fvboxsyncSTDMETHODIMP VBoxNetFltNobj::ApplyRegistryChanges()
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync{
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync return S_OK;
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync}
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync
3331475701a5b12f98b3cfea07d5dca60072530fvboxsyncSTDMETHODIMP VBoxNetFltNobj::ApplyPnpChanges(IN INetCfgPnpReconfigCallback *pCallback)
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync{
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync return S_OK;
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync}
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync
3331475701a5b12f98b3cfea07d5dca60072530fvboxsyncSTDMETHODIMP VBoxNetFltNobj::CancelChanges()
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync{
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync return S_OK;
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync}
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync
3331475701a5b12f98b3cfea07d5dca60072530fvboxsyncstatic HRESULT vboxNetFltWinQueryInstanceKey(IN INetCfgComponent *pComponent, OUT PHKEY phKey)
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync{
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync LPWSTR pPnpId;
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync HRESULT hr = pComponent->GetPnpDevNodeId(&pPnpId);
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync if (hr == S_OK)
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync {
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync WCHAR KeyName[MAX_PATH];
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync wcscpy(KeyName, L"SYSTEM\\CurrentControlSet\\Enum\\");
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync wcscat(KeyName,pPnpId);
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync LONG winEr = RegOpenKeyExW(HKEY_LOCAL_MACHINE, KeyName,
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync 0, /*__reserved DWORD ulOptions*/
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync KEY_READ, /*__in REGSAM samDesired*/
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync phKey);
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync if (winEr != ERROR_SUCCESS)
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync {
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync hr = HRESULT_FROM_WIN32(winEr);
7e9ca60730092c625220814121c54a593ad20997vboxsync NonStandardAssertBreakpoint();
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync }
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync CoTaskMemFree(pPnpId);
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync }
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync else
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync {
7e9ca60730092c625220814121c54a593ad20997vboxsync NonStandardAssertBreakpoint();
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync }
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync return hr;
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync}
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync
3331475701a5b12f98b3cfea07d5dca60072530fvboxsyncstatic HRESULT vboxNetFltWinQueryDriverKey(IN HKEY InstanceKey, OUT PHKEY phKey)
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync{
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync DWORD Type = REG_SZ;
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync WCHAR Value[MAX_PATH];
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync DWORD cbValue = sizeof(Value);
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync HRESULT hr = S_OK;
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync LONG winEr = RegQueryValueExW(InstanceKey,
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync L"Driver", /*__in_opt LPCTSTR lpValueName*/
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync 0, /*__reserved LPDWORD lpReserved*/
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync &Type, /*__out_opt LPDWORD lpType*/
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync (LPBYTE)Value, /*__out_opt LPBYTE lpData*/
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync &cbValue/*__inout_opt LPDWORD lpcbData*/
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync );
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync if (winEr == ERROR_SUCCESS)
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync {
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync WCHAR KeyName[MAX_PATH];
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync wcscpy(KeyName, L"SYSTEM\\CurrentControlSet\\Control\\Class\\");
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync wcscat(KeyName,Value);
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync winEr = RegOpenKeyExW(HKEY_LOCAL_MACHINE, KeyName,
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync 0, /*__reserved DWORD ulOptions*/
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync KEY_READ, /*__in REGSAM samDesired*/
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync phKey);
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync if (winEr != ERROR_SUCCESS)
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync {
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync hr = HRESULT_FROM_WIN32(winEr);
7e9ca60730092c625220814121c54a593ad20997vboxsync NonStandardAssertBreakpoint();
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync }
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync }
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync else
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync {
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync hr = HRESULT_FROM_WIN32(winEr);
7e9ca60730092c625220814121c54a593ad20997vboxsync NonStandardAssertBreakpoint();
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync }
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync return hr;
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync}
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync
3331475701a5b12f98b3cfea07d5dca60072530fvboxsyncstatic HRESULT vboxNetFltWinQueryDriverKey(IN INetCfgComponent *pComponent, OUT PHKEY phKey)
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync{
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync HKEY InstanceKey;
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync HRESULT hr = vboxNetFltWinQueryInstanceKey(pComponent, &InstanceKey);
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync if (hr == S_OK)
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync {
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync hr = vboxNetFltWinQueryDriverKey(InstanceKey, phKey);
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync if (hr != S_OK)
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync {
7e9ca60730092c625220814121c54a593ad20997vboxsync NonStandardAssertBreakpoint();
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync }
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync RegCloseKey(InstanceKey);
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync }
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync else
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync {
7e9ca60730092c625220814121c54a593ad20997vboxsync NonStandardAssertBreakpoint();
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync }
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync return hr;
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync}
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync
3331475701a5b12f98b3cfea07d5dca60072530fvboxsyncstatic HRESULT vboxNetFltWinNotifyCheckNetAdp(IN INetCfgComponent *pComponent, OUT bool * pbShouldBind)
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync{
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync HRESULT hr;
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync LPWSTR pDevId;
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync hr = pComponent->GetId(&pDevId);
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync if (hr == S_OK)
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync {
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync if (!_wcsnicmp(pDevId, L"sun_VBoxNetAdp", sizeof(L"sun_VBoxNetAdp")/2))
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync {
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync *pbShouldBind = false;
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync }
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync else
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync {
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync hr = S_FALSE;
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync }
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync CoTaskMemFree(pDevId);
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync }
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync else
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync {
7e9ca60730092c625220814121c54a593ad20997vboxsync NonStandardAssertBreakpoint();
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync }
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync return hr;
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync}
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync
3331475701a5b12f98b3cfea07d5dca60072530fvboxsyncstatic HRESULT vboxNetFltWinNotifyCheckMsLoop(IN INetCfgComponent *pComponent, OUT bool * pbShouldBind)
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync{
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync HRESULT hr;
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync LPWSTR pDevId;
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync hr = pComponent->GetId(&pDevId);
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync if (hr == S_OK)
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync {
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync if (!_wcsnicmp(pDevId, L"*msloop", sizeof(L"*msloop")/2))
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync {
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync /* we need to detect the medium the adapter is presenting
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync * to do that we could examine in the registry the *msloop params */
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync HKEY DriverKey;
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync hr = vboxNetFltWinQueryDriverKey(pComponent, &DriverKey);
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync if (hr == S_OK)
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync {
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync DWORD Type = REG_SZ;
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync WCHAR Value[64]; /* 2 should be enough actually, paranoid check for extra spaces */
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync DWORD cbValue = sizeof(Value);
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync LONG winEr = RegQueryValueExW(DriverKey,
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync L"Medium", /*__in_opt LPCTSTR lpValueName*/
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync 0, /*__reserved LPDWORD lpReserved*/
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync &Type, /*__out_opt LPDWORD lpType*/
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync (LPBYTE)Value, /*__out_opt LPBYTE lpData*/
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync &cbValue/*__inout_opt LPDWORD lpcbData*/
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync );
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync if (winEr == ERROR_SUCCESS)
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync {
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync PWCHAR endPrt;
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync ULONG enmMedium = wcstoul(Value,
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync &endPrt,
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync 0 /* base*/);
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync winEr = errno;
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync if (winEr == ERROR_SUCCESS)
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync {
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync if (enmMedium == 0) /* 0 is Ethernet */
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync {
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync *pbShouldBind = true;
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync }
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync else
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync {
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync *pbShouldBind = false;
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync }
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync }
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync else
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync {
7e9ca60730092c625220814121c54a593ad20997vboxsync NonStandardAssertBreakpoint();
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync *pbShouldBind = true;
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync }
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync }
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync else
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync {
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync /* TODO: we should check the default medium in HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Class\{4D36E972-E325-11CE-BFC1-08002bE10318}\<driver_id>\Ndi\Params\Medium, REG_SZ "Default" value */
7e9ca60730092c625220814121c54a593ad20997vboxsync NonStandardAssertBreakpoint();
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync *pbShouldBind = true;
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync }
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync RegCloseKey(DriverKey);
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync }
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync else
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync {
7e9ca60730092c625220814121c54a593ad20997vboxsync NonStandardAssertBreakpoint();
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync }
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync }
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync else
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync {
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync hr = S_FALSE;
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync }
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync CoTaskMemFree(pDevId);
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync }
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync else
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync {
7e9ca60730092c625220814121c54a593ad20997vboxsync NonStandardAssertBreakpoint();
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync }
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync return hr;
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync}
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync
3331475701a5b12f98b3cfea07d5dca60072530fvboxsyncstatic HRESULT vboxNetFltWinNotifyCheckLowerRange(IN INetCfgComponent *pComponent, OUT bool * pbShouldBind)
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync{
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync HKEY DriverKey;
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync HKEY InterfacesKey;
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync HRESULT hr = vboxNetFltWinQueryDriverKey(pComponent, &DriverKey);
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync if (hr == S_OK)
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync {
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync LONG winEr = RegOpenKeyExW(DriverKey, L"Ndi\\Interfaces",
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync 0, /*__reserved DWORD ulOptions*/
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync KEY_READ, /*__in REGSAM samDesired*/
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync &InterfacesKey);
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync if (winEr == ERROR_SUCCESS)
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync {
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync DWORD Type = REG_SZ;
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync WCHAR Value[MAX_PATH];
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync DWORD cbValue = sizeof(Value);
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync winEr = RegQueryValueExW(InterfacesKey,
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync L"LowerRange", /*__in_opt LPCTSTR lpValueName*/
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync 0, /*__reserved LPDWORD lpReserved*/
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync &Type, /*__out_opt LPDWORD lpType*/
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync (LPBYTE)Value, /*__out_opt LPBYTE lpData*/
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync &cbValue/*__inout_opt LPDWORD lpcbData*/
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync );
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync if (winEr == ERROR_SUCCESS)
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync {
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync if (wcsstr(Value,L"ethernet") || wcsstr(Value, L"wan"))
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync {
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync *pbShouldBind = true;
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync }
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync else
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync {
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync *pbShouldBind = false;
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync }
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync }
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync else
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync {
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync /* do not set err status to it */
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync *pbShouldBind = false;
7e9ca60730092c625220814121c54a593ad20997vboxsync NonStandardAssertBreakpoint();
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync }
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync RegCloseKey(InterfacesKey);
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync }
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync else
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync {
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync hr = HRESULT_FROM_WIN32(winEr);
7e9ca60730092c625220814121c54a593ad20997vboxsync NonStandardAssertBreakpoint();
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync }
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync RegCloseKey(DriverKey);
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync }
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync else
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync {
7e9ca60730092c625220814121c54a593ad20997vboxsync NonStandardAssertBreakpoint();
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync }
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync return hr;
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync}
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync
3331475701a5b12f98b3cfea07d5dca60072530fvboxsyncstatic HRESULT vboxNetFltWinNotifyShouldBind(IN INetCfgComponent *pComponent, OUT bool *pbShouldBind)
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync{
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync DWORD fCharacteristics;
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync HRESULT hr;
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync do
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync {
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync /* filter out only physical adapters */
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync hr = pComponent->GetCharacteristics(&fCharacteristics);
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync if (hr != S_OK)
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync {
7e9ca60730092c625220814121c54a593ad20997vboxsync NonStandardAssertBreakpoint();
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync break;
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync }
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync if (fCharacteristics & NCF_HIDDEN)
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync {
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync /* we are not binding to hidden adapters */
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync *pbShouldBind = false;
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync break;
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync }
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync hr = vboxNetFltWinNotifyCheckMsLoop(pComponent, pbShouldBind);
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync if (hr == S_OK)
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync {
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync /* this is a loopback adapter,
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync * the pbShouldBind already contains the result */
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync break;
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync }
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync else if (hr != S_FALSE)
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync {
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync /* error occurred */
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync break;
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync }
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync hr = vboxNetFltWinNotifyCheckNetAdp(pComponent, pbShouldBind);
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync if (hr == S_OK)
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync {
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync /* this is a VBoxNetAdp adapter,
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync * the pbShouldBind already contains the result */
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync break;
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync }
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync else if (hr != S_FALSE)
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync {
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync /* error occurred */
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync break;
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync }
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync /* hr == S_FALSE means this is not a loopback adpater, set it to S_OK */
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync hr = S_OK;
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync// if (!(fCharacteristics & NCF_PHYSICAL))
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync// {
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync// /* we are binding to physical adapters only */
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync// *pbShouldBind = false;
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync// break;
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync// }
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync hr = vboxNetFltWinNotifyCheckLowerRange(pComponent, pbShouldBind);
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync if (hr == S_OK)
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync {
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync /* the vboxNetFltWinNotifyCheckLowerRange ccucceeded,
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync * the pbShouldBind already contains the result */
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync break;
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync }
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync /* we are here because of the fail, nothing else to do */
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync } while (0);
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync return hr;
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync}
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync
3331475701a5b12f98b3cfea07d5dca60072530fvboxsyncstatic HRESULT vboxNetFltWinNotifyShouldBind(IN INetCfgBindingInterface *pIf, OUT bool *pbShouldBind)
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync{
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync INetCfgComponent * pAdapterComponent;
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync HRESULT hr = pIf->GetLowerComponent(&pAdapterComponent);
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync if (hr == S_OK)
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync {
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync hr = vboxNetFltWinNotifyShouldBind(pAdapterComponent, pbShouldBind);
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync pAdapterComponent->Release();
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync }
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync else
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync {
7e9ca60730092c625220814121c54a593ad20997vboxsync NonStandardAssertBreakpoint();
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync }
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync return hr;
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync}
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync
3331475701a5b12f98b3cfea07d5dca60072530fvboxsyncstatic HRESULT vboxNetFltWinNotifyShouldBind(IN INetCfgBindingPath *pPath, OUT bool *pbDoBind)
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync{
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync IEnumNetCfgBindingInterface *pEnumBindingIf;
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync HRESULT hr = pPath->EnumBindingInterfaces(&pEnumBindingIf);
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync if (hr == S_OK)
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync {
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync hr = pEnumBindingIf->Reset();
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync if (hr == S_OK)
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync {
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync ULONG ulCount;
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync INetCfgBindingInterface *pBindingIf;
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync do
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync {
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync hr = pEnumBindingIf->Next(1, &pBindingIf, &ulCount);
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync if (hr == S_OK)
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync {
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync hr = vboxNetFltWinNotifyShouldBind(pBindingIf, pbDoBind);
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync pBindingIf->Release();
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync if (hr == S_OK)
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync {
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync if (!(*pbDoBind))
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync {
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync break;
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync }
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync }
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync else
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync {
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync /* break on failure */
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync break;
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync }
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync }
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync else if (hr == S_FALSE)
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync {
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync /* no more elements */
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync hr = S_OK;
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync break;
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync }
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync else
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync {
7e9ca60730092c625220814121c54a593ad20997vboxsync NonStandardAssertBreakpoint();
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync /* break on falure */
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync break;
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync }
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync } while (true);
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync }
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync else
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync {
7e9ca60730092c625220814121c54a593ad20997vboxsync NonStandardAssertBreakpoint();
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync }
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync pEnumBindingIf->Release();
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync }
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync else
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync {
7e9ca60730092c625220814121c54a593ad20997vboxsync NonStandardAssertBreakpoint();
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync }
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync return hr;
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync}
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync
3331475701a5b12f98b3cfea07d5dca60072530fvboxsyncstatic bool vboxNetFltWinNotifyShouldBind(IN INetCfgBindingPath *pPath)
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync{
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync#ifdef VBOXNETFLTNOTIFY_DEBUG_BIND
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync return VBOXNETFLTNOTIFY_DEBUG_BIND;
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync#else
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync bool bShouldBind;
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync HRESULT hr = vboxNetFltWinNotifyShouldBind(pPath, &bShouldBind) ;
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync if (hr != S_OK)
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync {
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync bShouldBind = VBOXNETFLTNOTIFY_ONFAIL_BINDDEFAULT;
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync }
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync return bShouldBind;
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync#endif
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync}
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync/* INetCfgComponentNotifyBinding methods */
3331475701a5b12f98b3cfea07d5dca60072530fvboxsyncSTDMETHODIMP VBoxNetFltNobj::NotifyBindingPath(IN DWORD dwChangeFlag, IN INetCfgBindingPath *pNetCfgBP)
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync{
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync if (!(dwChangeFlag & NCN_ENABLE) || (dwChangeFlag & NCN_REMOVE) || vboxNetFltWinNotifyShouldBind(pNetCfgBP))
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync return S_OK;
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync return NETCFG_S_DISABLE_QUERY;
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync}
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync
3331475701a5b12f98b3cfea07d5dca60072530fvboxsyncSTDMETHODIMP VBoxNetFltNobj::QueryBindingPath(IN DWORD dwChangeFlag, IN INetCfgBindingPath *pNetCfgBP)
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync{
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync if (vboxNetFltWinNotifyShouldBind(pNetCfgBP))
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync return S_OK;
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync return NETCFG_S_DISABLE_QUERY;
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync}
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync
3331475701a5b12f98b3cfea07d5dca60072530fvboxsyncCComModule _Module;
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync
3331475701a5b12f98b3cfea07d5dca60072530fvboxsyncBEGIN_OBJECT_MAP(ObjectMap)
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync OBJECT_ENTRY(CLSID_VBoxNetFltNobj, VBoxNetFltNobj)
3331475701a5b12f98b3cfea07d5dca60072530fvboxsyncEND_OBJECT_MAP()
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync
3331475701a5b12f98b3cfea07d5dca60072530fvboxsyncextern "C"
3331475701a5b12f98b3cfea07d5dca60072530fvboxsyncBOOL WINAPI DllMain(HINSTANCE hInstance, DWORD dwReason, LPVOID /*lpReserved*/)
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync{
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync if (dwReason == DLL_PROCESS_ATTACH)
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync {
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync _Module.Init(ObjectMap, hInstance);
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync DisableThreadLibraryCalls(hInstance);
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync }
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync else if (dwReason == DLL_PROCESS_DETACH)
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync {
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync _Module.Term();
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync }
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync return TRUE;
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync}
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync
3331475701a5b12f98b3cfea07d5dca60072530fvboxsyncSTDAPI DllCanUnloadNow()
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync{
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync return (_Module.GetLockCount() == 0) ? S_OK : S_FALSE;
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync}
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync
3331475701a5b12f98b3cfea07d5dca60072530fvboxsyncSTDAPI DllGetClassObject(REFCLSID rclsid, REFIID riid, LPVOID* ppv)
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync{
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync return _Module.GetClassObject(rclsid, riid, ppv);
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync}
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync
3331475701a5b12f98b3cfea07d5dca60072530fvboxsyncSTDAPI DllRegisterServer()
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync{
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync return _Module.RegisterServer(TRUE);
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync}
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync
3331475701a5b12f98b3cfea07d5dca60072530fvboxsyncSTDAPI DllUnregisterServer()
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync{
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync return _Module.UnregisterServer(TRUE);
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync}