/***************************************************************************** * CMidiFilterFactory::NonDelegatingQueryInterface() ***************************************************************************** *//*! * @brief * Obtains an interface. * @details * This function works just like a COM QueryInterface call and is used if * the object is not being aggregated. * @param * Interface The GUID of the interface to be retrieved. * @param * Object Pointer to the location to store the retrieved interface object. * @return * Returns STATUS_SUCCESS if the interface is found. Otherwise, returns * STATUS_INVALID_PARAMETER. */ STDMETHODIMP CMidiFilterFactory:: NonDelegatingQueryInterface ( IN REFIID Interface, OUT PVOID * Object ) { PAGED_CODE(); ASSERT(Object); _DbgPrintF(DEBUGLVL_BLAB,("[CMidiFilterFactory::NonDelegatingQueryInterface]")); if (IsEqualGUIDAligned(Interface,IID_IUnknown)) { *Object = PVOID(PUNKNOWN(this)); } else { *Object = NULL; } if (*Object) { // // We reference the interface for the caller. // PUNKNOWN(*Object)->AddRef(); return STATUS_SUCCESS; } return STATUS_INVALID_PARAMETER; }
/***************************************************************************** * CUnknown::NonDelegatingQueryInterface() ***************************************************************************** * Obtains an interface. */ STDMETHODIMP CUnknown::NonDelegatingQueryInterface ( REFIID rIID, PVOID * ppVoid ) { ASSERT(ppVoid); if (IsEqualGUIDAligned(rIID,IID_IUnknown)) { *ppVoid = PVOID(PUNKNOWN(this)); } else { *ppVoid = NULL; } if (*ppVoid) { PUNKNOWN(*ppVoid)->AddRef(); return STATUS_SUCCESS; } return STATUS_INVALID_PARAMETER; }
/***************************************************************************** * CUnknown::NonDelegatingQueryInterface() ***************************************************************************** * Obtains an interface. */ STDMETHODIMP_(HRESULT) CUnknown::NonDelegatingQueryInterface ( REFIID rIID, PVOID * ppVoid ) { ASSERT(ppVoid); if (IsEqualGUID(rIID,IID_IUnknown)) { *ppVoid = PVOID(PUNKNOWN(this)); } else { *ppVoid = NULL; } if (*ppVoid) { PUNKNOWN(*ppVoid)->AddRef(); return S_OK; } return E_INVALIDARG; }
//================================================================================================================================== NTSTATUS NTAPI CPortPinWavePci::QueryInterface( IN REFIID refiid, OUT PVOID* Output) { //DPRINT("CPortPinWavePci::QueryInterface entered\n"); if (IsEqualGUIDAligned(refiid, IID_IIrpTarget) || IsEqualGUIDAligned(refiid, IID_IUnknown)) { *Output = PVOID(PUNKNOWN((IIrpTarget*)this)); PUNKNOWN(*Output)->AddRef(); return STATUS_SUCCESS; } if (IsEqualGUIDAligned(refiid, IID_IServiceSink)) { *Output = PVOID(PSERVICESINK(this)); PUNKNOWN(*Output)->AddRef(); return STATUS_SUCCESS; } if (IsEqualGUIDAligned(refiid, IID_IPortWavePciStream)) { *Output = PVOID(PPORTWAVEPCISTREAM(this)); PUNKNOWN(*Output)->AddRef(); return STATUS_SUCCESS; } return STATUS_UNSUCCESSFUL; }
STDMETHODIMP WaveStream::NonDelegatingQueryInterface(IN REFIID Interface,OUT PVOID *Object) { PAGED_CODE(); ASSERT(Object); if (IsEqualGUIDAligned(Interface,IID_IUnknown)) { *Object = PVOID(PUNKNOWN(PMINIPORTWAVERTSTREAM(this))); } else if (IsEqualGUIDAligned(Interface,IID_IMiniportWaveRTStream)) { *Object = PVOID(PMINIPORTWAVERTSTREAM(this)); } else if (IsEqualGUIDAligned(Interface,IID_IMiniportWaveRTStreamNotification)) { *Object = PVOID(PMINIPORTWAVERTSTREAMNOTIFICATION(this)); } else { *Object = NULL; } if (*Object) { PUNKNOWN(*Object)->AddRef(); return STATUS_SUCCESS; } return STATUS_INVALID_PARAMETER; }
CMiniportWaveCyclic::NonDelegatingQueryInterface ( IN REFIID Interface, OUT PVOID * Object ) /*++ Routine Description: QueryInterface Arguments: Interface - GUID Object - interface pointer to be returned. Return Value: NT status code. --*/ { PAGED_CODE(); ASSERT(Object); if (IsEqualGUIDAligned(Interface, IID_IUnknown)) { *Object = PVOID(PUNKNOWN(PMINIPORTWAVECYCLIC(this))); } else if (IsEqualGUIDAligned(Interface, IID_IMiniport)) { *Object = PVOID(PMINIPORT(this)); } else if (IsEqualGUIDAligned(Interface, IID_IMiniportWaveCyclic)) { *Object = PVOID(PMINIPORTWAVECYCLIC(this)); } else if (IsEqualGUIDAligned(Interface, IID_IPinCount)) { *Object = PVOID(PPINCOUNT(this)); } else { *Object = NULL; } if (*Object) { // We reference the interface for the caller. PUNKNOWN(*Object)->AddRef(); return STATUS_SUCCESS; } return STATUS_INVALID_PARAMETER; } // NonDelegatingQueryInterface
NTSTATUS NTAPI CPortTopology::QueryInterface( IN REFIID refiid, OUT PVOID* Output) { UNICODE_STRING GuidString; DPRINT("IPortTopology_fnQueryInterface\n"); if (IsEqualGUIDAligned(refiid, IID_IPortTopology) || IsEqualGUIDAligned(refiid, IID_IPort) || IsEqualGUIDAligned(refiid, IID_IUnknown)) { *Output = PVOID(PUNKNOWN((IPortTopology*)this)); PUNKNOWN(*Output)->AddRef(); return STATUS_SUCCESS; } else if (IsEqualGUIDAligned(refiid, IID_IPortEvents)) { *Output = PVOID(PPORTEVENTS(this)); PUNKNOWN(*Output)->AddRef(); return STATUS_SUCCESS; } else if (IsEqualGUIDAligned(refiid, IID_ISubdevice)) { *Output = PVOID(PSUBDEVICE(this)); PUNKNOWN(*Output)->AddRef(); return STATUS_SUCCESS; } else if (IsEqualGUIDAligned(refiid, IID_IPortClsVersion)) { return NewPortClsVersion((PPORTCLSVERSION*)Output); } else if (IsEqualGUIDAligned(refiid, IID_IDrmPort) || IsEqualGUIDAligned(refiid, IID_IDrmPort2)) { return NewIDrmPort((PDRMPORT2*)Output); } else if (IsEqualGUIDAligned(refiid, IID_IUnregisterSubdevice)) { return NewIUnregisterSubdevice((PUNREGISTERSUBDEVICE*)Output); } else if (IsEqualGUIDAligned(refiid, IID_IUnregisterPhysicalConnection)) { return NewIUnregisterPhysicalConnection((PUNREGISTERPHYSICALCONNECTION*)Output); } if (RtlStringFromGUID(refiid, &GuidString) == STATUS_SUCCESS) { DPRINT1("IPortTopology_fnQueryInterface no interface!!! iface %S\n", GuidString.Buffer); RtlFreeUnicodeString(&GuidString); } return STATUS_UNSUCCESSFUL; }
//============================================================================= STDMETHODIMP CMiniportTopology::NonDelegatingQueryInterface ( IN REFIID Interface, OUT PVOID * Object ) /*++ Routine Description: QueryInterface for MiniportTopology Arguments: Interface - GUID of the interface Object - interface object to be returned. Return Value: NT status code. --*/ { PAGED_CODE(); ASSERT(Object); if (IsEqualGUIDAligned(Interface, IID_IUnknown)) { *Object = PVOID(PUNKNOWN(this)); } else if (IsEqualGUIDAligned(Interface, IID_IMiniport)) { *Object = PVOID(PMINIPORT(this)); } else if (IsEqualGUIDAligned(Interface, IID_IMiniportTopology)) { *Object = PVOID(PMINIPORTTOPOLOGY(this)); } else { *Object = NULL; } if (*Object) { // We reference the interface for the caller. PUNKNOWN(*Object)->AddRef(); return(STATUS_SUCCESS); } return(STATUS_INVALID_PARAMETER); } // NonDelegatingQueryInterface
CMiniportWaveCyclicStream::NonDelegatingQueryInterface ( IN REFIID Interface, OUT PVOID * Object ) /*++ Routine Description: QueryInterface Arguments: Interface - GUID Object - interface pointer to be returned Return Value: NT status code. --*/ { PAGED_CODE(); ASSERT(Object); if (IsEqualGUIDAligned(Interface, IID_IUnknown)) { *Object = PVOID(PUNKNOWN(PMINIPORTWAVECYCLICSTREAM(this))); } else if (IsEqualGUIDAligned(Interface, IID_IMiniportWaveCyclicStream)) { *Object = PVOID(PMINIPORTWAVECYCLICSTREAM(this)); } else if (IsEqualGUIDAligned(Interface, IID_IDmaChannel)) { *Object = PVOID(PDMACHANNEL(this)); } else { *Object = NULL; } if (*Object) { PUNKNOWN(*Object)->AddRef(); return STATUS_SUCCESS; } return STATUS_INVALID_PARAMETER; } // NonDelegatingQueryInterface
CUnknown::CUnknown(PUNKNOWN outer_unknown) { m_ref_count = 0; if ( outer_unknown ) m_outer_unknown = outer_unknown; else m_outer_unknown = PUNKNOWN(dynamic_cast<PNONDELEGATINGUNKNOWN>(this)); }
CUnknown::NonDelegatingQueryInterface( IN REFIID iid, PVOID* ppVoid) { /* FIXME */ #if 0 if ( IsEqualGUID(iid, IID_IUnknown) ) /* TODO: Aligned? */ *ppVoid = PVOID(PUNKNOWN(this)); else *ppVoid = NULL; #endif if ( *ppVoid ) { PUNKNOWN(*ppVoid)->AddRef(); return STATUS_SUCCESS; } return STATUS_INVALID_PARAMETER; }
/***************************************************************************** * CUnknown::CUnknown() ***************************************************************************** * Constructor. */ CUnknown::CUnknown(PUNKNOWN pUnknownOuter) : m_lRefCount(0) { if (pUnknownOuter) { m_pUnknownOuter = pUnknownOuter; } else { m_pUnknownOuter = PUNKNOWN(dynamic_cast<PNONDELEGATINGUNKNOWN>(this)); } }
/***************************************************************************** * CUnknown::CUnknown() ***************************************************************************** * Constructor. */ CUnknown::CUnknown(PUNKNOWN pUnknownOuter) : m_lRefCount(0) { InterlockedIncrement(&m_lActiveObjects); if (pUnknownOuter) { m_pUnknownOuter = pUnknownOuter; } else { m_pUnknownOuter = PUNKNOWN(dynamic_cast<PNONDELEGATINGUNKNOWN>(this)); } }
//=============================================================================================== // FUNCTION: QueryInterface // PURPOSE: This method returns a reference to the request interface, if it exists. // BOOL CUnknown::QueryInterface(REFIID riid, CUnknown *pUnknown) { MEMBERASSERT(); WPTRASSERT(pUnknown); ASSERT(m_pInterface!=NULL); // Clear the interface in the return object in case of failure. pUnknown->SetInterface(NULL); // Query for the interface. void *pInterface = NULL; if (!_QueryInterface(riid, &pInterface)) return FALSE; // Set the return value. pUnknown->SetInterface(PUNKNOWN(pInterface)); return TRUE; }
_Use_decl_annotations_ NTSTATUS StartDevice ( PDEVICE_OBJECT DeviceObject, PIRP Irp, PRESOURCELIST ResourceList ) { /*++ Routine Description: This function is called by the operating system when the device is started. It is responsible for starting the miniports. This code is specific to the adapter because it calls out miniports for functions that are specific to the adapter. Arguments: DeviceObject - pointer to the driver object Irp - pointer to the irp ResourceList - pointer to the resource list assigned by PnP manager Return Value: NT status code --*/ PAGED_CODE(); UNREFERENCED_PARAMETER(ResourceList); ASSERT(DeviceObject); ASSERT(Irp); ASSERT(ResourceList); NTSTATUS ntStatus = STATUS_SUCCESS; PADAPTERCOMMON pAdapterCommon = NULL; PUNKNOWN pUnknownCommon = NULL; PortClassDeviceContext* pExtension = static_cast<PortClassDeviceContext*>(DeviceObject->DeviceExtension); DPF_ENTER(("[StartDevice]")); // // create a new adapter common object // ntStatus = NewAdapterCommon( &pUnknownCommon, IID_IAdapterCommon, NULL, NonPagedPoolNx ); IF_FAILED_JUMP(ntStatus, Exit); ntStatus = pUnknownCommon->QueryInterface( IID_IAdapterCommon,(PVOID *) &pAdapterCommon); IF_FAILED_JUMP(ntStatus, Exit); ntStatus = pAdapterCommon->Init(DeviceObject); IF_FAILED_JUMP(ntStatus, Exit); // // register with PortCls for power-management services ntStatus = PcRegisterAdapterPowerManagement( PUNKNOWN(pAdapterCommon), DeviceObject); IF_FAILED_JUMP(ntStatus, Exit); // // Install wave+topology filters for render devices // ntStatus = InstallAllRenderFilters(DeviceObject, Irp, pAdapterCommon); IF_FAILED_JUMP(ntStatus, Exit); Exit: // // Stash the adapter common object in the device extension so // we can access it for cleanup on stop/removal. // if (pAdapterCommon) { ASSERT(pExtension != NULL); pExtension->m_pCommon = pAdapterCommon; } // // Release the adapter IUnknown interface. // SAFE_RELEASE(pUnknownCommon); return ntStatus; }
//============================================================================= NTSTATUS StartDevice( IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp, IN PRESOURCELIST ResourceList ) /*++ Routine Description: This function is called by the operating system when the device is started. It is responsible for starting the miniports. This code is specific to the adapter because it calls out miniports for functions that are specific to the adapter. Arguments: DeviceObject - pointer to the driver object Irp - pointer to the irp ResourceList - pointer to the resource list assigned by PnP manager Return Value: NT status code. --*/ { UNREFERENCED_PARAMETER(ResourceList); PAGED_CODE(); ASSERT(DeviceObject); ASSERT(Irp); ASSERT(ResourceList); NTSTATUS ntStatus = STATUS_SUCCESS; PUNKNOWN unknownTopology = NULL; PUNKNOWN unknownWave = NULL; PADAPTERCOMMON pAdapterCommon = NULL; PUNKNOWN pUnknownCommon = NULL; DPF_ENTER(("[StartDevice]")); // create a new adapter common object ntStatus = NewAdapterCommon(&pUnknownCommon, IID_IAdapterCommon, NULL, NonPagedPool); if (NT_SUCCESS(ntStatus)) { ntStatus = pUnknownCommon->QueryInterface(IID_IAdapterCommon, (PVOID *) &pAdapterCommon); if (NT_SUCCESS(ntStatus)) { ntStatus = pAdapterCommon->Init(DeviceObject); if (NT_SUCCESS(ntStatus)) { // register with PortCls for power-management services ntStatus = PcRegisterAdapterPowerManagement(PUNKNOWN(pAdapterCommon), DeviceObject); } } } // install MSVAD topology miniport. if (NT_SUCCESS(ntStatus)) { ntStatus = InstallSubdevice(DeviceObject, Irp, L"Topology", CLSID_PortTopology, CLSID_PortTopology, CreateMiniportTopologyMSVAD, pAdapterCommon, NULL, IID_IPortTopology, NULL, &unknownTopology); } // install MSVAD wavecyclic miniport. if (NT_SUCCESS(ntStatus)) { ntStatus = InstallSubdevice(DeviceObject, Irp, L"Wave", CLSID_PortWaveCyclic, CLSID_PortWaveCyclic, CreateMiniportWaveCyclicMSVAD, pAdapterCommon, NULL, IID_IPortWaveCyclic, pAdapterCommon->WavePortDriverDest(), &unknownWave); } if (unknownTopology && unknownWave) { // register wave <=> topology connections // This will connect bridge pins of wavecyclic and topology // miniports. if ((TopologyPhysicalConnections.ulTopologyOut != (ULONG)-1) && (TopologyPhysicalConnections.ulWaveIn != (ULONG)-1)) { ntStatus = PcRegisterPhysicalConnection(DeviceObject, unknownTopology, TopologyPhysicalConnections.ulTopologyOut, unknownWave, TopologyPhysicalConnections.ulWaveIn); } if (NT_SUCCESS(ntStatus)) { if ((TopologyPhysicalConnections.ulWaveOut != (ULONG)-1) && (TopologyPhysicalConnections.ulTopologyIn != (ULONG)-1)) { ntStatus = PcRegisterPhysicalConnection(DeviceObject, unknownWave, TopologyPhysicalConnections.ulWaveOut, unknownTopology, TopologyPhysicalConnections.ulTopologyIn); } } } // Release the adapter common object. It either has other references, // or we need to delete it anyway. if (pAdapterCommon) { pAdapterCommon->Release(); } if (pUnknownCommon) { pUnknownCommon->Release(); } if (unknownTopology) { unknownTopology->Release(); } if (unknownWave) { unknownWave->Release(); } return ntStatus; } // StartDevice
CMiniportWaveRTStream::NonDelegatingQueryInterface ( _In_ REFIID Interface, _COM_Outptr_ PVOID * Object ) /*++ Routine Description: QueryInterface Arguments: Interface - GUID Object - interface pointer to be returned Return Value: NT status code. --*/ { PAGED_CODE(); ASSERT(Object); if (IsEqualGUIDAligned(Interface, IID_IUnknown)) { *Object = PVOID(PUNKNOWN(PMINIPORTWAVERTSTREAM(this))); } else if (IsEqualGUIDAligned(Interface, IID_IMiniportWaveRTStream)) { *Object = PVOID(PMINIPORTWAVERTSTREAM(this)); } else if (IsEqualGUIDAligned(Interface, IID_IMiniportWaveRTStreamNotification)) { *Object = PVOID(PMINIPORTWAVERTSTREAMNOTIFICATION(this)); } else if (IsEqualGUIDAligned(Interface, IID_IMiniportStreamAudioEngineNode)) { *Object = (PVOID)(IMiniportStreamAudioEngineNode*)this; } else if (IsEqualGUIDAligned(Interface, IID_IMiniportStreamAudioEngineNode2)) { *Object = (PVOID)(IMiniportStreamAudioEngineNode2*)this; } else if (IsEqualGUIDAligned(Interface, IID_IDrmAudioStream)) { *Object = (PVOID)(IDrmAudioStream*)this; } else { *Object = NULL; } if (*Object) { PUNKNOWN(*Object)->AddRef(); return STATUS_SUCCESS; } return STATUS_INVALID_PARAMETER; } // NonDelegatingQueryInterface