上一篇讲到, 受实际环境的限制, 没能够将这个KMDOD SAMPLE在系统中尝试运行.
先把这个问题放在一边, 到申请到了WDDM 1.2框架的Win8系统, 再回过头来进行实际运行.
但从MSND中看, Win8应该是WDDM1.2, WIN7是WDDM1.1, 可为什么我这个Win8 pro build 9200 显示的是WDDM 1.1? 难道是因为这个版本是免费的原因吗?
另外, 驱动安装不成功, 是由于WDDM 1.1的原因吗?
还是先看看这个例子代码, 到底要给大家一个什么样的例子?
先从简单的开始,
(一)
Bbd_ddi.cpp
写过miniport驱动的工程师都知道, 系统已经帮你设计,定义好了相应的数据结构, miniport驱动所要做的工作, 就是将该与系统(PORT DRIVER)交互的数据结构根据实际情况实现, 并将函数指针填到相应的结构成员中.
http://msdn.microsoft.com/zh-cn/library/jj673962(v=vs.85).aspx
由于是KMDOD驱动,所以,这里在DriverEntry中使用的初始化函数是:
DxgkInitializeDisplayOnlyDriver
相应的数据结构为:
KMDDOD_INITIALIZATION_DATA
大家可以看到,这些字样中都带有display only.
其实, DxgkInitialize 与 DxgkInitializeDisplayOnlyDriver的作用是相同的, 都是loads and initializes the DirectX graphics kernel subsystem (Dxgkrnl.sys).
DxgkDdiPresentDisplayOnly是针对于KMDOD的一个显示函数.
在这些函数中, 无论是pAdapter, 还是pDeviceContext, 都是在BddDdiAddDevice中, 将
BASIC_DISPLAY_DRIVER类的实例指针, 附给的指针变量, ppDeviceContext.
对AVSTREAM/BDA驱动熟悉的人应该知道这个规则, context中存放设备类实例的指针, 达到了驱动支持多实例的目的.
其它的内容, 不多述, 毕竟, 这个文件, 只是重定向了具体的函数执行体, 所有的函数最终,都是由BASIC_DISPLAY_DRIVER类的成员函数实现的.
(二)
Memory.cpp
这个文件, 重载了运算符new, delete.
微软的好多例子中, 使用了这样的方法, 好处在于, 省去了每次调用, ExAllocatePoolWithTag, 同时还要设置内存类型, 标签名字, 对像大小等参数.
这里的大小, 由new自动根据对象类型计算得出.
该文件同时支持了数组的实例分配化与内存回收.
(三)
Bdd_util.cpp
这个文件也非常简单,
1. 对EDID的头与校验和的验证.
2. 包含了系统函数MmMapIoSpace, MmUnmapIoSpace的内存映射功能函数, MapFrameBuffer与UnmapFrameBuffer.
无非就是将物理内存映射到内核系统空间, 以便CPU通过这个内核空间的虚拟地址来操作内存.
(四)
BltFuncs.cpp
主要涉及到图像数据copy方面的函数, 即使不了解KMDOD的工程师,也能看明白其中的内容.
未完, 待续.