WDDM显卡驱动
+ -

WDDM 停止、复位、移除设备及驱动卸载

2021-06-30 316 0

说完了驱动的创建与启动,这里顺使说一下设备的停止、复位、卸载设备

设备的停止/BddDdiStopDevice

设备停止的回调函数为BddDdiStopDevice

    InitialData.DxgkDdiStopDevice                   = BddDdiStopDevice;

其代码比较简单,直接将是系统的停止请求转发给我的创建的类实例停止函数StopDevice

NTSTATUS
BddDdiStopDevice(
    _In_  VOID* pDeviceContext)
{
    PAGED_CODE();
    BDD_ASSERT_CHK(pDeviceContext != NULL);

    BASIC_DISPLAY_DRIVER* pBDD = reinterpret_cast<BASIC_DISPLAY_DRIVER*>(pDeviceContext);
    return pBDD->StopDevice();
}

在BddDdiStopDevice函数中,主要内容是清除掉在设备映射的物理地址和相关的标志

NTSTATUS BASIC_DISPLAY_DRIVER::StopDevice(VOID)
{
    PAGED_CODE();

    CleanUp();

    m_Flags.DriverStarted = FALSE;

    return STATUS_SUCCESS;
}

在CleanUp函数中,将所有视频源(这里为1个)umap物理内存与线性地址映射和置相关的标志。

VOID BASIC_DISPLAY_DRIVER::CleanUp()
{
    PAGED_CODE();

    for (UINT Source = 0; Source < MAX_VIEWS; ++Source)
    {
        if (m_CurrentModes[Source].FrameBuffer.Ptr)
        {
            UnmapFrameBuffer(m_CurrentModes[Source].FrameBuffer.Ptr, m_CurrentModes[Source].DispInfo.Height * m_CurrentModes[Source].DispInfo.Pitch);
            m_CurrentModes[Source].FrameBuffer.Ptr = NULL;
            m_CurrentModes[Source].Flags.FrameBufferIsActive = FALSE;
        }
    }
}

设备的复位/BddDdiResetDevice

设备复位回调函数BddDdiResetDevice,这里没有与上下文相关的操作,所以不做任何处理

    InitialData.DxgkDdiResetDevice                  = BddDdiResetDevice;
VOID
BddDdiResetDevice(
    _In_  VOID* pDeviceContext)
{
    BDD_ASSERT_CHK(pDeviceContext != NULL);

    BASIC_DISPLAY_DRIVER* pBDD = reinterpret_cast<BASIC_DISPLAY_DRIVER*>(pDeviceContext);
    pBDD->ResetDevice();
}

如是我们有需要进行相关数据的复位,可以在这里实现相关代码

 VOID BASIC_DISPLAY_DRIVER::ResetDevice(VOID)
{
}

设备的移除/BddDdiRemoveDevice

设备移除的回调函数为BddDdiRemoveDevice

InitialData.DxgkDdiRemoveDevice                 = BddDdiRemoveDevice;

功能比较简单,既然要卸载了,当前的类实例就应该delete了

NTSTATUS
BddDdiRemoveDevice(
    _In_  VOID* pDeviceContext)
{
    PAGED_CODE();

    BASIC_DISPLAY_DRIVER* pBDD = reinterpret_cast<BASIC_DISPLAY_DRIVER*>(pDeviceContext);

    if (pBDD)
    {
        delete pBDD;
        pBDD = NULL;
    }

    return STATUS_SUCCESS;
}

注意,这里的delete和new一样,是重载的。

驱动的卸载/BddDdiUnload

驱动的卸载这里我们并没有在DriverEntry创建相关的全局资源,所以为空函数。

VOID
BddDdiUnload(VOID)
{
    PAGED_CODE();
}

0 篇笔记 写笔记

WDDM 适配器复位和资源的释放
通过获取的适配器信息将SupportNonVGA置为TRUE,表示支持使用DxgkDdiStopDeviceAndReleasePostDisplayOwnership函数重置显示设备并释放当前开机自检(POST)设备的所有权。 InitialData.DxgkDdiStopDeviceAn......
WDDM 停止、复位、移除设备及驱动卸载
说完了驱动的创建与启动,这里顺使说一下设备的停止、复位、卸载设备设备的停止/BddDdiStopDevice设备停止的回调函数为BddDdiStopDevice InitialData.DxgkDdiStopDevice = BddDdiStopDevi......
作者信息
我爱内核
Windows驱动开发,网站开发
好好学习,天天向上。
取消
感谢您的支持,我会继续努力的!
扫码支持
扫码打赏,你说多少就多少

打开支付宝扫一扫,即可进行扫码打赏哦

您的支持,是我们前进的动力!