@H_403_2@通过上面的学习,可以了解到GDI最终的输出都是通过小端口向显示硬件输出,以便在显示器上显示所需要显示的内容。那为什么需要有小端口驱动程序呢?其实这是为了方便所有显示卡制造厂家编写驱动程序,同时又可以让制造厂家保密他们的内部技术秘密。使用小端口的驱动程序,也可以统一显示驱动程序的接口,也就把显示驱动程序功能简化开发。下面来分析目录里reactos/drivers/video/miniport/vga的小端口显示驱动程序,它的入口函数如下: @H_403_2@#001 VP_STATUS NTAPI @H_403_2@#002 DriverEntry(IN PVOID Context1, @H_403_2@#003 IN PVOID Context2) @H_403_2@#004 { @H_403_2@#005 VIDEO_HW_INITIALIZATION_DATA InitData; @H_403_2@#006 @H_403_2@ @H_403_2@清空显示卡的硬件初始化结构。 @H_403_2@#007 VideoPortZeroMemory(&InitData,sizeof InitData); @H_403_2@#008 @H_403_2@ @H_403_2@设置结构的大小。 @H_403_2@#009 InitData.HwInitDataSize = sizeof(InitData); @H_403_2@#010 /* FIXME: Fill in InitData members */ @H_403_2@ @H_403_2@缺省开始的设备号为0。 @H_403_2@#011 InitData.StartingDeviceNumber = 0; @H_403_2@#012 @H_403_2@ @H_403_2@小端口驱动程序提供的功能函数。 @H_403_2@#013 /* Export driver entry points... */ @H_403_2@#014 InitData.HwFindAdapter = VGAFindAdapter; @H_403_2@#015 InitData.HwInitialize = VGAInitialize; @H_403_2@#016 InitData.HwStartIO = VGAStartIO; @H_403_2@#017 /* InitData.HwInterrupt = VGAInterrupt; */ @H_403_2@#018 InitData.HwResetHw = VGAResetHw; @H_403_2@#019 /* InitData.HwTimer = VGATimer; */ @H_403_2@#020 @H_403_2@ @H_403_2@调用基础显示驱动程序的初始化函数VideoPortInitialize,这个函数在文件reactos/drivers/video/videoprt/videoprt.c里。 @H_403_2@#021 return VideoPortInitialize(Context1,Context2,&InitData,NULL); @H_403_2@#022 } @H_403_2@ @H_403_2@显示驱动程序初始化结构,在初始化驱动程序过程里需要使用它来保存显示驱动程序的回调用函数给显示驱动程序来使用,这个结构如下: @H_403_2@#001 typedef struct _VIDEO_HW_INITIALIZATION_DATA { @H_403_2@ @H_403_2@本结构的大小,一般用来区分不同版本的结构。 @H_403_2@#002 ULONG HwInitDataSize; @H_403_2@ @H_403_2@显示卡接口类型。 @H_403_2@#003 INTERFACE_TYPE AdapterInterfaceType; @H_403_2@ @H_403_2@查找一个显示设备是否可以使用。 @H_403_2@#004 PVIDEO_HW_FIND_ADAPTER HwFindAdapter; @H_403_2@ @H_403_2@执行初始化任务。 @H_403_2@#005 PVIDEO_HW_INITIALIZE HwInitialize; @H_403_2@ @H_403_2@指向小端口驱动中断处理函数。 @H_403_2@#006 PVIDEO_HW_INTERRUPT HwInterrupt; @H_403_2@ @H_403_2@设备IO控制函数。 @H_403_2@#007 PVIDEO_HW_START_IO HwStartIO; @H_403_2@ @H_403_2@指明设备扩展所需要保存数据的大小。 @H_403_2@#008 ULONG HwDeviceExtensionSize; @H_403_2@ @H_403_2@启动的设备号。 @H_403_2@#009 ULONG StartingDeviceNumber; @H_403_2@ @H_403_2@复位显示设备硬件。 @H_403_2@#010 PVIDEO_HW_RESET_HW HwResetHw; @H_403_2@ @H_403_2@定时调用函数。 @H_403_2@#011 PVIDEO_HW_TIMER HwTimer; @H_403_2@ @H_403_2@系统使用的DMA函数。 @H_403_2@#012 PVIDEO_HW_START_DMA HwStartDma; @H_403_2@ @H_403_2@设置显示设备的电源状态。 @H_403_2@#013 PVIDEO_HW_POWER_SET HwSetPowerState; @H_403_2@ @H_403_2@获取显示设备的电源状态。 @H_403_2@#014 PVIDEO_HW_POWER_GET HwGetPowerState; @H_403_2@ @H_403_2@获取子设备的描述信息。 @H_403_2@#015 PVIDEO_HW_GET_CHILD_DESCRIPTOR HwGetVideoChildDescriptor; @H_403_2@ @H_403_2@查询硬件的接口。 @H_403_2@#016 PVIDEO_HW_QUERY_INTERFACE HwQueryInterface; @H_403_2@ @H_403_2@子设备扩展结构的大小。 @H_403_2@#017 ULONG HwChildDeviceExtensionSize; @H_403_2@ @H_403_2@定义设备使用的IO和内存位置、大小。 @H_403_2@#018 PVIDEO_ACCESS_RANGE HwLegacyResourceList; @H_403_2@ @H_403_2@用来表示上面的结构有多少个。 @H_403_2@#019 ULONG HwLegacyResourceCount; @H_403_2@ @H_403_2@获取一些在PCI里没有出现的信息。 @H_403_2@#020 PVIDEO_HW_LEGACYRESOURCES HwGetLegacyResources; @H_403_2@ @H_403_2@是否允许设备启动前枚举子设备。 @H_403_2@#021 BOOLEAN AllowEarlyEnumeration; @H_403_2@ @H_403_2@保留给系统使用。 @H_403_2@#022 ULONG Reserved; @H_403_2@#023} VIDEO_HW_INITIALIZATION_DATA,*PVIDEO_HW_INITIALIZATION_DATA;