Implemented ISeekingPassThru.

diff --git a/dlls/quartz/Makefile.in b/dlls/quartz/Makefile.in
index 24d611c..28e80f1 100644
--- a/dlls/quartz/Makefile.in
+++ b/dlls/quartz/Makefile.in
@@ -40,6 +40,9 @@
 	main.c \
 	memalloc.c \
 	monprop.c \
+	ptimpl.c \
+	ptmpos.c \
+	ptmseek.c \
 	regsvr.c \
 	sample.c \
 	seekpass.c \
diff --git a/dlls/quartz/ptimpl.c b/dlls/quartz/ptimpl.c
new file mode 100644
index 0000000..39c382f
--- /dev/null
+++ b/dlls/quartz/ptimpl.c
@@ -0,0 +1,59 @@
+/*
+ * A pass-through class.
+ *
+ * hidenori@a2.ctktv.ne.jp
+ */
+
+#include "config.h"
+
+#include "windef.h"
+#include "winbase.h"
+#include "wingdi.h"
+#include "winuser.h"
+#include "winerror.h"
+#include "wine/obj_base.h"
+#include "strmif.h"
+#include "control.h"
+#include "uuids.h"
+
+#include "debugtools.h"
+DEFAULT_DEBUG_CHANNEL(quartz);
+
+#include "quartz_private.h"
+#include "ptimpl.h"
+
+static
+HRESULT CPassThruImpl_GetConnected( CPassThruImpl* pImpl, IPin** ppPin )
+{
+	return IPin_ConnectedTo( pImpl->pPin, ppPin );
+}
+
+HRESULT CPassThruImpl_QueryPosPass(
+	CPassThruImpl* pImpl, IMediaPosition** ppPosition )
+{
+	IPin*	pPin;
+	HRESULT	hr;
+
+	hr = CPassThruImpl_GetConnected( pImpl, &pPin );
+	if ( FAILED(hr) )
+		return hr;
+	hr = IPin_QueryInterface(pPin,&IID_IMediaPosition,(void**)ppPosition);
+	IPin_Release(pPin);
+
+	return hr;
+}
+
+HRESULT CPassThruImpl_QuerySeekPass(
+	CPassThruImpl* pImpl, IMediaSeeking** ppSeeking )
+{
+	IPin*	pPin;
+	HRESULT	hr;
+
+	hr = CPassThruImpl_GetConnected( pImpl, &pPin );
+	if ( FAILED(hr) )
+		return hr;
+	hr = IPin_QueryInterface(pPin,&IID_IMediaSeeking,(void**)ppSeeking);
+	IPin_Release(pPin);
+
+	return hr;
+}
diff --git a/dlls/quartz/ptimpl.h b/dlls/quartz/ptimpl.h
new file mode 100644
index 0000000..d615e3a
--- /dev/null
+++ b/dlls/quartz/ptimpl.h
@@ -0,0 +1,32 @@
+#ifndef WINE_DSHOW_PTIMPL_H
+#define WINE_DSHOW_PTIMPL_H
+
+/*
+ * A pass-through class.
+ *
+ * hidenori@a2.ctktv.ne.jp
+ */
+
+typedef struct CPassThruImpl
+{
+	struct { ICOM_VFIELD(IMediaPosition); } mpos;
+	struct { ICOM_VFIELD(IMediaSeeking); } mseek;
+
+	IUnknown* punk;
+	IPin* pPin;
+} CPassThruImpl;
+
+#define	CPassThruImpl_THIS(iface,member)		CPassThruImpl*	This = ((CPassThruImpl*)(((char*)iface)-offsetof(CPassThruImpl,member)))
+
+HRESULT CPassThruImpl_InitIMediaPosition( CPassThruImpl* pImpl );
+void CPassThruImpl_UninitIMediaPosition( CPassThruImpl* pImpl );
+HRESULT CPassThruImpl_InitIMediaSeeking( CPassThruImpl* pImpl );
+void CPassThruImpl_UninitIMediaSeeking( CPassThruImpl* pImpl );
+
+HRESULT CPassThruImpl_QueryPosPass(
+	CPassThruImpl* pImpl, IMediaPosition** ppPosition );
+HRESULT CPassThruImpl_QuerySeekPass(
+	CPassThruImpl* pImpl, IMediaSeeking** ppSeeking );
+
+
+#endif  /* WINE_DSHOW_PTIMPL_H */
diff --git a/dlls/quartz/ptmpos.c b/dlls/quartz/ptmpos.c
new file mode 100644
index 0000000..f843f5c
--- /dev/null
+++ b/dlls/quartz/ptmpos.c
@@ -0,0 +1,263 @@
+/*
+ * A pass-through class for IMediaPosition.
+ *
+ * hidenori@a2.ctktv.ne.jp
+ */
+
+#include "config.h"
+
+#include "windef.h"
+#include "winbase.h"
+#include "wingdi.h"
+#include "winuser.h"
+#include "winerror.h"
+#include "wine/obj_base.h"
+#include "strmif.h"
+#include "control.h"
+#include "uuids.h"
+
+#include "debugtools.h"
+DEFAULT_DEBUG_CHANNEL(quartz);
+
+#include "quartz_private.h"
+#include "ptimpl.h"
+
+
+#define QUERYPOSPASS \
+	IMediaPosition* pPos; \
+	HRESULT hr; \
+	hr = CPassThruImpl_QueryPosPass( This, &pPos ); \
+	if ( FAILED(hr) ) return hr;
+
+static HRESULT WINAPI
+IMediaPosition_fnQueryInterface(IMediaPosition* iface,REFIID riid,void** ppobj)
+{
+	CPassThruImpl_THIS(iface,mpos);
+
+	TRACE("(%p)->()\n",This);
+
+	return IUnknown_QueryInterface(This->punk,riid,ppobj);
+}
+
+static ULONG WINAPI
+IMediaPosition_fnAddRef(IMediaPosition* iface)
+{
+	CPassThruImpl_THIS(iface,mpos);
+
+	TRACE("(%p)->()\n",This);
+
+	return IUnknown_AddRef(This->punk);
+}
+
+static ULONG WINAPI
+IMediaPosition_fnRelease(IMediaPosition* iface)
+{
+	CPassThruImpl_THIS(iface,mpos);
+
+	TRACE("(%p)->()\n",This);
+
+	return IUnknown_Release(This->punk);
+}
+
+static HRESULT WINAPI
+IMediaPosition_fnGetTypeInfoCount(IMediaPosition* iface,UINT* pcTypeInfo)
+{
+	CPassThruImpl_THIS(iface,mpos);
+
+	FIXME("(%p)->() stub!\n",This);
+
+	return E_NOTIMPL;
+}
+
+static HRESULT WINAPI
+IMediaPosition_fnGetTypeInfo(IMediaPosition* iface,UINT iTypeInfo, LCID lcid, ITypeInfo** ppobj)
+{
+	CPassThruImpl_THIS(iface,mpos);
+
+	FIXME("(%p)->() stub!\n",This);
+
+	return E_NOTIMPL;
+}
+
+static HRESULT WINAPI
+IMediaPosition_fnGetIDsOfNames(IMediaPosition* iface,REFIID riid, LPOLESTR* ppwszName, UINT cNames, LCID lcid, DISPID* pDispId)
+{
+	CPassThruImpl_THIS(iface,mpos);
+
+	FIXME("(%p)->() stub!\n",This);
+
+	return E_NOTIMPL;
+}
+
+static HRESULT WINAPI
+IMediaPosition_fnInvoke(IMediaPosition* iface,DISPID DispId, REFIID riid, LCID lcid, WORD wFlags, DISPPARAMS* pDispParams, VARIANT* pVarRes, EXCEPINFO* pExcepInfo, UINT* puArgErr)
+{
+	CPassThruImpl_THIS(iface,mpos);
+
+	FIXME("(%p)->() stub!\n",This);
+
+	return E_NOTIMPL;
+}
+
+
+static HRESULT WINAPI
+IMediaPosition_fnget_Duration(IMediaPosition* iface,REFTIME* prefTime)
+{
+	CPassThruImpl_THIS(iface,mpos);
+	QUERYPOSPASS
+
+	TRACE("(%p)->()\n",This);
+
+	return IMediaPosition_get_Duration(pPos,prefTime);
+}
+
+static HRESULT WINAPI
+IMediaPosition_fnput_CurrentPosition(IMediaPosition* iface,REFTIME refTime)
+{
+	CPassThruImpl_THIS(iface,mpos);
+	QUERYPOSPASS
+
+	TRACE("(%p)->()\n",This);
+
+	return IMediaPosition_put_CurrentPosition(pPos,refTime);
+}
+
+static HRESULT WINAPI
+IMediaPosition_fnget_CurrentPosition(IMediaPosition* iface,REFTIME* prefTime)
+{
+	CPassThruImpl_THIS(iface,mpos);
+	QUERYPOSPASS
+
+	TRACE("(%p)->()\n",This);
+
+	return IMediaPosition_get_CurrentPosition(pPos,prefTime);
+}
+
+static HRESULT WINAPI
+IMediaPosition_fnget_StopTime(IMediaPosition* iface,REFTIME* prefTime)
+{
+	CPassThruImpl_THIS(iface,mpos);
+	QUERYPOSPASS
+
+	TRACE("(%p)->()\n",This);
+
+	return IMediaPosition_get_StopTime(pPos,prefTime);
+}
+
+static HRESULT WINAPI
+IMediaPosition_fnput_StopTime(IMediaPosition* iface,REFTIME refTime)
+{
+	CPassThruImpl_THIS(iface,mpos);
+	QUERYPOSPASS
+
+	TRACE("(%p)->()\n",This);
+
+	return IMediaPosition_put_StopTime(pPos,refTime);
+}
+
+static HRESULT WINAPI
+IMediaPosition_fnget_PrerollTime(IMediaPosition* iface,REFTIME* prefTime)
+{
+	CPassThruImpl_THIS(iface,mpos);
+	QUERYPOSPASS
+
+	TRACE("(%p)->()\n",This);
+
+	return IMediaPosition_get_PrerollTime(pPos,prefTime);
+}
+
+static HRESULT WINAPI
+IMediaPosition_fnput_PrerollTime(IMediaPosition* iface,REFTIME refTime)
+{
+	CPassThruImpl_THIS(iface,mpos);
+	QUERYPOSPASS
+
+	TRACE("(%p)->()\n",This);
+
+	return IMediaPosition_put_PrerollTime(pPos,refTime);
+}
+
+static HRESULT WINAPI
+IMediaPosition_fnput_Rate(IMediaPosition* iface,double dblRate)
+{
+	CPassThruImpl_THIS(iface,mpos);
+	QUERYPOSPASS
+
+	TRACE("(%p)->()\n",This);
+
+	return IMediaPosition_put_Rate(pPos,dblRate);
+}
+
+static HRESULT WINAPI
+IMediaPosition_fnget_Rate(IMediaPosition* iface,double* pdblRate)
+{
+	CPassThruImpl_THIS(iface,mpos);
+	QUERYPOSPASS
+
+	TRACE("(%p)->()\n",This);
+
+	return IMediaPosition_get_Rate(pPos,pdblRate);
+}
+
+static HRESULT WINAPI
+IMediaPosition_fnCanSeekForward(IMediaPosition* iface,LONG* pCanSeek)
+{
+	CPassThruImpl_THIS(iface,mpos);
+	QUERYPOSPASS
+
+	TRACE("(%p)->()\n",This);
+
+	return IMediaPosition_CanSeekForward(pPos,pCanSeek);
+}
+
+static HRESULT WINAPI
+IMediaPosition_fnCanSeekBackward(IMediaPosition* iface,LONG* pCanSeek)
+{
+	CPassThruImpl_THIS(iface,mpos);
+	QUERYPOSPASS
+
+	TRACE("(%p)->()\n",This);
+
+	return IMediaPosition_CanSeekBackward(pPos,pCanSeek);
+}
+
+
+static ICOM_VTABLE(IMediaPosition) impos =
+{
+	ICOM_MSVTABLE_COMPAT_DummyRTTIVALUE
+	/* IUnknown fields */
+	IMediaPosition_fnQueryInterface,
+	IMediaPosition_fnAddRef,
+	IMediaPosition_fnRelease,
+	/* IDispatch fields */
+	IMediaPosition_fnGetTypeInfoCount,
+	IMediaPosition_fnGetTypeInfo,
+	IMediaPosition_fnGetIDsOfNames,
+	IMediaPosition_fnInvoke,
+	/* IMediaPosition fields */
+	IMediaPosition_fnget_Duration,
+	IMediaPosition_fnput_CurrentPosition,
+	IMediaPosition_fnget_CurrentPosition,
+	IMediaPosition_fnget_StopTime,
+	IMediaPosition_fnput_StopTime,
+	IMediaPosition_fnget_PrerollTime,
+	IMediaPosition_fnput_PrerollTime,
+	IMediaPosition_fnput_Rate,
+	IMediaPosition_fnget_Rate,
+	IMediaPosition_fnCanSeekForward,
+	IMediaPosition_fnCanSeekBackward,
+};
+
+
+HRESULT CPassThruImpl_InitIMediaPosition( CPassThruImpl* pImpl )
+{
+	TRACE("(%p)\n",pImpl);
+	ICOM_VTBL(&pImpl->mpos) = &impos;
+
+	return NOERROR;
+}
+
+void CPassThruImpl_UninitIMediaPosition( CPassThruImpl* pImpl )
+{
+	TRACE("(%p)\n",pImpl);
+}
diff --git a/dlls/quartz/ptmseek.c b/dlls/quartz/ptmseek.c
new file mode 100644
index 0000000..95f7c39
--- /dev/null
+++ b/dlls/quartz/ptmseek.c
@@ -0,0 +1,294 @@
+/*
+ * A pass-through class for IMediaSeeking.
+ *
+ * hidenori@a2.ctktv.ne.jp
+ */
+
+#include "config.h"
+
+#include "windef.h"
+#include "winbase.h"
+#include "wingdi.h"
+#include "winuser.h"
+#include "winerror.h"
+#include "wine/obj_base.h"
+#include "strmif.h"
+#include "control.h"
+#include "uuids.h"
+
+#include "debugtools.h"
+DEFAULT_DEBUG_CHANNEL(quartz);
+
+#include "quartz_private.h"
+#include "ptimpl.h"
+
+
+#define QUERYSEEKPASS \
+	IMediaSeeking* pSeek; \
+	HRESULT hr; \
+	hr = CPassThruImpl_QuerySeekPass( This, &pSeek ); \
+	if ( FAILED(hr) ) return hr;
+
+
+static HRESULT WINAPI
+IMediaSeeking_fnQueryInterface(IMediaSeeking* iface,REFIID riid,void** ppobj)
+{
+	CPassThruImpl_THIS(iface,mseek);
+
+	TRACE("(%p)->()\n",This);
+
+	return IUnknown_QueryInterface(This->punk,riid,ppobj);
+}
+
+static ULONG WINAPI
+IMediaSeeking_fnAddRef(IMediaSeeking* iface)
+{
+	CPassThruImpl_THIS(iface,mseek);
+
+	TRACE("(%p)->()\n",This);
+
+	return IUnknown_AddRef(This->punk);
+}
+
+static ULONG WINAPI
+IMediaSeeking_fnRelease(IMediaSeeking* iface)
+{
+	CPassThruImpl_THIS(iface,mseek);
+
+	TRACE("(%p)->()\n",This);
+
+	return IUnknown_Release(This->punk);
+}
+
+
+static HRESULT WINAPI
+IMediaSeeking_fnGetCapabilities(IMediaSeeking* iface,DWORD* pdwCaps)
+{
+	CPassThruImpl_THIS(iface,mseek);
+	QUERYSEEKPASS
+
+	TRACE("(%p)->()\n",This);
+
+	return IMediaSeeking_GetCapabilities(pSeek,pdwCaps);
+}
+
+static HRESULT WINAPI
+IMediaSeeking_fnCheckCapabilities(IMediaSeeking* iface,DWORD* pdwCaps)
+{
+	CPassThruImpl_THIS(iface,mseek);
+	QUERYSEEKPASS
+
+	TRACE("(%p)->()\n",This);
+
+	return IMediaSeeking_CheckCapabilities(pSeek,pdwCaps);
+}
+
+static HRESULT WINAPI
+IMediaSeeking_fnIsFormatSupported(IMediaSeeking* iface,const GUID* pidFormat)
+{
+	CPassThruImpl_THIS(iface,mseek);
+	QUERYSEEKPASS
+
+	TRACE("(%p)->()\n",This);
+
+	return IMediaSeeking_IsFormatSupported(pSeek,pidFormat);
+}
+
+static HRESULT WINAPI
+IMediaSeeking_fnQueryPreferredFormat(IMediaSeeking* iface,GUID* pidFormat)
+{
+	CPassThruImpl_THIS(iface,mseek);
+	QUERYSEEKPASS
+
+	TRACE("(%p)->()\n",This);
+
+	return IMediaSeeking_QueryPreferredFormat(pSeek,pidFormat);
+}
+
+static HRESULT WINAPI
+IMediaSeeking_fnGetTimeFormat(IMediaSeeking* iface,GUID* pidFormat)
+{
+	CPassThruImpl_THIS(iface,mseek);
+	QUERYSEEKPASS
+
+	TRACE("(%p)->()\n",This);
+
+	return IMediaSeeking_GetTimeFormat(pSeek,pidFormat);
+}
+
+static HRESULT WINAPI
+IMediaSeeking_fnIsUsingTimeFormat(IMediaSeeking* iface,const GUID* pidFormat)
+{
+	CPassThruImpl_THIS(iface,mseek);
+	QUERYSEEKPASS
+
+	TRACE("(%p)->()\n",This);
+
+	return IMediaSeeking_IsUsingTimeFormat(pSeek,pidFormat);
+}
+
+static HRESULT WINAPI
+IMediaSeeking_fnSetTimeFormat(IMediaSeeking* iface,const GUID* pidFormat)
+{
+	CPassThruImpl_THIS(iface,mseek);
+	QUERYSEEKPASS
+
+	TRACE("(%p)->()\n",This);
+
+	return IMediaSeeking_SetTimeFormat(pSeek,pidFormat);
+}
+
+static HRESULT WINAPI
+IMediaSeeking_fnGetDuration(IMediaSeeking* iface,LONGLONG* pllDuration)
+{
+	CPassThruImpl_THIS(iface,mseek);
+	QUERYSEEKPASS
+
+	TRACE("(%p)->()\n",This);
+
+	return IMediaSeeking_GetDuration(pSeek,pllDuration);
+}
+
+static HRESULT WINAPI
+IMediaSeeking_fnGetStopPosition(IMediaSeeking* iface,LONGLONG* pllPos)
+{
+	CPassThruImpl_THIS(iface,mseek);
+	QUERYSEEKPASS
+
+	TRACE("(%p)->()\n",This);
+
+	return IMediaSeeking_GetStopPosition(pSeek,pllPos);
+}
+
+static HRESULT WINAPI
+IMediaSeeking_fnGetCurrentPosition(IMediaSeeking* iface,LONGLONG* pllPos)
+{
+	CPassThruImpl_THIS(iface,mseek);
+	QUERYSEEKPASS
+
+	TRACE("(%p)->()\n",This);
+
+	return IMediaSeeking_GetCurrentPosition(pSeek,pllPos);
+}
+
+static HRESULT WINAPI
+IMediaSeeking_fnConvertTimeFormat(IMediaSeeking* iface,LONGLONG* pllOut,const GUID* pidFmtOut,LONGLONG llIn,const GUID* pidFmtIn)
+{
+	CPassThruImpl_THIS(iface,mseek);
+	QUERYSEEKPASS
+
+	TRACE("(%p)->()\n",This);
+
+	return IMediaSeeking_ConvertTimeFormat(pSeek,pllOut,pidFmtOut,llIn,pidFmtIn);
+}
+
+static HRESULT WINAPI
+IMediaSeeking_fnSetPositions(IMediaSeeking* iface,LONGLONG* pllCur,DWORD dwCurFlags,LONGLONG* pllStop,DWORD dwStopFlags)
+{
+	CPassThruImpl_THIS(iface,mseek);
+	QUERYSEEKPASS
+
+	TRACE("(%p)->()\n",This);
+
+	return IMediaSeeking_SetPositions(pSeek,pllCur,dwCurFlags,pllStop,dwStopFlags);
+}
+
+static HRESULT WINAPI
+IMediaSeeking_fnGetPositions(IMediaSeeking* iface,LONGLONG* pllCur,LONGLONG* pllStop)
+{
+	CPassThruImpl_THIS(iface,mseek);
+	QUERYSEEKPASS
+
+	TRACE("(%p)->()\n",This);
+
+	return IMediaSeeking_GetPositions(pSeek,pllCur,pllStop);
+}
+
+static HRESULT WINAPI
+IMediaSeeking_fnGetAvailable(IMediaSeeking* iface,LONGLONG* pllFirst,LONGLONG* pllLast)
+{
+	CPassThruImpl_THIS(iface,mseek);
+	QUERYSEEKPASS
+
+	TRACE("(%p)->()\n",This);
+
+	return IMediaSeeking_GetAvailable(pSeek,pllFirst,pllLast);
+}
+
+static HRESULT WINAPI
+IMediaSeeking_fnSetRate(IMediaSeeking* iface,double dblRate)
+{
+	CPassThruImpl_THIS(iface,mseek);
+	QUERYSEEKPASS
+
+	TRACE("(%p)->()\n",This);
+
+	return IMediaSeeking_SetRate(pSeek,dblRate);
+}
+
+static HRESULT WINAPI
+IMediaSeeking_fnGetRate(IMediaSeeking* iface,double* pdblRate)
+{
+	CPassThruImpl_THIS(iface,mseek);
+	QUERYSEEKPASS
+
+	TRACE("(%p)->()\n",This);
+
+	return IMediaSeeking_GetRate(pSeek,pdblRate);
+}
+
+static HRESULT WINAPI
+IMediaSeeking_fnGetPreroll(IMediaSeeking* iface,LONGLONG* pllPreroll)
+{
+	CPassThruImpl_THIS(iface,mseek);
+	QUERYSEEKPASS
+
+	TRACE("(%p)->()\n",This);
+
+	return IMediaSeeking_GetPreroll(pSeek,pllPreroll);
+}
+
+
+
+
+static ICOM_VTABLE(IMediaSeeking) imseek =
+{
+	ICOM_MSVTABLE_COMPAT_DummyRTTIVALUE
+	/* IUnknown fields */
+	IMediaSeeking_fnQueryInterface,
+	IMediaSeeking_fnAddRef,
+	IMediaSeeking_fnRelease,
+	/* IMediaSeeking fields */
+	IMediaSeeking_fnGetCapabilities,
+	IMediaSeeking_fnCheckCapabilities,
+	IMediaSeeking_fnIsFormatSupported,
+	IMediaSeeking_fnQueryPreferredFormat,
+	IMediaSeeking_fnGetTimeFormat,
+	IMediaSeeking_fnIsUsingTimeFormat,
+	IMediaSeeking_fnSetTimeFormat,
+	IMediaSeeking_fnGetDuration,
+	IMediaSeeking_fnGetStopPosition,
+	IMediaSeeking_fnGetCurrentPosition,
+	IMediaSeeking_fnConvertTimeFormat,
+	IMediaSeeking_fnSetPositions,
+	IMediaSeeking_fnGetPositions,
+	IMediaSeeking_fnGetAvailable,
+	IMediaSeeking_fnSetRate,
+	IMediaSeeking_fnGetRate,
+	IMediaSeeking_fnGetPreroll,
+};
+
+
+
+HRESULT CPassThruImpl_InitIMediaSeeking( CPassThruImpl* pImpl )
+{
+	TRACE("(%p)\n",pImpl);
+	ICOM_VTBL(&pImpl->mseek) = &imseek;
+
+	return NOERROR;
+}
+
+void CPassThruImpl_UninitIMediaSeeking( CPassThruImpl* pImpl )
+{
+	TRACE("(%p)\n",pImpl);
+}
diff --git a/dlls/quartz/seekpass.c b/dlls/quartz/seekpass.c
index 817d731..63ed7f0 100644
--- a/dlls/quartz/seekpass.c
+++ b/dlls/quartz/seekpass.c
@@ -13,6 +13,7 @@
 #include "winerror.h"
 #include "wine/obj_base.h"
 #include "strmif.h"
