📄 mmconfig.cpp
字号:
//==========================================================================;
//
// MMCONFIG.CPP
// CATIMultimediaTable Class implementation.
// Copyright (c) 1996 - 1998 ATI Technologies Inc. All Rights Reserved.
//
// $Date: 23 Jun 1999 11:58:20 $
// $Revision: 1.8 $
// $Author: pleung $
//
//==========================================================================;
extern"C"
{
#include "conio.h"
#include "strmini.h"
#include "wdmdebug.h"
}
#include "wdmdrv.h"
#include "i2cgpio.h"
#include "initguid.h"
#include "mmconfig.h"
#include "atiguids.h"
#include "aticonfg.h"
/*^^*
* operator new
* Purpose : called, before the class constructor, when the class object is created
* by invoking the operator new
*
* Inputs : UINT size_t : size of the object to be placed
*
* Outputs : none
* Author : IKLEBANOV
*^^*/
PVOID CATIMultimediaTable::operator new( size_t stSize)
{
PVOID pvAllocation = NULL;
ENSURE
{
if( stSize != sizeof( CATIMultimediaTable))
FAIL;
pvAllocation = ::ExAllocatePool( PagedPool, stSize);
} END_ENSURE;
return( pvAllocation);
}
/*^^*
* operator delete
* Purpose : called, after the class destructor, when the class object is killed
* by invoking the operator delete
*
* Inputs : PVOID pvAllocation : memory assisiated with the class object
*
* Outputs : none
* Author : IKLEBANOV
*^^*/
void CATIMultimediaTable::operator delete( PVOID pvAllocation)
{
if( pvAllocation != NULL)
::ExFreePool( pvAllocation);
}
/*^^*
* CATIMultimediaTable()
* Purpose : CATIMultimediaTable Class constructor
*
* Inputs : PDEVICE_OBJECT pDeviceObject : pointer to the creator DeviceObject
* GPIOINTERFACE * pGPIOInterface : pointer to GPIO Interface
* PBOOL pbResult : pointer to return success indicator
*
* Outputs : none
* Author : IKLEBANOV
*^^*/
CATIMultimediaTable::CATIMultimediaTable( PDEVICE_OBJECT pDeviceObject,
GPIOINTERFACE * pGPIOInterface,
PBOOL pbResult)
{
GPIOControl gpioAccessBlock;
ATI_QueryPrivateInterface pfnQueryInterface;
BOOL bResult = FALSE;
m_ulRevision = ( DWORD)-1;
m_ulSize = 0;
m_pvConfigurationData = NULL;
// Let's get MultiMedia data using private interfaces exposed by MiniVDD via
// the standard Microsoft-defined GPIO interface
ENSURE
{
if( !QueryGPIOProvider( pDeviceObject, pGPIOInterface, &gpioAccessBlock))
FAIL;
if( !::IsEqualGUID( ( const struct _GUID &)gpioAccessBlock.PrivateInterfaceType,
( const struct _GUID &)GUID_ATI_PRIVATE_INTERFACES_QueryInterface))
FAIL;
pfnQueryInterface = ( ATI_QueryPrivateInterface)gpioAccessBlock.PrivateInterface;
if( pfnQueryInterface == NULL)
FAIL;
if( !GetMultimediaInfo_IConfiguration2( pDeviceObject,
pfnQueryInterface))
{
OutputDebugError(( "CATIMultimediaTable constructor fails to access IConfiguration2 for pDO = %x\n",
pDeviceObject));
if( !GetMultimediaInfo_IConfiguration1( pDeviceObject,
pfnQueryInterface))
{
OutputDebugError(( "CATIMultimediaTable constructor fails to access IConfiguration1 for pDO = %x\n",
pDeviceObject));
if( !GetMultimediaInfo_IConfiguration( pDeviceObject,
pfnQueryInterface))
{
OutputDebugError(( "CATIMultimediaTable constructor fails to access IConfiguration for pDO = %x\n",
pDeviceObject));
FAIL;
}
}
}
bResult = TRUE;
} END_ENSURE;
* pbResult = bResult;
}
/*^^*
* CATIMultimediaTable()
* Purpose : CATIMultimediaTable Class destructor
*
* Inputs : none
*
* Outputs : none
* Author : IKLEBANOV
*^^*/
CATIMultimediaTable::~CATIMultimediaTable()
{
if( m_pvConfigurationData != NULL)
{
::ExFreePool( m_pvConfigurationData);
m_pvConfigurationData = NULL;
}
m_ulSize = 0;
m_ulRevision = ( DWORD)-1;
}
/*^^*
* GetMultimediaInfo_IConfiguration2()
* Purpose : Get ATI Multimedia table, using IConfiguration2 interface
*
* Inputs : PDEVICE_OBJECT pDeviceObject : pointer to the creator DeviceObject
* ATI_QueryPrivateInterface pfnQueryInterface : pointer to Query interface function
*
* Outputs : BOOL, returns TRUE, if succeeded
* Author : IKLEBANOV
*^^*/
BOOL CATIMultimediaTable::GetMultimediaInfo_IConfiguration2( PDEVICE_OBJECT pDeviceObject,
ATI_QueryPrivateInterface pfnQueryInterface)
{
BOOL bResult = FALSE;
ATI_PRIVATE_INTERFACE_CONFIGURATION_Two iConfigurationTwo;
PATI_PRIVATE_INTERFACE_CONFIGURATION_Two pIConfigurationTwo = &iConfigurationTwo;
ENSURE
{
iConfigurationTwo.usSize = sizeof( ATI_PRIVATE_INTERFACE_CONFIGURATION_Two);
pfnQueryInterface( pDeviceObject,
( const struct _GUID &)GUID_ATI_PRIVATE_INTERFACES_Configuration_Two,
( PVOID *)&pIConfigurationTwo);
if(( pIConfigurationTwo == NULL) ||
( pIConfigurationTwo->pfnGetConfigurationRevision == NULL) ||
( pIConfigurationTwo->pfnGetConfigurationData == NULL))
FAIL;
//let's query GetConfigurationRevision Interface member first
if( !( NT_SUCCESS( pIConfigurationTwo->pfnGetConfigurationRevision( pIConfigurationTwo->pvContext,
ATI_BIOS_CONFIGURATIONTABLE_MULTIMEDIA,
&m_ulRevision))))
FAIL;
if( !( NT_SUCCESS( pIConfigurationTwo->pfnGetConfigurationData( pIConfigurationTwo->pvContext,
ATI_BIOS_CONFIGURATIONTABLE_MULTIMEDIA,
NULL,
&m_ulSize))))
FAIL;
m_pvConfigurationData = ( PUCHAR)::ExAllocatePool( PagedPool, m_ulSize);
if( m_pvConfigurationData == NULL)
FAIL;
if( !( NT_SUCCESS( pIConfigurationTwo->pfnGetConfigurationData( pIConfigurationTwo->pvContext,
ATI_BIOS_CONFIGURATIONTABLE_MULTIMEDIA,
m_pvConfigurationData,
&m_ulSize))))
FAIL;
bResult = TRUE;
} END_ENSURE;
return( bResult);
}
/*^^*
* GetMultimediaInfo_IConfiguration1()
* Purpose : Get ATI Multimedia table, using IConfiguration1 interface
*
* Inputs : PDEVICE_OBJECT pDeviceObject : pointer to the creator DeviceObject
* ATI_QueryPrivateInterface pfnQueryInterface : pointer to Query interface function
*
* Outputs : BOOL, returns TRUE, if succeeded
* Author : IKLEBANOV
*^^*/
BOOL CATIMultimediaTable::GetMultimediaInfo_IConfiguration1( PDEVICE_OBJECT pDeviceObject,
ATI_QueryPrivateInterface pfnQueryInterface)
{
BOOL bResult = FALSE;
ATI_PRIVATE_INTERFACE_CONFIGURATION_One iConfigurationOne;
PATI_PRIVATE_INTERFACE_CONFIGURATION_One pIConfigurationOne = &iConfigurationOne;
ENSURE
{
iConfigurationOne.usSize = sizeof( ATI_PRIVATE_INTERFACE_CONFIGURATION_One);
pfnQueryInterface( pDeviceObject,
( const struct _GUID &)GUID_ATI_PRIVATE_INTERFACES_Configuration_One,
( PVOID *)&pIConfigurationOne);
if(( pIConfigurationOne == NULL) ||
( pIConfigurationOne->pfnGetMultimediaConfiguration == NULL))
FAIL;
if( !( NT_SUCCESS( pIConfigurationOne->pfnGetMultimediaConfiguration( pIConfigurationOne->pvContext,
NULL,
&m_ulSize))))
FAIL;
if( m_ulSize != sizeof( ATI_MULTIMEDIAINFO))
FAIL;
m_pvConfigurationData = ( PUCHAR)::ExAllocatePool( PagedPool, m_ulSize);
if( m_pvConfigurationData == NULL)
FAIL;
if( !( NT_SUCCESS( pIConfigurationOne->pfnGetMultimediaConfiguration( pIConfigurationOne->pvContext,
m_pvConfigurationData,
&m_ulSize))))
FAIL;
m_ulRevision = 0;
bResult = TRUE;
} END_ENSURE;
return( bResult);
}
/*^^*
* GetMultimediaInfo_IConfiguration()
* Purpose : Get ATI Multimedia table, using IConfiguration interface
*
* Inputs : PDEVICE_OBJECT pDeviceObject : pointer to the creator DeviceObject
* ATI_QueryPrivateInterface pfnQueryInterface : pointer to Query interface function
*
* Outputs : BOOL, returns TRUE, if succeeded
* Author : IKLEBANOV
*^^*/
BOOL CATIMultimediaTable::GetMultimediaInfo_IConfiguration( PDEVICE_OBJECT pDeviceObject,
ATI_QueryPrivateInterface pfnQueryInterface)
{
BOOL bResult = FALSE;
PATI_PRIVATE_INTERFACE_CONFIGURATION pIConfiguration = NULL;
ENSURE
{
pfnQueryInterface( pDeviceObject,
( const struct _GUID &)GUID_ATI_PRIVATE_INTERFACES_Configuration,
( PVOID *)&pIConfiguration);
if(( pIConfiguration == NULL) ||
( pIConfiguration->pfnGetMultimediaConfiguration == NULL))
FAIL;
if( !( NT_SUCCESS( pIConfiguration->pfnGetMultimediaConfiguration( pDeviceObject,
NULL,
&m_ulSize))))
FAIL;
if( m_ulSize != sizeof( ATI_MULTIMEDIAINFO))
FAIL;
m_pvConfigurationData = ( PUCHAR)::ExAllocatePool( PagedPool, m_ulSize);
if( m_pvConfigurationData == NULL)
FAIL;
if( !( NT_SUCCESS( pIConfiguration->pfnGetMultimediaConfiguration( pDeviceObject,
m_pvConfigurationData,
&m_ulSize))))
FAIL;
m_ulRevision = 0;
bResult = TRUE;
} END_ENSURE;
return( bResult);
}
/*^^*
* GetTVTunerId()
* Purpose : Retrieves TVTuner Id from the Multimedia configuration table
*
* Inputs : PUSHORT pusTVTunerId : pointer to return TVTuner Id
*
* Outputs : BOOL, returns TRUE, if succeeded
* Author : IKLEBANOV
*^^*/
BOOL CATIMultimediaTable::GetTVTunerId( PUSHORT pusTVTunerId)
{
USHORT usValue;
BOOL bResult = TRUE;
if(( m_pvConfigurationData != NULL) && ( m_ulSize) && ( pusTVTunerId != NULL))
{
switch( m_ulRevision)
{
case 0:
usValue = ( USHORT)(( PATI_MULTIMEDIAINFO)m_pvConfigurationData)->MMInfo_Byte0;
break;
case 1:
usValue = ( USHORT)(((( PATI_MULTIMEDIAINFO1)m_pvConfigurationData)->MMInfo1_Byte0) & 0x1F);
break;
default:
bResult = FALSE;
break;
}
}
else
bResult = FALSE;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -