diff --git a/reactos/dll/directx/msdvbnp/ethernetfilter.cpp b/reactos/dll/directx/msdvbnp/ethernetfilter.cpp
new file mode 100644
index 00000000000..16f6122cc20
--- /dev/null
+++ b/reactos/dll/directx/msdvbnp/ethernetfilter.cpp
@@ -0,0 +1,169 @@
+/*
+ * COPYRIGHT: See COPYING in the top level directory
+ * PROJECT: ReactOS BDA Proxy
+ * FILE: dll/directx/msdvbnp/ethernetfilter.cpp
+ * PURPOSE: IBDA_EthernetFilter interface
+ *
+ * PROGRAMMERS: Johannes Anderwald (janderwald@reactos.org)
+ */
+#include "precomp.h"
+
+class CEthernetFilter : public IBDA_EthernetFilter
+{
+public:
+ STDMETHODIMP QueryInterface( REFIID InterfaceId, PVOID* Interface);
+
+ STDMETHODIMP_(ULONG) AddRef();
+ STDMETHODIMP_(ULONG) Release();
+
+ //IBDA_EthernetFilter
+ HRESULT STDMETHODCALLTYPE GetMulticastListSize(ULONG *pulcbAddresses);
+ HRESULT STDMETHODCALLTYPE PutMulticastList(ULONG ulcbAddresses, BYTE * pAddressList);
+ HRESULT STDMETHODCALLTYPE GetMulticastList(ULONG *pulcbAddresses, BYTE *pAddressList);
+ HRESULT STDMETHODCALLTYPE PutMulticastMode(ULONG ulModeMask);
+ HRESULT STDMETHODCALLTYPE GetMulticastMode(ULONG *pulModeMask);
+
+
+ CEthernetFilter(IBDA_NetworkProvider * pNetworkProvider);
+ virtual ~CEthernetFilter();
+
+protected:
+ IBDA_NetworkProvider * m_pNetworkProvider;
+ ULONG m_ulcbAddresses;
+ BYTE * m_pAddressList;
+ ULONG m_ulModeMask;
+};
+
+CEthernetFilter::CEthernetFilter(
+ IBDA_NetworkProvider * pNetworkProvider) : m_pNetworkProvider(pNetworkProvider),
+ m_ulcbAddresses(0),
+ m_pAddressList(0),
+ m_ulModeMask(0)
+{
+}
+
+CEthernetFilter::~CEthernetFilter()
+{
+ if (m_pAddressList)
+ CoTaskMemFree(m_pAddressList);
+}
+
+HRESULT
+STDMETHODCALLTYPE
+CEthernetFilter::QueryInterface(
+ REFIID InterfaceId,
+ PVOID* Interface)
+{
+ assert(m_pNetworkProvider);
+ return m_pNetworkProvider->QueryInterface(InterfaceId, Interface);
+}
+
+ULONG
+STDMETHODCALLTYPE
+CEthernetFilter::AddRef()
+{
+ assert(m_pNetworkProvider);
+ return m_pNetworkProvider->AddRef();
+}
+
+ULONG
+STDMETHODCALLTYPE
+CEthernetFilter::Release()
+{
+ assert(m_pNetworkProvider);
+ return m_pNetworkProvider->Release();
+}
+
+//-------------------------------------------------------------------
+//IBDA_EthernetFilter
+//
+
+HRESULT
+STDMETHODCALLTYPE
+CEthernetFilter::PutMulticastList(
+ ULONG ulcbAddresses,
+ BYTE * pAddressList)
+{
+ if (!ulcbAddresses || !pAddressList)
+ return E_POINTER;
+
+ if (m_pAddressList)
+ CoTaskMemFree(m_pAddressList);
+
+ m_pAddressList = (BYTE*)CoTaskMemAlloc(ulcbAddresses);
+ if (!m_pAddressList)
+ return E_OUTOFMEMORY;
+
+ CopyMemory(m_pAddressList, pAddressList, ulcbAddresses);
+ m_ulcbAddresses = ulcbAddresses;
+ return NOERROR;
+}
+
+HRESULT
+STDMETHODCALLTYPE
+CEthernetFilter::GetMulticastList(
+ ULONG *pulcbAddresses,
+ BYTE *pAddressList)
+{
+ if (!pulcbAddresses || !pAddressList)
+ return E_POINTER;
+
+ if (*pulcbAddresses < m_ulcbAddresses)
+ return E_OUTOFMEMORY;
+
+ CopyMemory(pAddressList, m_pAddressList, m_ulcbAddresses);
+ *pulcbAddresses = m_ulcbAddresses;
+ return NOERROR;
+}
+
+HRESULT
+STDMETHODCALLTYPE
+CEthernetFilter::GetMulticastListSize(
+ ULONG *pulcbAddresses)
+{
+ if (!pulcbAddresses)
+ return E_POINTER;
+
+ *pulcbAddresses = m_ulcbAddresses;
+ return NOERROR;
+}
+
+HRESULT
+STDMETHODCALLTYPE
+CEthernetFilter::PutMulticastMode(
+ ULONG ulModeMask)
+{
+ m_ulModeMask = ulModeMask;
+ return NOERROR;
+}
+
+HRESULT
+STDMETHODCALLTYPE
+CEthernetFilter::GetMulticastMode(
+ ULONG *pulModeMask)
+{
+ *pulModeMask = m_ulModeMask;
+ return NOERROR;
+}
+
+HRESULT
+WINAPI
+CEthernetFilter_fnConstructor(
+ IBDA_NetworkProvider * pNetworkProvider,
+ REFIID riid,
+ LPVOID * ppv)
+{
+ CEthernetFilter * filter = new CEthernetFilter(pNetworkProvider);
+
+ if (!filter)
+ return E_OUTOFMEMORY;
+
+ if (FAILED(filter->QueryInterface(riid, ppv)))
+ {
+ /* not supported */
+ delete filter;
+ return E_NOINTERFACE;
+ }
+
+ return NOERROR;
+}
diff --git a/reactos/dll/directx/msdvbnp/ipv4.cpp b/reactos/dll/directx/msdvbnp/ipv4.cpp
new file mode 100644
index 00000000000..6647558dcf2
--- /dev/null
+++ b/reactos/dll/directx/msdvbnp/ipv4.cpp
@@ -0,0 +1,170 @@
+/*
+ * COPYRIGHT: See COPYING in the top level directory
+ * PROJECT: ReactOS BDA Proxy
+ * FILE: dll/directx/msdvbnp/ipv4.cpp
+ * PURPOSE: IBDA_IPV4Filter interface
+ *
+ * PROGRAMMERS: Johannes Anderwald (janderwald@reactos.org)
+ */
+#include "precomp.h"
+
+class CIPV4Filter : public IBDA_IPV4Filter
+{
+public:
+ STDMETHODIMP QueryInterface( REFIID InterfaceId, PVOID* Interface);
+ STDMETHODIMP_(ULONG) AddRef();
+ STDMETHODIMP_(ULONG) Release();
+
+ //IBDA_IPV4Filter
+ HRESULT STDMETHODCALLTYPE GetMulticastListSize(ULONG *pulcbAddresses);
+ HRESULT STDMETHODCALLTYPE PutMulticastList(ULONG ulcbAddresses, BYTE * pAddressList);
+ HRESULT STDMETHODCALLTYPE GetMulticastList(ULONG *pulcbAddresses, BYTE *pAddressList);
+ HRESULT STDMETHODCALLTYPE PutMulticastMode(ULONG ulModeMask);
+ HRESULT STDMETHODCALLTYPE GetMulticastMode(ULONG *pulModeMask);
+
+
+ CIPV4Filter(IBDA_NetworkProvider * pNetworkProvider);
+ virtual ~CIPV4Filter();
+
+protected:
+ IBDA_NetworkProvider * m_pNetworkProvider;
+ ULONG m_ulcbAddresses;
+ BYTE * m_pAddressList;
+ ULONG m_ulModeMask;
+};
+
+CIPV4Filter::CIPV4Filter(
+ IBDA_NetworkProvider * pNetworkProvider) : m_pNetworkProvider(pNetworkProvider),
+ m_ulcbAddresses(0),
+ m_pAddressList(0),
+ m_ulModeMask(0)
+{
+}
+
+CIPV4Filter::~CIPV4Filter()
+{
+ if (m_pAddressList)
+ CoTaskMemFree(m_pAddressList);
+}
+
+
+HRESULT
+STDMETHODCALLTYPE
+CIPV4Filter::QueryInterface(
+ REFIID InterfaceId,
+ PVOID* Interface)
+{
+ assert(m_pNetworkProvider);
+ return m_pNetworkProvider->QueryInterface(InterfaceId, Interface);
+}
+
+ULONG
+STDMETHODCALLTYPE
+CIPV4Filter::AddRef()
+{
+ assert(m_pNetworkProvider);
+ return m_pNetworkProvider->AddRef();
+}
+
+ULONG
+STDMETHODCALLTYPE
+CIPV4Filter::Release()
+{
+ assert(m_pNetworkProvider);
+ return m_pNetworkProvider->Release();
+}
+
+//-------------------------------------------------------------------
+//IBDA_IPV4Filter
+//
+
+
+HRESULT
+STDMETHODCALLTYPE
+CIPV4Filter::GetMulticastListSize(
+ ULONG *pulcbAddresses)
+{
+ if (!pulcbAddresses)
+ return E_POINTER;
+
+ *pulcbAddresses = 0;
+ return NOERROR;
+}
+
+HRESULT
+STDMETHODCALLTYPE
+CIPV4Filter::PutMulticastList(
+ ULONG ulcbAddresses,
+ BYTE * pAddressList)
+{
+ if (!ulcbAddresses || !pAddressList)
+ return E_POINTER;
+
+ if (m_pAddressList)
+ CoTaskMemFree(m_pAddressList);
+
+ m_pAddressList = (BYTE*)CoTaskMemAlloc(ulcbAddresses);
+ if (!m_pAddressList)
+ return E_OUTOFMEMORY;
+
+ CopyMemory(m_pAddressList, pAddressList, ulcbAddresses);
+ m_ulcbAddresses = ulcbAddresses;
+ return NOERROR;
+}
+
+HRESULT
+STDMETHODCALLTYPE
+CIPV4Filter::GetMulticastList(
+ ULONG *pulcbAddresses,
+ BYTE *pAddressList)
+{
+ if (!pulcbAddresses || !pAddressList)
+ return E_POINTER;
+
+ if (*pulcbAddresses < m_ulcbAddresses)
+ return E_OUTOFMEMORY;
+
+ CopyMemory(pAddressList, m_pAddressList, m_ulcbAddresses);
+ *pulcbAddresses = m_ulcbAddresses;
+ return NOERROR;
+}
+
+HRESULT
+STDMETHODCALLTYPE
+CIPV4Filter::PutMulticastMode(
+ ULONG ulModeMask)
+{
+ m_ulModeMask = ulModeMask;
+ return NOERROR;
+}
+
+HRESULT
+STDMETHODCALLTYPE
+CIPV4Filter::GetMulticastMode(
+ ULONG *pulModeMask)
+{
+ *pulModeMask = m_ulModeMask;
+ return NOERROR;
+}
+
+HRESULT
+WINAPI
+CIPV4Filter_fnConstructor(
+ IBDA_NetworkProvider * pNetworkProvider,
+ REFIID riid,
+ LPVOID * ppv)
+{
+ CIPV4Filter * filter = new CIPV4Filter(pNetworkProvider);
+
+ if (!filter)
+ return E_OUTOFMEMORY;
+
+ if (FAILED(filter->QueryInterface(riid, ppv)))
+ {
+ /* not supported */
+ delete filter;
+ return E_NOINTERFACE;
+ }
+
+ return NOERROR;
+}
diff --git a/reactos/dll/directx/msdvbnp/ipv6.cpp b/reactos/dll/directx/msdvbnp/ipv6.cpp
new file mode 100644
index 00000000000..6017443a450
--- /dev/null
+++ b/reactos/dll/directx/msdvbnp/ipv6.cpp
@@ -0,0 +1,167 @@
+/*
+ * COPYRIGHT: See COPYING in the top level directory
+ * PROJECT: ReactOS BDA Proxy
+ * FILE: dll/directx/msdvbnp/ipv6.cpp
+ * PURPOSE: IBDA_IPV6Filter interface
+ *
+ * PROGRAMMERS: Johannes Anderwald (janderwald@reactos.org)
+ */
+#include "precomp.h"
+
+class CIPV6Filter : public IBDA_IPV6Filter
+{
+public:
+ STDMETHODIMP QueryInterface( REFIID InterfaceId, PVOID* Interface);
+ STDMETHODIMP_(ULONG) AddRef();
+ STDMETHODIMP_(ULONG) Release();
+
+ //IBDA_IPV6Filter
+ HRESULT STDMETHODCALLTYPE GetMulticastListSize(ULONG *pulcbAddresses);
+ HRESULT STDMETHODCALLTYPE PutMulticastList(ULONG ulcbAddresses, BYTE * pAddressList);
+ HRESULT STDMETHODCALLTYPE GetMulticastList(ULONG *pulcbAddresses, BYTE *pAddressList);
+ HRESULT STDMETHODCALLTYPE PutMulticastMode(ULONG ulModeMask);
+ HRESULT STDMETHODCALLTYPE GetMulticastMode(ULONG *pulModeMask);
+
+ CIPV6Filter(IBDA_NetworkProvider * pNetworkProvider);
+ virtual ~CIPV6Filter();
+
+protected:
+ IBDA_NetworkProvider * m_pNetworkProvider;
+ ULONG m_ulcbAddresses;
+ BYTE * m_pAddressList;
+ ULONG m_ulModeMask;
+};
+
+CIPV6Filter::CIPV6Filter(
+ IBDA_NetworkProvider * pNetworkProvider) : m_pNetworkProvider(pNetworkProvider),
+ m_ulcbAddresses(0),
+ m_pAddressList(0),
+ m_ulModeMask(0)
+{
+}
+
+CIPV6Filter::~CIPV6Filter()
+{
+ if (m_pAddressList)
+ CoTaskMemFree(m_pAddressList);
+}
+
+HRESULT
+STDMETHODCALLTYPE
+CIPV6Filter::QueryInterface(
+ REFIID InterfaceId,
+ PVOID* Interface)
+{
+ assert(m_pNetworkProvider);
+ return m_pNetworkProvider->QueryInterface(InterfaceId, Interface);
+}
+
+ULONG
+STDMETHODCALLTYPE
+CIPV6Filter::AddRef()
+{
+ assert(m_pNetworkProvider);
+ return m_pNetworkProvider->AddRef();
+}
+
+ULONG
+STDMETHODCALLTYPE
+CIPV6Filter::Release()
+{
+ assert(m_pNetworkProvider);
+ return m_pNetworkProvider->Release();
+}
+
+//-------------------------------------------------------------------
+//IBDA_IPV6Filter
+//
+
+HRESULT
+STDMETHODCALLTYPE
+CIPV6Filter::GetMulticastListSize(
+ ULONG *pulcbAddresses)
+{
+ if (!pulcbAddresses)
+ return E_POINTER;
+
+ *pulcbAddresses = 0;
+ return NOERROR;
+}
+
+HRESULT
+STDMETHODCALLTYPE
+CIPV6Filter::GetMulticastList(
+ ULONG *pulcbAddresses,
+ BYTE *pAddressList)
+{
+ if (!pulcbAddresses || !pAddressList)
+ return E_POINTER;
+
+ if (*pulcbAddresses < m_ulcbAddresses)
+ return E_OUTOFMEMORY;
+
+ CopyMemory(pAddressList, m_pAddressList, m_ulcbAddresses);
+ *pulcbAddresses = m_ulcbAddresses;
+ return NOERROR;
+}
+
+HRESULT
+STDMETHODCALLTYPE
+CIPV6Filter::PutMulticastList(
+ ULONG ulcbAddresses,
+ BYTE * pAddressList)
+{
+ if (!ulcbAddresses || !pAddressList)
+ return E_POINTER;
+
+ if (m_pAddressList)
+ CoTaskMemFree(m_pAddressList);
+
+ m_pAddressList = (BYTE*)CoTaskMemAlloc(ulcbAddresses);
+ if (!m_pAddressList)
+ return E_OUTOFMEMORY;
+
+ CopyMemory(m_pAddressList, pAddressList, ulcbAddresses);
+ m_ulcbAddresses = ulcbAddresses;
+ return NOERROR;
+}
+
+HRESULT
+STDMETHODCALLTYPE
+CIPV6Filter::PutMulticastMode(
+ ULONG ulModeMask)
+{
+ m_ulModeMask = ulModeMask;
+ return NOERROR;
+}
+
+HRESULT
+STDMETHODCALLTYPE
+CIPV6Filter::GetMulticastMode(
+ ULONG *pulModeMask)
+{
+ *pulModeMask = m_ulModeMask;
+ return NOERROR;
+}
+
+HRESULT
+WINAPI
+CIPV6Filter_fnConstructor(
+ IBDA_NetworkProvider * pNetworkProvider,
+ REFIID riid,
+ LPVOID * ppv)
+{
+ CIPV6Filter * filter = new CIPV6Filter(pNetworkProvider);
+
+ if (!filter)
+ return E_OUTOFMEMORY;
+
+ if (FAILED(filter->QueryInterface(riid, ppv)))
+ {
+ /* not supported */
+ delete filter;
+ return E_NOINTERFACE;
+ }
+
+ return NOERROR;
+}
diff --git a/reactos/dll/directx/msdvbnp/msdvbnp.rbuild b/reactos/dll/directx/msdvbnp/msdvbnp.rbuild
index 6213d7d8f37..a1cf02ac4f7 100644
--- a/reactos/dll/directx/msdvbnp/msdvbnp.rbuild
+++ b/reactos/dll/directx/msdvbnp/msdvbnp.rbuild
@@ -22,8 +22,11 @@
classfactory.cpp
enum_mediatypes.cpp
enumpins.cpp
+ ethernetfilter.cpp
msdvbnp.cpp
msdvbnp.rc
+ ipv4.cpp
+ ipv6.cpp
networkprovider.cpp
pin.cpp
scanningtuner.cpp
diff --git a/reactos/dll/directx/msdvbnp/networkprovider.cpp b/reactos/dll/directx/msdvbnp/networkprovider.cpp
index be7fee28cc5..7dea3667142 100644
--- a/reactos/dll/directx/msdvbnp/networkprovider.cpp
+++ b/reactos/dll/directx/msdvbnp/networkprovider.cpp
@@ -74,6 +74,9 @@ protected:
GUID m_ClassID;
DeviceFilterStack m_DeviceFilters;
IScanningTuner * m_Tuner;
+ IBDA_IPV6Filter * m_IPV6Filter;
+ IBDA_IPV4Filter * m_IPV4Filter;
+ IBDA_EthernetFilter * m_EthernetFilter;
};
HRESULT
@@ -116,6 +119,51 @@ CNetworkProvider::QueryInterface(
return NOERROR;
}
+ if (IsEqualGUID(refiid, IID_IBDA_IPV6Filter))
+ {
+ // construct scanning tuner
+ if (!m_IPV6Filter)
+ {
+ HRESULT hr = CIPV6Filter_fnConstructor((IBDA_NetworkProvider*)this, refiid, (void**)&m_IPV6Filter);
+ if (FAILED(hr))
+ return hr;
+ }
+ m_IPV6Filter->AddRef();
+ *Output = (IUnknown*)m_IPV6Filter;
+
+ return NOERROR;
+ }
+
+ if (IsEqualGUID(refiid, IID_IBDA_IPV4Filter))
+ {
+ // construct scanning tuner
+ if (!m_IPV4Filter)
+ {
+ HRESULT hr = CIPV4Filter_fnConstructor((IBDA_NetworkProvider*)this, refiid, (void**)&m_IPV4Filter);
+ if (FAILED(hr))
+ return hr;
+ }
+ m_IPV4Filter->AddRef();
+ *Output = (IUnknown*)m_IPV4Filter;
+
+ return NOERROR;
+ }
+
+ if (IsEqualGUID(refiid, IID_IBDA_EthernetFilter))
+ {
+ // construct scanning tuner
+ if (!m_EthernetFilter)
+ {
+ HRESULT hr = CIPV4Filter_fnConstructor((IBDA_NetworkProvider*)this, refiid, (void**)&m_EthernetFilter);
+ if (FAILED(hr))
+ return hr;
+ }
+ m_EthernetFilter->AddRef();
+ *Output = (IUnknown*)m_EthernetFilter;
+
+ return NOERROR;
+ }
+
if (IsEqualGUID(refiid, IID_IBDA_NetworkProvider))
{
*Output = (IBDA_NetworkProvider*)(this);
@@ -163,7 +211,10 @@ CNetworkProvider::CNetworkProvider(LPCGUID ClassID) : m_Ref(0),
m_ReferenceClock(0),
m_FilterState(State_Stopped),
m_DeviceFilters(),
- m_Tuner(0)
+ m_Tuner(0),
+ m_IPV6Filter(0),
+ m_IPV4Filter(0),
+ m_EthernetFilter(0)
{
m_Pins[0] = 0;
diff --git a/reactos/dll/directx/msdvbnp/precomp.h b/reactos/dll/directx/msdvbnp/precomp.h
index 4294d42d198..c9abe7ac000 100644
--- a/reactos/dll/directx/msdvbnp/precomp.h
+++ b/reactos/dll/directx/msdvbnp/precomp.h
@@ -82,6 +82,30 @@ CEnumMediaTypes_fnConstructor(
REFIID riid,
LPVOID * ppv);
+/* ethernetfilter.cpp */
+HRESULT
+WINAPI
+CEthernetFilter_fnConstructor(
+ IBDA_NetworkProvider * pNetworkProvider,
+ REFIID riid,
+ LPVOID * ppv);
+
+/* ipv6.cpp */
+HRESULT
+WINAPI
+CIPV6Filter_fnConstructor(
+ IBDA_NetworkProvider * pNetworkProvider,
+ REFIID riid,
+ LPVOID * ppv);
+
+/* ipv4.cpp */
+HRESULT
+WINAPI
+CIPV4Filter_fnConstructor(
+ IBDA_NetworkProvider * pNetworkProvider,
+ REFIID riid,
+ LPVOID * ppv);
+
#ifndef _MSC_VER
extern const GUID CLSID_DVBTNetworkProvider;
#endif