+#include "control.h"
 #include "uuids.h"
 
 #include "debugtools.h"
@@ -58,9 +59,21 @@
 {
 	CSeekingPassThru_THIS(iface,seekpass);
 
-	FIXME("(%p)->(%d,%p) stub!\n",This,bRendering,pPin);
+	FIXME("(%p)->(%d,%p) not tested!\n",This,bRendering,pPin);
 
-	return E_NOTIMPL;
+	if ( pPin == NULL )
+		return E_POINTER;
+
+	/* Why 'bRendering' is given as an argument?? */
+	EnterCriticalSection( &This->cs );
+
+	if ( This->passthru.pPin != NULL )
+		IPin_Release( This->passthru.pPin );
+	This->passthru.pPin = pPin; IPin_AddRef( pPin );
+
+	LeaveCriticalSection( &This->cs );
+
+	return NOERROR;
 }
 
 
@@ -80,6 +93,9 @@
 {
 	TRACE("(%p)\n",This);
 	ICOM_VTBL(&This->seekpass) = &iseekingpassthru;
+	This->passthru.punk = This->unk.punkControl;
+	This->passthru.pPin = NULL;
+	InitializeCriticalSection( &This->cs );
 
 	return NOERROR;
 }
@@ -88,6 +104,12 @@
 void CSeekingPassThru_UninitISeekingPassThru(CSeekingPassThru* This)
 {
 	TRACE("(%p)\n",This);
+	if ( This->passthru.pPin != NULL )
+	{
+		IPin_Release( This->passthru.pPin );
+		This->passthru.pPin = NULL;
+	}
+	DeleteCriticalSection( &This->cs );
 }
 
 
