NTSTATUS NTAPI CPortWavePci::Init( IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp, IN PUNKNOWN UnknownMiniport, IN PUNKNOWN UnknownAdapter OPTIONAL, IN PRESOURCELIST ResourceList) { IMiniportWavePci * Miniport; PSERVICEGROUP ServiceGroup = 0; NTSTATUS Status; PPINCOUNT PinCount; PPOWERNOTIFY PowerNotify; DPRINT("IPortWavePci_fnInit entered with This %p, DeviceObject %p Irp %p UnknownMiniport %p, UnknownAdapter %p ResourceList %p\n", this, DeviceObject, Irp, UnknownMiniport, UnknownAdapter, ResourceList); PC_ASSERT_IRQL_EQUAL(PASSIVE_LEVEL); Status = UnknownMiniport->QueryInterface(IID_IMiniportWavePci, (PVOID*)&Miniport); if (!NT_SUCCESS(Status)) { DPRINT("IPortWavePci_fnInit called with invalid IMiniport adapter\n"); return STATUS_INVALID_PARAMETER; } // Initialize port object m_Miniport = Miniport; m_pDeviceObject = DeviceObject; InitializeListHead(&m_EventList); KeInitializeSpinLock(&m_EventListLock); // increment reference on miniport adapter Miniport->AddRef(); Status = Miniport->Init(UnknownAdapter, ResourceList, this, &ServiceGroup); if (!NT_SUCCESS(Status)) { DPRINT("IPortWavePci_fnInit failed with %x\n", Status); // release reference on miniport adapter Miniport->Release(); return Status; } // check if the miniport adapter provides a valid device descriptor Status = Miniport->GetDescription(&m_pDescriptor); if (!NT_SUCCESS(Status)) { DPRINT("failed to get description\n"); Miniport->Release(); return Status; } // create the subdevice descriptor Status = PcCreateSubdeviceDescriptor(&m_SubDeviceDescriptor, 3, InterfaceGuids, 0, NULL, 2, WavePciPropertySet, 0, 0, 0, NULL, 0, NULL, m_pDescriptor); if (!NT_SUCCESS(Status)) { DPRINT("PcCreateSubdeviceDescriptor failed with %x\n", Status); Miniport->Release(); return Status; } // did we get a service group if (ServiceGroup) { // store service group in context m_ServiceGroup = ServiceGroup; // add ourselves to service group which is called when miniport receives an isr m_ServiceGroup->AddMember(PSERVICESINK(this)); // increment reference on service group m_ServiceGroup->AddRef(); } // store for node property requests m_SubDeviceDescriptor->UnknownMiniport = UnknownMiniport; // check if it supports IPinCount interface Status = UnknownMiniport->QueryInterface(IID_IPinCount, (PVOID*)&PinCount); if (NT_SUCCESS(Status)) { // store IPinCount interface m_pPinCount = PinCount; } // does the Miniport adapter support IPowerNotify interface*/ Status = UnknownMiniport->QueryInterface(IID_IPowerNotify, (PVOID*)&PowerNotify); if (NT_SUCCESS(Status)) { // store reference m_pPowerNotify = PowerNotify; } DPRINT("IPortWavePci_Init successfully initialized\n"); return STATUS_SUCCESS; }
NTSTATUS NTAPI CPortTopology::Init( IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp, IN PUNKNOWN UnknownMiniport, IN PUNKNOWN UnknownAdapter OPTIONAL, IN PRESOURCELIST ResourceList) { IMiniportTopology * Miniport; NTSTATUS Status; DPRINT("IPortTopology_fnInit entered This %p DeviceObject %p Irp %p UnknownMiniport %p UnknownAdapter %p ResourceList %p\n", this, DeviceObject, Irp, UnknownMiniport, UnknownAdapter, ResourceList); PC_ASSERT_IRQL_EQUAL(PASSIVE_LEVEL); if (m_bInitialized) { DPRINT("IPortTopology_Init called again\n"); return STATUS_SUCCESS; } Status = UnknownMiniport->QueryInterface(IID_IMiniportTopology, (PVOID*)&Miniport); if (!NT_SUCCESS(Status)) { DPRINT("IPortTopology_Init called with invalid IMiniport adapter\n"); return STATUS_INVALID_PARAMETER; } // Initialize port object m_pMiniport = Miniport; m_pDeviceObject = DeviceObject; m_bInitialized = TRUE; // now initialize the miniport driver Status = Miniport->Init(UnknownAdapter, ResourceList, this); if (!NT_SUCCESS(Status)) { DPRINT("IPortTopology_Init failed with %x\n", Status); m_bInitialized = FALSE; Miniport->Release(); return Status; } // get the miniport device descriptor Status = Miniport->GetDescription(&m_pDescriptor); if (!NT_SUCCESS(Status)) { DPRINT("failed to get description\n"); Miniport->Release(); m_bInitialized = FALSE; return Status; } // create the subdevice descriptor Status = PcCreateSubdeviceDescriptor(&m_SubDeviceDescriptor, 2, InterfaceGuids, 0, NULL, 2, TopologyPropertySet, 0, 0, 0, NULL, 0, NULL, m_pDescriptor); DPRINT("IPortTopology_fnInit success\n"); if (NT_SUCCESS(Status)) { // store for node property requests m_SubDeviceDescriptor->UnknownMiniport = UnknownMiniport; } return STATUS_SUCCESS; }
NTSTATUS NTAPI CPortDMus::Init( IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp, IN PUNKNOWN UnknownMiniport, IN PUNKNOWN UnknownAdapter OPTIONAL, IN PRESOURCELIST ResourceList) { IMiniportDMus * Miniport = NULL; IMiniportMidi * MidiMiniport = NULL; NTSTATUS Status; PSERVICEGROUP ServiceGroup = NULL; PPINCOUNT PinCount; PPOWERNOTIFY PowerNotify; PC_ASSERT_IRQL_EQUAL(PASSIVE_LEVEL); if (m_bInitialized) { DPRINT("IPortDMus_Init called again\n"); return STATUS_SUCCESS; } Status = UnknownMiniport->QueryInterface(IID_IMiniportDMus, (PVOID*)&Miniport); if (!NT_SUCCESS(Status)) { // check for legacy interface Status = UnknownMiniport->QueryInterface(IID_IMiniportMidi, (PVOID*)&MidiMiniport); if (!NT_SUCCESS(Status)) { DPRINT("IPortDMus_Init called with invalid IMiniport adapter\n"); return STATUS_INVALID_PARAMETER; } } // Initialize port object m_pMiniport = Miniport; m_pMiniportMidi = MidiMiniport; m_pDeviceObject = DeviceObject; m_bInitialized = TRUE; if (Miniport) { // initialize IMiniportDMus Status = Miniport->Init(UnknownAdapter, ResourceList, this, &ServiceGroup); if (!NT_SUCCESS(Status)) { DPRINT("IMiniportDMus_Init failed with %x\n", Status); m_bInitialized = FALSE; return Status; } // get the miniport device descriptor Status = Miniport->GetDescription(&m_pDescriptor); if (!NT_SUCCESS(Status)) { DPRINT("failed to get description\n"); Miniport->Release(); m_bInitialized = FALSE; return Status; } // increment reference on miniport adapter Miniport->AddRef(); } else { // initialize IMiniportMidi Status = MidiMiniport->Init(UnknownAdapter, ResourceList, (IPortMidi*)this, &ServiceGroup); if (!NT_SUCCESS(Status)) { DPRINT("IMiniportMidi_Init failed with %x\n", Status); m_bInitialized = FALSE; return Status; } // get the miniport device descriptor Status = MidiMiniport->GetDescription(&m_pDescriptor); if (!NT_SUCCESS(Status)) { DPRINT("failed to get description\n"); MidiMiniport->Release(); m_bInitialized = FALSE; return Status; } // increment reference on miniport adapter MidiMiniport->AddRef(); } // create the subdevice descriptor Status = PcCreateSubdeviceDescriptor(&m_SubDeviceDescriptor, 3, InterfaceGuids, 0, NULL, 2, PortDMusPropertySet, 0, 0, 0, NULL, 0, NULL, m_pDescriptor); if (!NT_SUCCESS(Status)) { DPRINT("Failed to create descriptor\n"); if (Miniport) Miniport->Release(); else MidiMiniport->Release(); m_bInitialized = FALSE; return Status; } if (m_ServiceGroup == NULL && ServiceGroup) { // register service group m_ServiceGroup = ServiceGroup; } // check if it supports IPinCount interface Status = UnknownMiniport->QueryInterface(IID_IPinCount, (PVOID*)&PinCount); if (NT_SUCCESS(Status)) { // store IPinCount interface m_pPinCount = PinCount; } // does the Miniport adapter support IPowerNotify interface*/ Status = UnknownMiniport->QueryInterface(IID_IPowerNotify, (PVOID*)&PowerNotify); if (NT_SUCCESS(Status)) { // store reference m_pPowerNotify = PowerNotify; } return STATUS_SUCCESS; }
NTSTATUS NTAPI CPortWaveCyclic::Init( IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp, IN PUNKNOWN UnknownMiniport, IN PUNKNOWN UnknownAdapter OPTIONAL, IN PRESOURCELIST ResourceList) { IMiniportWaveCyclic * Miniport; NTSTATUS Status; PPINCOUNT PinCount; PPOWERNOTIFY PowerNotify; DPRINT("IPortWaveCyclic_Init entered %p\n", this); PC_ASSERT_IRQL_EQUAL(PASSIVE_LEVEL); Status = UnknownMiniport->QueryInterface(IID_IMiniportWaveCyclic, (PVOID*)&Miniport); if (!NT_SUCCESS(Status)) { DPRINT("IPortWaveCyclic_Init called with invalid IMiniport adapter\n"); return STATUS_INVALID_PARAMETER; } // Initialize port object m_pMiniport = Miniport; m_pDeviceObject = DeviceObject; // initialize miniport Status = Miniport->Init(UnknownAdapter, ResourceList, this); if (!NT_SUCCESS(Status)) { DPRINT("IMiniportWaveCyclic_Init failed with %x\n", Status); Miniport->Release(); return Status; } // get the miniport device descriptor Status = Miniport->GetDescription(&m_pDescriptor); if (!NT_SUCCESS(Status)) { DPRINT("failed to get description\n"); Miniport->Release(); return Status; } // create the subdevice descriptor Status = PcCreateSubdeviceDescriptor(&m_SubDeviceDescriptor, 4, InterfaceGuids, 0, NULL, 2, WaveCyclicPropertySet, 0, 0, 0, NULL, 0, NULL, m_pDescriptor); if (!NT_SUCCESS(Status)) { DPRINT("PcCreateSubdeviceDescriptor failed with %x\n", Status); Miniport->Release(); return Status; } // store for node property requests m_SubDeviceDescriptor->UnknownMiniport = UnknownMiniport; // check if it supports IPinCount interface Status = UnknownMiniport->QueryInterface(IID_IPinCount, (PVOID*)&PinCount); if (NT_SUCCESS(Status)) { // store IPinCount interface m_pPinCount = PinCount; } // does the Miniport adapter support IPowerNotify interface*/ Status = UnknownMiniport->QueryInterface(IID_IPowerNotify, (PVOID*)&PowerNotify); if (NT_SUCCESS(Status)) { // store reference m_pPowerNotify = PowerNotify; } DPRINT("IPortWaveCyclic successfully initialized\n"); return STATUS_SUCCESS; }