ROP4 指定如何混合源、目标、图形以及屏蔽像素的32位值 SHORT 16位有符号整数 SIZEL size 由{ ULONG CX,Cy;}组成的二维结 STROB=K 文本字符串对象指针 SURFOB J= ULONG USHORT xo1u 表面对象指针 32位无符号整数 6位无符号整数 XFORMOBJ=* 坐标转换对象指针 Ⅺ LATEOB J*Dx1o颜色转换对象指针 下表中列出的参数前缀用于修改它们使用的变量名前缀 前缀 参数用途 已计算的索引 指针 第3章支持DDI 为响应通过图形设备接口(GDI)传送的设备无关应用调用,图形驱动程序必须确认 其图形设备产生请求的输出。图形驱动程序通过实现必须的图形驱动程序接口(DI)控制 图形输出 DDI函数用Drv的形式命名。GDI调用这些 Dry kx函数传递数据到驱动程序。当 应用进行GDI请求并且DD确定驱动程序支持相应的函数,GD调用这个函数。驱动程序对 提供函数是可靠的并且在函数的实现中返回到GDI 这一章描述显示器和打印机驱动程序编写者必须明白的DDI函数。DDI函数声明、结 构定义和常量在 windy.h中可以找到。这个头文件和 Microsoft@ Windows@2000DDK 起发布。每个DDI入口点函数、GDI服务函数以及DDI结构和类型的详细信息参见在线DDK a] Graphics Driver Reference 3.1图形驱动程序函数支持 这一节描述驱动程序入口点函数,把它们归类为必需的、有条件必需的和可选的,后 节提供实现信息,对一般的图形驱动程序入口点从功能类别上组织。这个指南的第二和第 三部分分别给出了显示器驱动程序和打印机驱动程序详细的设计信息 当设备驱动程序返回一个错误,一般调用GDI的 EngSetlasterror函数报告扩展的错 误代码。应用程序可以取得这个错误代码 3.1.1必需的图形驱动程序函数
16 ROP4 rop4 指定如何混合源、目标、图形以及屏蔽像素的 32 位值 SHORT s 16 位有符号整数 SIZEL sizl 由{ULONG Cx,Cy;}组成的二维结构 STROBJ* pstro 文本字符串对象指针 SURFOBJ* pso 表面对象指针 ULONG ul 32 位无符号整数 USHORT us 16 位无符号整数 XFORMOBJ* pxo 坐标转换对象指针 XLATEOBJ* pxlo 颜色转换对象指针 下表中列出的参数前缀用于修改它们使用的变量名前缀。 前缀 参数用途 i 已计算的索引 c 计数 p 指针 第 3 章 支持 DDI 为响应通过图形设备接口(GDI)传送的设备无关应用调用,图形驱动程序必须确认 其图形设备产生请求的输出。图形驱动程序通过实现必须的图形驱动程序接口(DDI)控制 图形输出。 DDI 函数用 DrvXxx 的形式命名。GDI 调用这些 DrvXxx 函数传递数据到驱动程序。当 应用进行 GDI 请求并且 DDI 确定驱动程序支持相应的函数,GDI 调用这个函数。驱动程序对 提供函数是可靠的并且在函数的实现中返回到 GDI。 这一章描述显示器和打印机驱动程序编写者必须明白的 DDI 函数。DDI 函数声明、结 构定义和常量在 winddi.h 中可以找到。这个头文件和 Microsoft Windows 2000 DDK 一 起发布 。每个 DDI 入口点函数、GDI 服务函数以及 DDI 结构和类型的详细信息参见在线 DDK 的 Graphics Driver Reference。 3.1 图形驱动程序函数支持 这一节描述驱动程序入口点函数,把它们归类为必需的、有条件必需的和可选的,后 一节提供实现信息,对一般的图形驱动程序入口点从功能类别上组织。这个指南的第二和第 三部分分别给出了显示器驱动程序和打印机驱动程序详细的设计信息。 当设备驱动程序返回一个错误,一般调用 GDI 的 EngSetLastError 函数报告扩展的错 误代码。应用程序可以取得这个错误代码。 3.1.1 必需的图形驱动程序函数
所有的图形驱动程序必须支持GDI调用的入口点,启用或禁止驱动程序、PDEV结构和 表面与每个PDEV相关。下表以一般调用使用的顺序列出了需要的函数 入口点 描述 Ory Enabledriver 作为初始化驱动程序入口点,这个函数把驱动程序版本号以 及所支持的任意函数的入口点提供给GDI DrvGetModes 由指定的视频硬件设备列出所支持的模式。(只有显示器驱 动程序需要这个函数) Dry Enablepdev 启用PDEV。 DrvCompletePDEV 通知驱动程序设备安装已完成 Dry Enable surface 为指定的硬件设备创建一个表面 DryDisableSurface通知驱动程序不再需要为当前设备已创建的表面。 DryDi sablepDev 当不再需要硬件时,释放已创建但还没有删除、由设备和 些表面使用的存储器和资源。 DryDisabledriver 为驱动程序释放所有已分配的资源并把它的初始化状态返 回硬件。 DrvAssertmode 为指定的硬件设备重新设置视频模式。(只有显示器驱动程 序需要这个函数) 3.1.2有条件必需图形驱动程序函数 除了经常请求的函数,还有其他一些函数可能请求,这依赖于驱动程序如何实现。条 件请求函数在下表中列出。如果驱动程序管理其自身的主表面(使用 EngCreateDeviceSurface函数取得表面的句柄)或者其自身的屏幕外位图,它也必须支持 几个绘图函数。驱动程序向标准格式的DIB写时通常允许GDI管理大多数或全部的这些操作。 支持可设置调色板的显示器必须也支持 DrySet Pallete函数 对于打印机驱动程序定义或绘制字体比显示器更加普通。显示器驱动程序不要求处理 字体。如果硬件有驻留的字体,驱动程序必须对GDI支持有关这个字体的信息。这个信息包 括规格、从 Unicode到个体字体轮廓识别、个体字体轮廓属性和字距调整表的映射 入口点 请求 描述 Drv CopyBits 设备管理表面 源到目标的拷贝 DryDescribePixelformat在单一表面上具有不同像素格描述PDEV的像素格式 式、支持 windows的显示器 DrvGetTrue Typefile True Type字体驱动程序 使GDI访问映射存储器 True Type 字体文件 DryloadFontfile 字体驱动程序 为实现字体指定使用的文件 DrvQueryFont 打印机驱动程序 为已给字体检索GDI结构 DrvQueryFontCaps 字体驱动程序 询问驱动程序字体驱动程序的容 DrvQuery FontData 打印机驱动程序 检索有关已实现字体的信息 DrvQuery FontFile 字体驱动程序 询问驱动程序字体文件信息 DrvQuery FontTree 打印机驱动程序 查询子目录结构定义的字体映射 的三种类型之 DrvQuery True TypeOutlin True Type字体驱动程序 返回 True Type字形句柄给GDI DrvQuery True Table True Type字体驱动程序 使GDⅠ访问 True Type字体文件
17 所有的图形驱动程序必须支持 GDI 调用的入口点,启用或禁止驱动程序、PDEV 结构和 表面与每个 PDEV 相关。下表以一般调用使用的顺序列出了需要的函数。 入口点 描述 DrvEnableDriver 作为初始化驱动程序入口点,这个函数把驱动程序版本号以 及所支持的任意函数的入口点提供给 GDI。 DrvGetModes 由指定的视频硬件设备列出所支持的模式。(只有显示器驱 动程序需要这个函数) DrvEnablePDEV 启用 PDEV。 DrvCompletePDEV 通知驱动程序设备安装已完成。 DrvEnableSurface 为指定的硬件设备创建一个表面。 DrvDisableSurface 通知驱动程序不再需要为当前设备已创建的表面。 DrvDisablePDEV 当不再需要硬件时,释放已创建但还没有删除、由设备和一 些表面使用的存储器和资源。 DrvDisableDriver 为驱动程序释放所有已分配的资源并把它的初始化状态返 回硬件。 DrvAssertMode 为指定的硬件设备重新设置视频模式。(只有显示器驱动程 序需要这个函数) 3.1.2 有条件必需图形驱动程序函数 除了经常请求的函数,还有其他一些函数可能请求,这依赖于驱动程序如何实现。条 件 请 求 函 数 在 下 表 中 列 出 。 如 果 驱 动 程 序 管 理 其 自 身 的 主 表 面 ( 使 用 EngCreateDeviceSurface 函数取得表面的句柄)或者其自身的屏幕外位图,它也必须支持 几个绘图函数。驱动程序向标准格式的DIB写时通常允许GDI管理大多数或全部的这些操作。 支持可设置调色板的显示器必须也支持 DrvSetPallete 函数。 对于打印机驱动程序定义或绘制字体比显示器更加普通。显示器驱动程序不要求处理 字体。如果硬件有驻留的字体,驱动程序必须对 GDI 支持有关这个字体的信息。这个信息包 括规格、从 Unicode 到个体字体轮廓识别、个体字体轮廓属性和字距调整表的映射。 入口点 请求 描述 DrvCopyBits 设备管理表面 源到目标的拷贝 DrvDescribePixelFormat 在单一表面上具有不同像素格 式、支持 windows 的显示器 描述 PDEV 的像素格式 DrvGetTrueTypeFile TrueType 字体驱动程序 使 GDI 访问映射存储器 TrueType 字体文件 DrvLoadFontFile 字体驱动程序 为实现字体指定使用的文件 DrvQueryFont 打印机驱动程序 为已给字体检索 GDI 结构 DrvQueryFontCaps 字体驱动程序 询问驱动程序字体驱动程序的容 量 DrvQueryFontData 打印机驱动程序 检索有关已实现字体的信息 DrvQueryFontFile 字体驱动程序 询问驱动程序字体文件信息 DrvQueryFontTree 打印机驱动程序 查询子目录结构定义的字体映射 的三种类型之一 DrvQueryTrueTypeOutlin e TrueType 字体驱动程序 返回 TrueType 字形句柄给 GDI DrvQueryTrueTypeTable TrueType 字体驱动程序 使 GDI 访问 TrueType 字体文件
DrvResetpDev 在文档里允许模式改变的设备从旧PDEV到新PDEV传送驱动程序 状态 DrySet Palette 支持可设置调色板的显示器为指定设备实现调色板 Dry SetPixelformat 在单一表面上具有不同像素格设定窗口的像素格式 式、支持 windows的显示器 DryStrokePath 设备管理表面 在显示器上实现路径 Dry SwapBuffers 具有成对缓冲器、支持像素格式显示表面隐藏的缓冲器的目录 的驱动程序 DryTextout 设备管理表面或定义字体的驱在指定位置实现一组字符映像(图 动程序 示符) DrvUnloadFontFile 字体驱动程序 通知驱动程序不需要字体文件 3.1.3可选的图形驱动程序函数 为了减小驱动程序的大小,驱动程序编写者通常只加进硬件支持最好的几个可选的函 数。例如,支持图象颜色管理(ICM)的硬件驱动程序能实现 DrvIcmkxx函数。下表列出了 图形驱动程序能选择实现的函数。 显示器和打印机驱动程序函数 入口点 描述 DrvAlphablend 提供具有α混合能力的位块传送 DryBitblt 执行一般的从和向表面的位块传送 DrvCreateDeviceBitmap 用驱动程序定义的格式创建和管理位图。 DrvDeleteDeviceBitmap 删除设备管理位图 DryDi therColoi 请求设备创建一个相对设备调色板抖动的画刷。 DryFillpath 为设备管理的表面绘制一个闭合的路径 Drygradientfill 屏蔽已指定的原语 Drv IcmCheckBitmapBits 检查在指定位图里的像素是否位于指定转换的设备范围内 Dry IcmCreateColortransform创建ICM颜色的变换 Dry IcmDeleteColortransform删除已指定的ICM颜色的变换 rvIcmSetDeviceGammaRamp设置指定的显示器设备的硬件斜面 DrvLineto 绘制单一的实心装饰线。 DrvPlgblt 在设备管理和GDI管理表面的结合之间提供旋转的位块传送 能力 DryRealizeBrush 为已定义的表面实现指定的画刷 DryStretchBlt 在设备管理和GDI管理表面之间允许加长的位块传送。 rvStretchBltROP 使用ROP实现加长的位块传送 DryStrokeAndFillPath 同时填充和识别路径 DrvSynchronize 在GDI和显示器驱动程序支持的协处理器设备之间协调绘图 操作;这仅针对引擎管理表面。 reSynchronize Surface 在GDI和显示器驱动程序支持的协处理器设备之间协调绘图 操作;这仅针对引擎管理表面。如果驱动程序提供 Drv Synchronize和 DrvSynchronizeSurface,GDI将仅能调用 Drv Synchronize Surface. Drvtransparentblt 提供透明的位块传送能力 仅由显示器驱动程序使用的函数
18 DrvResetPDEV 在文档里允许模式改变的设备 从旧PDEV到新PDEV传送驱动程序 状态 DrvSetPalette 支持可设置调色板的显示器 为指定设备实现调色板 DrvSetPixelFormat 在单一表面上具有不同像素格 式、支持 windows 的显示器 设定窗口的像素格式 DrvStrokePath 设备管理表面 在显示器上实现路径 DrvSwapBuffers 具有成对缓冲器、支持像素格式 的驱动程序 显示表面隐藏的缓冲器的目录 DrvTextOut 设备管理表面或定义字体的驱 动程序 在指定位置实现一组字符映像(图 示符) DrvUnloadFontFile 字体驱动程序 通知驱动程序不需要字体文件 3.1.3 可选的图形驱动程序函数 为了减小驱动程序的大小,驱动程序编写者通常只加进硬件支持最好的几个可选的函 数。例如,支持图象颜色管理(ICM)的硬件驱动程序能实现 DrvIcmXxx 函数。下表列出了 图形驱动程序能选择实现的函数。 显示器和打印机驱动程序函数 入口点 描述 DrvAlphaBlend 提供具有混合能力的位块传送。 DrvBitBlt 执行一般的从和向表面的位块传送 DrvCreateDeviceBitmap 用驱动程序定义的格式创建和管理位图。 DrvDeleteDeviceBitmap 删除设备管理位图 DrvDitherColor 请求设备创建一个相对设备调色板抖动的画刷。 DrvFillPath 为设备管理的表面绘制一个闭合的路径。 DrvGradientFill 屏蔽已指定的原语 DrvIcmCheckBitmapBits 检查在指定位图里的像素是否位于指定转换的设备范围内 DrvIcmCreateColorTransform 创建 ICM 颜色的变换 DrvIcmDeleteColorTransform 删除已指定的 ICM 颜色的变换 DrvIcmSetDeviceGammaRamp 设置指定的显示器设备的硬件斜面 DrvLineTo 绘制单一的实心装饰线。 DrvPlgBlt 在设备管理和 GDI 管理表面的结合之间提供旋转的位块传送 能力。 DrvRealizeBrush 为已定义的表面实现指定的画刷 DrvStretchBlt 在设备管理和 GDI 管理表面之间允许加长的位块传送。 DrvStretchBltROP 使用 ROP 实现加长的位块传送。 DrvStrokeAndFillPath 同时填充和识别路径。 DrvSynchronize 在 GDI 和显示器驱动程序支持的协处理器设备之间协调绘图 操作;这仅针对引擎管理表面。 DrvSynchronizeSurface 在 GDI 和显示器驱动程序支持的协处理器设备之间协调绘图 操作; 这仅针对引擎管理表面。如果驱动程序提供 DrvSynchronize 和 DrvSynchronizeSurface,GDI 将仅能调用 DrvSynchronizeSurface. DrvTransparentBlt 提供透明的位块传送能力。 仅由显示器驱动程序使用的函数
入口点 描述 DryMove pointer 把指针移动至新位置并刷新它 DrySaveScreenbits存储或恢复屏幕上指定的矩形。(仅针对显示器驱动程序 DrvSetPointer Shape如果驱动程序已完成绘图,从屏幕上删除指针,然后设置一个新的 指针形式 主要由打印机驱动程序使用的函数 入口点 描述 rvDestroy Font 通知驱动程序不再需要认识字体;驱动程序释放己分配的数 据结构 DrvDrawEscape 完成绘图类型退出的函数 Drvescape 在独立设备DDI里从无效设备查询信息 DryFree 释放同指示数据结构相关联的字体存储器。 仅由打印机驱动程序使用的函数 入口点 描述 Dry Enddoc 发送文档结束的信息。 DrvFont Management 允许访问不能直接通过GDI可用的打印机功能。 DrvGetGlyphMode 返回作为特殊字体存储的字体类型信息 DryNextBand 了解表面刚刚绘图的区域的内容 rvQueryPerBandInfo为指定相关的打印机表面返回相关信息。 发送从表面至打印机的写后读位。 DrvStartBanding 为驱动程序准备分区 DryStartDoc 发送文档开始控制的信息 DryStartPage 发送页首控制的信息 字体驱动程序函数 入口点 描述 DrvQueryAdvanceWidths为指定的一组字形提供增加宽度的字符 3.2支持初始化和终止函数 图形驱动程序能支持多个设备和每个设备的多个并发使用。因此,初始化和终止发生 在3个不同的层次,每个层次都有其自己的定时。初始化以下列顺序发生: 1.驱动程序初始化 2.PDEV初始化 表面初始化 终止以相反的顺序发生 3.2.1驱动程序初始化和清除 当设备驱动程序要实现几个或多个函数,它只向GDI输出 Dry Enabledriver。驱动程
19 入口点 描述 DrvMovePointer 把指针移动至新位置并刷新它。 DrvSaveScreenBits 存储或恢复屏幕上指定的矩形。(仅针对显示器驱动程序) DrvSetPointerShape 如果驱动程序已完成绘图,从屏幕上删除指针,然后设置一个新的 指针形式。 主要由打印机驱动程序使用的函数 入口点 描述 DrvDestroyFont 通知驱动程序不再需要认识字体;驱动程序释放已分配的数 据结构。 DrvDrawEscape 完成绘图类型退出的函数。 DrvEscape 在独立设备 DDI 里从无效设备查询信息。 DrvFree 释放同指示数据结构相关联的字体存储器。 仅由打印机驱动程序使用的函数 入口点 描述 DrvEndDoc 发送文档结束的信息。 DrvFontManagement 允许访问不能直接通过 GDI 可用的打印机功能。 DrvGetGlyphMode 返回作为特殊字体存储的字体类型信息。 DrvNextBand 了解表面刚刚绘图的区域的内容。 DrvQueryPerBandInfo 为指定相关的打印机表面返回相关信息。 DrvSendPage 发送从表面至打印机的写后读位。 DrvStartBanding 为驱动程序准备分区。 DrvStartDoc 发送文档开始控制的信息。 DrvStartPage 发送页首控制的信息。 字体驱动程序函数 入口点 描述 DrvQueryAdvanceWidths 为指定的一组字形提供增加宽度的字符。 3.2 支持初始化和终止函数 图形驱动程序能支持多个设备和每个设备的多个并发使用。因此,初始化和终止发生 在 3 个不同的层次,每个层次都有其自己的定时。初始化以下列顺序发生: 1. 驱动程序初始化 2. PDEV 初始化 3. 表面初始化 终止以相反的顺序发生。 3.2.1 驱动程序初始化和清除 当设备驱动程序要实现几个或多个函数,它只向 GDI 输出 DrvEnableDriver。驱动程
序通过一个函数表输出其他的支持的函数。GDI向设备驱动程序调用的第一个函数是 Dry Enabledriver。在这个函数中,驱动程序在传递进的 DRVENABLEDATA结构内填充,这样 GDI能确定支持其他的哪个 Dry lxx函数以及它们的位置在哪里。在 DRVENABLEDATA结构中 驱动程序提供下列信息: GDI的DDI版本号。这个常量在 window.h中定义为 DDI DRIVER VERSION 个指向 DRVFN结构的数组的指针,这个结构列出了支持的函数和它们的索引。 在数组中 DRVEN结构的成员。 为了使GDI调用一个函数和驱动程序的启用和禁止函数不同,驱动程序必须使函数名 和位置对GDI可用 虽然 Dry Enabledriver也能完成一次初始化,如信号的分配,驱动程序在 Dry Enabledriver期间不能实际启用硬件。硬件初始化要在驱动程序的 Dry Enablepdev函数 中发生。同样地,驱动程序在 DryEnablesurface函数中使表面有效 GDI调用 DryDisabledriver函数通知驱动程序它将要卸载。为响应这个调用,驱动程 序要释放在这一点它分配的所有资源和存储器 如果硬件需要重新设置,GDI调用驱动程序的 DrvAssertMode函数 3.2.2PDEV初始化和清除 每个核心模式图形驱动程序表示一个GDI管理的逻辑设备。反过来,一个驱动程序能 管理一个或多个PDEV结构。PDEV是物理设备的逻辑表现。它由硬件的类型、逻辑地址和能 支持的表面来描述 ■硬件的类型一驱动程序支持由硬件的类型描述的PDEV的一个例子是支持假设的 Laserwhiz、 LaserwhizⅡ和 Laserwhiz超级打印机。由GDI传递的设备名指定在 驱动程序支持的全部设备集中哪一个设备被请求 逻辑地址一例如,一个驱动程序能支持连在LPTl、COM2和名为\ SERVER\ PSLASER 的服务器上的多个打印机。另外,一个能同时支持超过一个VGA显示器的显示器 驱动程序可能通过端口号进行区分,如0x3CE,0x2CE,等等。打印机和其他硬拷 贝输出设备的逻辑地址由GDI决定; EngWritePrinter函数向相应的目标直接输 出。显示器既可以隐含地确定其逻辑地址,也可以从 DEVMODEW的私有部分取到地 DEVMODEW结构给驱动程序提供了请求的环境设置,如设备名和指定打印机或显示 器驱动程序的其他信息 表面一每个PDEV请求一个唯一的表面。例如,如果一个打印机驱动程序同时有两 个打印作业在工作,每个作业请求不同的页面格式,如风景和肖像格式,每个打 印作业请求不同的PDEV。类似地,显示器驱动程序可能在同一显示器上支持两个 桌面,每个桌面请求不同的PDEV和表面。对每个表面请求,有一个对 Dry Enablepdev函数的调用为表面创建一个不同的PDEV 为响应对 Dry enablepdev的调用,驱动程序通过几个结构返回有关硬件设备能力的信 在GDI调用 Dry Enablepdev之前, GDLINFO结构填充着0。驱动程序在 GDIINFO中填 充下列信息与GDI通信: 驱动程序版本号 基本的设备技术(光栅和矢量)
20 序通过一个函数表输出其他的支持的函数。GDI 向设备驱动程序调用的第一个函数是 DrvEnableDriver。在这个函数中,驱动程序在传递进的 DRVENABLEDATA 结构内填充,这样 GDI 能确定支持其他的哪个 DrvXxx 函数以及它们的位置在哪里。在 DRVENABLEDATA 结构中 驱动程序提供下列信息: ▪ GDI 的 DDI 版本号。这个常量在 winddi.h 中定义为 DDI_DRIVER_VERSION。 ▪ 一个指向 DRVFN 结构的数组的指针,这个结构列出了支持的函数和它们的索引。 ▪ 在数组中 DRVFN 结构的成员。 为了使 GDI 调用一个函数和驱动程序的启用和禁止函数不同,驱动程序必须使函数名 和位置对 GDI 可用。 虽 然 DrvEnableDriver 也能 完成 一 次初 始 化, 如信 号 的分 配, 驱 动程 序 在 DrvEnableDriver 期间不能实际启用硬件。硬件初始化要在驱动程序的 DrvEnablePDEV 函数 中发生。同样地,驱动程序在 DrvEnableSurface 函数中使表面有效。 GDI 调用 DrvDisableDriver 函数通知驱动程序它将要卸载。为响应这个调用,驱动程 序要释放在这一点它分配的所有资源和存储器。 如果硬件需要重新设置,GDI 调用驱动程序的 DrvAssertMode 函数。 3.2.2 PDEV 初始化和清除 每个核心模式图形驱动程序表示一个 GDI 管理的逻辑设备。反过来,一个驱动程序能 管理一个或多个 PDEV 结构。PDEV 是物理设备的逻辑表现。它由硬件的类型、逻辑地址和能 支持的表面来描述: ▪ 硬件的类型─驱动程序支持由硬件的类型描述的 PDEV 的一个例子是支持假设的 LaserWhiz、LaserWhizⅡ和 LaserWhiz 超级打印机。由 GDI 传递的设备名指定在 驱动程序支持的全部设备集中哪一个设备被请求。 ▪ 逻辑地址—例如,一个驱动程序能支持连在 LPT1、COM2 和名为\\SERVER1\PSLASER 的服务器上的多个打印机。另外,一个能同时支持超过一个 VGA 显示器的显示器 驱动程序可能通过端口号进行区分,如 0x3CE,0x2CE,等等。打印机和其他硬拷 贝输出设备的逻辑地址由 GDI 决定;EngWritePrinter 函数向相应的目标直接输 出。显示器既可以隐含地确定其逻辑地址,也可以从 DEVMODEW 的私有部分取到地 址。 DEVMODEW 结构给驱动程序提供了请求的环境设置,如设备名和指定打印机或显示 器驱动程序的其他信息。 ▪ 表面—每个 PDEV 请求一个唯一的表面。例如,如果一个打印机驱动程序同时有两 个打印作业在工作,每个作业请求不同的页面格式,如风景和肖像格式,每个打 印作业请求不同的 PDEV。类似地,显示器驱动程序可能在同一显示器上支持两个 桌面,每个桌面请求不同的 PDEV 和表面。 对每个表面请求 ,有一个对 DrvEnablePDEV 函数的调用为表面创建一个不同的 PDEV。 为响应对 DrvEnablePDEV 的调用,驱动程序通过几个结构返回有关硬件设备能力的信 息。 在 GDI 调用 DrvEnablePDEV 之前,GDIINFO 结构填充着 0。驱动程序在 GDIINFO 中填 充下列信息与 GDI 通信: ▪ 驱动程序版本号 ▪ 基本的设备技术(光栅和矢量)