⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 wdmxbar.cpp

📁 ATI显卡Windows驱动
💻 CPP
📖 第 1 页 / 共 2 页
字号:
//==========================================================================;
//
//	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 + -