📄 adapter.cpp
字号:
// Initialize the object
ntStatus = pAdapterCommon->Init (ResourceList, DeviceObject);
if (NT_SUCCESS (ntStatus))
{
// register with PortCls for power-management services
ntStatus = PcRegisterAdapterPowerManagement ((PUNKNOWN)pAdapterCommon,
DeviceObject);
}
}
// release the IID_IAdapterCommon on adapter common
pUnknownCommon->Release ();
}
// print error message.
if (!NT_SUCCESS (ntStatus))
{
DOUT (DBG_ERROR, ("Could not create or query AdapterCommon."));
}
//
// These are the port driver pointers we are keeping around for registering
// physical connections.
//
PMINIPORT miniWave = NULL;
PMINIPORT miniTopology = NULL;
PUNKNOWN unknownWave = NULL;
PUNKNOWN unknownTopology = NULL;
PMINIPORTTOPOLOGYICH pMiniportTopologyICH = NULL;
//
// Start the topology miniport.
//
if (NT_SUCCESS (ntStatus))
{
ntStatus = InstallSubdevice (DeviceObject,
Irp,
L"Topology",
CLSID_PortTopology,
CLSID_PortTopology, // not used
CreateMiniportTopologyICH,
pAdapterCommon,
NULL,
GUID_NULL,
&miniTopology,
&unknownTopology);
if (NT_SUCCESS (ntStatus))
{
// query for the IMiniportTopologyICH interface
ntStatus = miniTopology->QueryInterface (IID_IMiniportTopologyICH,
(PVOID *)&pMiniportTopologyICH);
miniTopology->Release ();
miniTopology = NULL;
}
// print error message.
if (!NT_SUCCESS (ntStatus))
{
DOUT (DBG_ERROR, ("Could not create or query TopologyICH"));
}
}
//
// Start the wave miniport.
//
if (NT_SUCCESS (ntStatus))
{
ntStatus = InstallSubdevice (DeviceObject,
Irp,
L"Wave",
CLSID_PortWavePci,
CLSID_PortWavePci, // not used
CreateMiniportWaveICH,
pAdapterCommon,
ResourceList,
IID_IPortWavePci,
NULL,
&unknownWave);
// print error message.
if (!NT_SUCCESS (ntStatus))
{
DOUT (DBG_ERROR, ("WavePCI miniport installation failed!"));
}
}
//
// Establish physical connections between filters as shown.
//
// +------+ +------+
// | Wave | | Topo |
// Capture <---|2 3|<===|x |<--- CD
// | | | |
// Render --->|0 1|===>|y |<--- Line In
// | | | |
// Mic <---|4 5|<===|z |<--- Mic
// +------+ | |
// | |---> Line Out
// +------+
//
// Note that the pin numbers for the nodes to be connected
// vary depending on the hardware/codec configuration.
// Also, the mic input may or may not be present.
//
// So,
// Do a QI on unknownTopology to get an interface to call
// a method on to get the topology miniport pin IDs.
if (NT_SUCCESS (ntStatus))
{
ULONG ulWaveOut, ulWaveIn, ulMicIn;
// get the pin numbers.
DOUT (DBG_PRINT, ("Connecting topo and wave."));
ntStatus = pMiniportTopologyICH->GetPhysicalConnectionPins (&ulWaveOut,
&ulWaveIn, &ulMicIn);
// register wave render connection
if (NT_SUCCESS (ntStatus))
{
ntStatus = PcRegisterPhysicalConnection (DeviceObject,
unknownWave,
PIN_WAVEOUT_BRIDGE,
unknownTopology,
ulWaveOut);
// print error message.
if (!NT_SUCCESS (ntStatus))
{
DOUT (DBG_ERROR, ("Cannot connect topology and wave miniport"
" (render)!"));
}
}
if (NT_SUCCESS (ntStatus))
{
// register wave capture connection
ntStatus = PcRegisterPhysicalConnection (DeviceObject,
unknownTopology,
ulWaveIn,
unknownWave,
PIN_WAVEIN_BRIDGE);
// print error message.
if (!NT_SUCCESS (ntStatus))
{
DOUT (DBG_ERROR, ("Cannot connect topology and wave miniport"
" (capture)!"));
}
}
if (NT_SUCCESS (ntStatus))
{
// register mic capture connection
if (pAdapterCommon->GetPinConfig (PINC_MICIN_PRESENT))
{
ntStatus = PcRegisterPhysicalConnection (DeviceObject,
unknownTopology,
ulMicIn,
unknownWave,
PIN_MICIN_BRIDGE);
// print error message.
if (!NT_SUCCESS (ntStatus))
{
DOUT (DBG_ERROR, ("Cannot connect topology and wave miniport"
" (MIC)!"));
}
}
}
}
//
// Release the adapter common object. It either has other references,
// or we need to delete it anyway.
//
if (pAdapterCommon)
pAdapterCommon->Release ();
//
// Release the unknowns.
//
if (unknownTopology)
unknownTopology->Release ();
if (unknownWave)
unknownWave->Release ();
// and the ICH miniport.
if (pMiniportTopologyICH)
pMiniportTopologyICH->Release ();
return ntStatus; // whatever this is ...
}
/*****************************************************************************
* AddDevice
*****************************************************************************
* This function is called by the operating system when the device is added.
* All adapter drivers can use this code without change.
*/
extern "C" NTSTATUS AddDevice
(
IN PDRIVER_OBJECT DriverObject,
IN PDEVICE_OBJECT PhysicalDeviceObject
)
{
PAGED_CODE ();
DOUT (DBG_PRINT, ("[AddDevice]"));
//
// Tell portcls (the class driver) to add the device.
//
return PcAddAdapterDevice (DriverObject,
PhysicalDeviceObject,
(PCPFNSTARTDEVICE)StartDevice,
MAX_MINIPORTS,
0);
}
/*****************************************************************************
* DriverEntry
*****************************************************************************
* This function is called by the operating system when the driver is loaded.
* All adapter drivers can use this code without change.
*/
extern "C" NTSTATUS DriverEntry
(
IN PDRIVER_OBJECT DriverObject,
IN PUNICODE_STRING RegistryPathName
)
{
PAGED_CODE ();
DOUT (DBG_PRINT, ("[DriverEntry]"));
//
// Tell the class driver to initialize the driver.
//
NTSTATUS RetValue = PcInitializeAdapterDriver (DriverObject,
RegistryPathName,
AddDevice);
return RetValue;
}
#pragma code_seg()
/*****************************************************************************
* _purecall()
*****************************************************************************
* The C++ compiler loves me.
*/
int __cdecl _purecall (void)
{
ASSERT (!"Pure virtual function called");
return 0;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -