显示驱动教程(4)
来源:互联网 发布:影视自动发卡源码 编辑:程序博客网 时间:2024/06/05 05:00
DriverEntry
DriverEntry是miniport驱动的入口,每个miniport驱动程序都应该实现它。在DriverEntry中应该完成的任务如下:
l 定义一个VIDEO_HW_INITIALIZATION_DATA结构,并将其初始化。初始化的内容包括:miniport驱动程序的其他入口、设备扩展(Device Extension)的大小等等。
VIDEO_HW_INITIALIZATION_DATA hwInitData.
// Zero out structure.
VideoPortZeroMemory(
&hwInitData, sizeof(VIDEO_HW_INITIALIZATION_DATA));
// Specify sizes of structure and extension.
hwInitData.HwInitDataSize = sizeof(VIDEO_HW_INITIALIZATION_DATA);
// Set entry points.
hwInitData.HwFindAdapter = &VirtualFindAdapter;
hwInitData.HwInitialize = &VirtualInitialize;
hwInitData.HwStartIO = &VirtualStartIO;
hwInitData.HwGetPowerState = &VirtualGetPowerState;
hwInitData.HwSetPowerState = &VirtualSetPowerState;
hwInitData.HwLegacyResourceList = NULL;
hwInitData.HwLegacyResourceCount = 0;
// Set device extension size.
hwInitData.HwDeviceExtensionSize = sizeof(HW_DEVICE_EXTENSION);
// Virtual device's interface type is zero.
hwInitData.AdapterInterfaceType = 0;
l 调用VideoPortInitialize函数,将VIDEO_HW_INITIALIZATION_DATA结构的地址指针通知系统。
initializationStatus = VideoPortInitialize(Context1,
Context2,
&hwInitData,
NULL);
l 将VideoPortInitialize的返回值作为DriverEntry函数的返回值,返回调用者。
return initializationStatus;
代码说明:
虚拟显示驱动类似mirror驱动,所以我就在mirror的基础上作了相应的修改;这也是微软建议的实现方法:修改一个现存的显示驱动,减少开发时间。Mirror驱动的miniport实现十分简单,基本上所有函数的都是一个空函数。我对DriverEntry作的修改主要是:为自定义的设备扩展申请存储空间。
hwInitData.HwDeviceExtensionSize = sizeof(HW_DEVICE_EXTENSION);
HW_DEVICE_EXTENSION是我自己定义的一个结构,用于存放帧缓冲区的地址:
//
// Define device extension structure. This is device dependent/private
// information.
//
typedef struct _HW_DEVICE_EXTENSION
{
// Frame buffer
ULONG ulFrameBufferSize;
PVOID pFrameBufferAddr;
}HW_DEVICE_EXTENSION, *PHW_DEVICE_EXTENSION;
DriverEntry完整的代码如下:
ULONG
DriverEntry (
PVOID Context1,
PVOID Context2
)
{
VIDEO_HW_INITIALIZATION_DATA hwInitData;
ULONG initializationStatus;
VideoDebugPrint((0, "Virtualed Driver VideoPort [Driver Entry]/n"));
// Zero out structure.
VideoPortZeroMemory(&hwInitData, sizeof(VIDEO_HW_INITIALIZATION_DATA));
// Specify sizes of structure and extension.
hwInitData.HwInitDataSize = sizeof(VIDEO_HW_INITIALIZATION_DATA);
// Set entry points.
hwInitData.HwFindAdapter = &VirtualFindAdapter;
hwInitData.HwInitialize = &VirtualInitialize;
hwInitData.HwStartIO = &VirtualStartIO;
hwInitData.HwGetPowerState = &VirtualGetPowerState;
hwInitData.HwSetPowerState = &VirtualSetPowerState;
hwInitData.HwLegacyResourceList = NULL;
hwInitData.HwLegacyResourceCount = 0;
// Set device extension size.
hwInitData.HwDeviceExtensionSize = sizeof(HW_DEVICE_EXTENSION);
// Virtual device's interface type is zero.
hwInitData.AdapterInterfaceType = 0;
initializationStatus = VideoPortInitialize(Context1,
Context2,
&hwInitData,
NULL);
return initializationStatus;
} // end DriverEntry()
- 显示驱动教程(4)
- 显示驱动教程(1)
- 显示驱动教程(2)
- 显示驱动教程(3)
- WDF开发USB设备驱动教程(4)
- JDBC系列教程(二)---驱动设置
- JDBC系列教程(二)---驱动设置
- ajax实例驱动教程(转载+ 改编)
- JDBC系列教程(二)---驱动设置
- Linux LCD驱动(三)--图形显示
- Linux LCD驱动(三)--图形显示
- Linux LCD驱动(三)--图形显示
- linux LCD 驱动 (三) --- 图形显示
- Linux LCD驱动(三)--图形显示
- Linux LCD驱动(三)--图形显示
- Linux LCD驱动(三)--图形显示
- linux LCD驱动(三)--图形显示
- Linux LCD驱动(三)--图形显示
- Cherry 推出面向Linux用户的专用键盘
- MIME小知识
- COM与基于组件技术的开发和应用模式(一)
- perl在windows下的安装使用
- FreeBSD忘记root密码的一次修复
- 显示驱动教程(4)
- FLASH+JS做的全屏效果!
- 在.net中利用pop3收邮件
- FLASH网站常用预载特效剖析
- 平面文字设计原则及组合
- “简洁型loading制作”菜鸟终极教程(想看不懂都难)
- 最近看的几本书
- 对Swing线程的再思索 (上)
- 对Swing线程的再思索 (下)