+ HRESULT hr;
+ IKsObject * pObject = NULL;
+ IPin * pPin = NULL, * pConnectedPin = NULL;
+ IEnumFilters *pEnumFilters = NULL;
+ IBDA_NetworkProvider * pNetworkProvider = NULL;
+ IBaseFilter * ppFilter[1];
+ PIN_INFO PinInfo;
+ FILTER_INFO FilterInfo;
+ HANDLE hFile = INVALID_HANDLE_VALUE;
+
+ if (!pUnkOuter)
+ return E_POINTER;
+
+ // query for IKsObject interface
+ hr = pUnkOuter->QueryInterface(IID_IKsObject, (void**)&pObject);
+
+ if (FAILED(hr))
+ return hr;
+
+ // query for IPin interface
+ hr = pObject->QueryInterface(IID_IPin, (void**)&pPin);
+
+ if (FAILED(hr))
+ {
+ //clean up
+ pObject->Release();
+ return hr;
+ }
+
+ // get pin info
+ hr = pPin->QueryPinInfo(&PinInfo);
+
+ if (FAILED(hr))
+ {
+ //clean up
+ pObject->Release();
+ pPin->Release();
+ return hr;
+ }
+
+ // sanity checks
+ assert(PinInfo.dir == PINDIR_OUTPUT);
+ assert(PinInfo.pFilter != NULL);
+
+ // query filter info
+ hr = PinInfo.pFilter->QueryFilterInfo(&FilterInfo);
+
+ // sanity check
+ assert(FilterInfo.pGraph != NULL);
+
+ // get IEnumFilters interface
+ hr = FilterInfo.pGraph->EnumFilters(&pEnumFilters);
+
+ if (FAILED(hr))
+ {
+ //clean up
+ FilterInfo.pGraph->Release();
+ PinInfo.pFilter->Release();
+ pObject->Release();
+ pPin->Release();
+ return hr;
+ }
+
+ while(pEnumFilters->Next(1, ppFilter, NULL) == S_OK)
+ {
+ // check if that filter supports the IBDA_NetworkProvider interface
+ hr = ppFilter[0]->QueryInterface(IID_IBDA_NetworkProvider, (void**)&pNetworkProvider);
+
+ // release IBaseFilter
+ ppFilter[0]->Release();
+
+ if (SUCCEEDED(hr))
+ break;
+ }
+
+ // release IEnumFilters interface
+ pEnumFilters->Release();
+
+ // release IFilterGraph interface
+ FilterInfo.pGraph->Release();
+
+ // release IBaseFilter interface
+ PinInfo.pFilter->Release();
+
+ if (pNetworkProvider)
+ {
+ // get connected pin handle
+ hr = pPin->ConnectedTo(&pConnectedPin);
+
+ // get file handle
+ hFile = pObject->KsGetObjectHandle();
+
+ if (FAILED(hr) || hFile == INVALID_HANDLE_VALUE)
+ {
+ // pin not connected
+ pNetworkProvider->Release();
+ // set zero
+ pNetworkProvider = NULL;
+ }
+ }
+
+ // release IPin
+ pPin->Release();
+
+ // release IKsObject
+ pObject->Release();
+
+
+ if (pNetworkProvider == NULL)
+ {
+ // no network provider interface in graph
+ return E_NOINTERFACE;
+ }
+
+ CBDAPinControl * handler = new CBDAPinControl(hFile, pNetworkProvider, pConnectedPin);