WDDM 停止、复位、移除设备及驱动卸载
2021-06-30
439
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();
}