@@ -95,6 +117,8 @@
 static QUARTZ_IFEntry IFEntries[] =
 {
   { &IID_ISeekingPassThru, offsetof(CSeekingPassThru,seekpass)-offsetof(CSeekingPassThru,unk) },
+  { &IID_IMediaPosition, offsetof(CSeekingPassThru,passthru.mpos)-offsetof(CSeekingPassThru,unk) },
+  { &IID_IMediaSeeking, offsetof(CSeekingPassThru,passthru.mseek)-offsetof(CSeekingPassThru,unk) },
 };
 
 
diff --git a/dlls/quartz/seekpass.h b/dlls/quartz/seekpass.h
index 1176a3d..e89f511 100644
--- a/dlls/quartz/seekpass.h
+++ b/dlls/quartz/seekpass.h
@@ -12,6 +12,7 @@
 */
 
 #include "iunk.h"
+#include "ptimpl.h"
 
 typedef struct QUARTZ_ISeekingPassThruImpl
 {
@@ -25,6 +26,8 @@
 	QUARTZ_ISeekingPassThruImpl	seekpass;
 
 	/* ISeekingPassThru fields. */
+	CRITICAL_SECTION	cs;
+	CPassThruImpl	passthru;
 } CSeekingPassThru;
 
 #define	CSeekingPassThru_THIS(iface,member)		CSeekingPassThru*	This = ((CSeekingPassThru*)(((char*)iface)-offsetof(CSeekingPassThru,member)))