📄 wdmxbar.cpp
字号:
//==========================================================================;
//
// WDMXBar.CPP
// WDM Audio/Video CrossBar MiniDriver.
// AIW Hardware platform.
// CWDMAVXBar class implementation.
// Copyright (c) 1996 - 1997 ATI Technologies Inc. All Rights Reserved.
//
//==========================================================================;
extern "C"
{
#include "strmini.h"
#include "ksmedia.h"
#include "wdmdebug.h"
}
#include "atixbar.h"
#include "wdmdrv.h"
#include "aticonfg.h"
/*^^*
* AdapterCompleteInitialization()
* Purpose : Called when SRB_COMPLETE_INITIALIZATION SRB is received.
*
* Inputs : PHW_STREAM_REQUEST_BLOCK pSrb : pointer to the current Srb
*
* Outputs : BOOL : returns TRUE
* Author : IKLEBANOV
*^^*/
NTSTATUS CWDMAVXBar::AdapterCompleteInitialization( PHW_STREAM_REQUEST_BLOCK pSrb)
{
PADAPTER_DATA_EXTENSION pPrivateData = ( PADAPTER_DATA_EXTENSION)( pSrb->HwDeviceExtension);
NTSTATUS ntStatus;
ULONG nPinsNumber;
nPinsNumber = m_nNumberOfVideoInputs + m_nNumberOfAudioInputs +
m_nNumberOfVideoOutputs + m_nNumberOfAudioOutputs;
ENSURE
{
ntStatus = StreamClassRegisterFilterWithNoKSPins( \
pPrivateData->PhysicalDeviceObject, // IN PDEVICE_OBJECT DeviceObject,
&KSCATEGORY_CROSSBAR, // IN GUID * InterfaceClassGUID
nPinsNumber, // IN ULONG PinCount,
m_pXBarPinsDirectionInfo, // IN ULONG * Flags,
m_pXBarPinsMediumInfo, // IN KSPIN_MEDIUM * MediumList,
NULL); // IN GUID * CategoryList
if( !NT_SUCCESS( ntStatus))
FAIL;
OutputDebugTrace(( "CWDMAVXBar:AdapterCompleteInitialization() exit\n"));
} END_ENSURE;
if( !NT_SUCCESS( ntStatus))
OutputDebugError(( "CWDMAVXBar:AdapterCompleteInitialization() ntStatus=%x\n", ntStatus));
return( ntStatus);
}
/*^^*
* AdapterUnInitialize()
* Purpose : Called when SRB_UNINITIALIZE_DEVICE SRB is received.
*
* Inputs : PHW_STREAM_REQUEST_BLOCK pSrb : pointer to the current Srb
*
* Outputs : BOOL : returns TRUE
* Author : IKLEBANOV
*^^*/
BOOL CWDMAVXBar::AdapterUnInitialize( PHW_STREAM_REQUEST_BLOCK pSrb)
{
OutputDebugTrace(( "CWDMAVXBar:AdapterUnInitialize()\n"));
if( m_pXBarInputPinsInfo != NULL)
{
::ExFreePool( m_pXBarInputPinsInfo);
m_pXBarInputPinsInfo = NULL;
}
if( m_pXBarPinsMediumInfo != NULL)
{
::ExFreePool( m_pXBarPinsMediumInfo);
m_pXBarPinsMediumInfo = NULL;
}
if( m_pXBarPinsDirectionInfo != NULL)
{
::ExFreePool( m_pXBarPinsDirectionInfo);
m_pXBarPinsDirectionInfo = NULL;
}
pSrb->Status = STATUS_SUCCESS;
return( TRUE);
}
/*^^*
* AdapterGetStreamInfo()
* Purpose : Calles during StreamClass initialization procedure to get the information
* about data streams exposed by the MiniDriver
*
* Inputs : PHW_STREAM_REQUEST_BLOCK pSrb : pointer to the current Srb
*
* Outputs : BOOL : returns TRUE
* Author : IKLEBANOV
*^^*/
BOOL CWDMAVXBar::AdapterGetStreamInfo( PHW_STREAM_REQUEST_BLOCK pSrb)
{
// pick up the pointer to the stream header data structure
PHW_STREAM_HEADER pStreamHeader = ( PHW_STREAM_HEADER) \
&( pSrb->CommandData.StreamBuffer->StreamHeader);
// pick up the pointer to the stream information data structure
PHW_STREAM_INFORMATION pStreamInfo = ( PHW_STREAM_INFORMATION) \
&( pSrb->CommandData.StreamBuffer->StreamInfo);
// no streams are supported
DEBUG_ASSERT( pSrb->NumberOfBytesToTransfer >= sizeof( HW_STREAM_HEADER));
OutputDebugTrace(( "CWDMAVXBar:AdapterGetStreamInfo()\n"));
m_wdmAVXBarStreamHeader.NumberOfStreams = 0;
m_wdmAVXBarStreamHeader.SizeOfHwStreamInformation = sizeof( HW_STREAM_INFORMATION);
m_wdmAVXBarStreamHeader.NumDevPropArrayEntries = KSPROPERTIES_AVXBAR_NUMBER_SET;
m_wdmAVXBarStreamHeader.DevicePropertiesArray = m_wdmAVXBarPropertySet;
m_wdmAVXBarStreamHeader.NumDevEventArrayEntries = 0;
m_wdmAVXBarStreamHeader.DeviceEventsArray = NULL;
m_wdmAVXBarStreamHeader.Topology = &m_wdmAVXBarTopology;
* pStreamHeader = m_wdmAVXBarStreamHeader;
pSrb->Status = STATUS_SUCCESS;
return( TRUE);
}
/*^^*
* AdapterQueryUnload()
* Purpose : Called when the class driver is about to unload the MiniDriver
* The MiniDriver checks if any open stream left.
*
* Inputs : PHW_STREAM_REQUEST_BLOCK pSrb : pointer to the current Srb
*
* Outputs : BOOL : returns TRUE
* Author : IKLEBANOV
*^^*/
BOOL CWDMAVXBar::AdapterQueryUnload( PHW_STREAM_REQUEST_BLOCK pSrb)
{
OutputDebugTrace(( "CWDMAVXBar:AdapterQueryUnload()\n"));
pSrb->Status = STATUS_SUCCESS;
return( TRUE);
}
/*^^*
* operator new
* Purpose : CWDMAVXBar class overloaded operator new.
* Provides placement for a CWDMAVXBar class object from the PADAPTER_DEVICE_EXTENSION
* allocated by the StreamClassDriver for the MiniDriver.
*
* Inputs : UINT size_t : size of the object to be placed
* PVOID pAllocation : casted pointer to the CWDMAVXBar allocated data
*
* Outputs : PVOID : pointer of the CWDMAVXBar class object
* Author : IKLEBANOV
*^^*/
PVOID CWDMAVXBar::operator new( size_t size_t, PVOID pAllocation)
{
if( size_t != sizeof( CWDMAVXBar))
{
OutputDebugTrace(( "CWDMAVXBar: operator new() fails\n"));
return( NULL);
}
else
return( pAllocation);
}
/*^^*
* ~CWDMAVXBar()
* Purpose : CWDMAVXBar class destructor.
* Frees the allocated memory.
*
* Inputs : none
*
* Outputs : none
* Author : IKLEBANOV
*^^*/
CWDMAVXBar::~CWDMAVXBar()
{
OutputDebugTrace(( "CWDMAVXBar:~CWDMAVXBar() m_pXBarPinsInfo = %x\n", m_pXBarInputPinsInfo));
if( m_pXBarInputPinsInfo != NULL)
{
::ExFreePool( m_pXBarInputPinsInfo);
m_pXBarInputPinsInfo = NULL;
}
if( m_pXBarPinsMediumInfo != NULL)
{
::ExFreePool( m_pXBarPinsMediumInfo);
m_pXBarPinsMediumInfo = NULL;
}
if( m_pXBarPinsDirectionInfo != NULL)
{
::ExFreePool( m_pXBarPinsDirectionInfo);
m_pXBarPinsDirectionInfo = NULL;
}
}
/*^^*
* CWDMAVXBar()
* Purpose : CWDMAVXBar class constructor.
* Performs checking of the hardware presence. Sets the hardware in an initial state.
*
* Inputs : CI2CScript * pCScript : pointer to the I2CScript class object
* PUINT puiError : pointer to return a completion error code
*
* Outputs : none
* Author : IKLEBANOV
*^^*/
CWDMAVXBar::CWDMAVXBar( PDEVICE_OBJECT pDeviceObject, CI2CScript * pCScript, PUINT puiErrorCode)
:m_CATIConfiguration( pDeviceObject, pCScript, puiErrorCode)
{
UINT uiError;
ULONG ulInstance;
HANDLE hFolder = NULL;
OutputDebugTrace(( "CWDMAVXBar:CWDMAVXBar() enter\n"));
m_pXBarInputPinsInfo = m_pXBarOutputPinsInfo = NULL;
m_pXBarPinsMediumInfo = NULL;
m_pXBarPinsDirectionInfo = NULL;
m_ulPowerState = PowerDeviceD0;
// error code was caried over from ATIConfiguration class constructor
uiError = * puiErrorCode;
ENSURE
{
ULONG ulNumberOfPins, nPinIndex;
UINT uiTunerId, nIndex;
UCHAR uchTunerAddress;
KSPIN_MEDIUM mediumKSPin;
const KSPIN_MEDIUM * pMediumKSPin;
if( uiError != WDMMINI_NOERROR)
FAIL;
if( pCScript == NULL)
{
uiError = WDMMINI_INVALIDPARAM;
FAIL;
}
// first, find out whether any tuner type is installed. If not, we have only 2 video sources.
m_CATIConfiguration.GetTunerConfiguration( &uiTunerId, &uchTunerAddress);
m_nNumberOfVideoInputs = ( uchTunerAddress) ? 3 : 2;
m_nNumberOfVideoOutputs = m_nNumberOfVideoInputs;
m_CATIConfiguration.GetAudioProperties( &m_nNumberOfAudioInputs, &m_nNumberOfAudioOutputs);
if( !uchTunerAddress)
// if there is no tuner - no TVAudio input
m_nNumberOfAudioInputs --;
ulNumberOfPins = m_nNumberOfAudioInputs + m_nNumberOfVideoInputs + m_nNumberOfVideoOutputs + m_nNumberOfAudioOutputs;
m_pXBarInputPinsInfo = ( PXBAR_PIN_INFORMATION) \
::ExAllocatePool( NonPagedPool, sizeof( XBAR_PIN_INFORMATION) * ulNumberOfPins);
if( m_pXBarInputPinsInfo == NULL)
{
uiError = WDMMINI_ERROR_MEMORYALLOCATION;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -