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

📄 wdmxbar.cpp

📁 传说中的 视频抓取驱动源码 啊啊啊啊啊啊啊啊啊啊啊啊啊
💻 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( PPORT_CONFIGURATION_INFORMATION pConfigInfo, CI2CScript * pCScript, PUINT puiErrorCode)
    :m_CATIConfiguration( pConfigInfo, 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 + -