- // 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;
+ if (PinInfo.dir == PINDIR_OUTPUT)
+ {
+ // get connected pin handle
+ hr = pPin->ConnectedTo(&pConnectedPin);
+ if (SUCCEEDED(hr))
+ {
+ // get file handle
+ hFile = pObject->KsGetObjectHandle();
+ if (hFile)
+ {
+ hr = CBDAPinControl_RealConstructor(hFile, pNetworkProvider, pConnectedPin, 0, pUnkOuter, riid, ppv);
+ if (SUCCEEDED(hr))
+ {
+ // set to null to prevent releasing
+ pNetworkProvider = NULL;
+ pConnectedPin = NULL;
+ }
+ }
+ else
+ {
+ // expected file handle
+ hr = E_UNEXPECTED;
+ }
+ }
+ }
+ else
+ {
+ // get IUnknown from base filter
+ hr = PinInfo.pFilter->QueryInterface(IID_IUnknown, (void**)&pUnknown);
+ if (SUCCEEDED(hr))
+ {
+ // register device filter
+ hr = pNetworkProvider->RegisterDeviceFilter(pUnknown, &RegistrationCtx);
+ if (SUCCEEDED(hr))
+ {
+ // get file handle
+ hFile = pObject->KsGetObjectHandle();
+ if (hFile)
+ {
+ hr = CBDAPinControl_RealConstructor(hFile, pNetworkProvider, NULL, RegistrationCtx, pUnkOuter, riid, ppv);
+ if (SUCCEEDED(hr))
+ {
+ // set to null to prevent releasing
+ pNetworkProvider = NULL;
+ }
+ }
+ else
+ {
+ // expected file handle
+ hr = E_UNEXPECTED;
+ }
+ }
+ else
+ {
+ WCHAR Buffer[100];
+ swprintf(Buffer, L"CBDAPinControl_fnConstructor failed to register filter with %lx\n", hr);
+ OutputDebugStringW(Buffer);
+ DebugBreak();
+ }
+ }
+ }