显示驱动教程(4)

类别:编程语言 点击:0 评论:0 推荐:

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()

本文地址:http://com.8s8s.com/it/it28067.htm