正在加载图片...
2. 3. 6 Hooking A Punting 术语 poking和 Punting指的是驱动程序决定是否提供标准的位图绘画操作,或依赖 GDI提供这些操作。如果驱动程序实现了引擎管理的表面,GDI能处理所有的绘图操作。然 而,如果硬件能加速这些操作,驱动程序能提供一个或更多的绘图函数。通过实现,或 Hooking Drv Xxa函数来做到这一点 也许只想实现绘图操作的一个子集,实现一个特殊的DDI接口点。对它不支持的任何 操作,驱动程序能调用相应的GDI函数来实现。这称作 Punting到GDI。有一些情形是操作 必须在驱动程序内实现。例如,如果驱动程序实现了一个设备管理的表面,某些绘图函数必 须在显示器驱动程序内完成 ooking 缺省情况下,当绘图表面是引擎管理的表面时,ωDⅠ处理绘画(绘图)操作。驱动程 序利用硬件对一给定的表面,为一些或所有的绘图函数提供了加速,或者使用了特别的块传 送硬件,能够hook这些函数。对于hok调用,驱动程序把hook指定为 EngAssociateSurface 和 EngModifySurface函数 flOck参数的标记。 如果驱动程序指定了一个函数的hook标记,它必须提供在其支持DDI入口点的列表 中的函数。驱动程序能够优化具有硬件支持的操作。这样的驱动程序在一个hook调用中可 能只能处理某一种情况。例如,如果在一个hook调用中请求了复杂的图形,它可能还要更 有效地直接回调GDI,允许GDI处理操作 这里还有另一个例子,驱动程序选择是否处理hook调用。考虑应该支持硬件的驱动 程序,有能力用某些ROP处理位块传输调用。即使驱动程序能够独立地实现许多操作,其他 方面仅是一个缓冲区。这样的驱动程序将为帧缓冲区给位图表面返回一个句柄,就像为其 PDEV表面一样,但它将为自己 hook drybitblt调用。当GDI调用 DryBitblt时,驱动程序 能够检查R尸来看它是否是由硬件支持的一个函数。如果不是,驱动程序能通过对 Engbitblt 的一个调用把操作传递GDI。 支持设备管理表面的驱动程序必须向外hook一些绘图函数,名字是 DrvCopyBits、 DryTextout和 DryStrokepath。虽然GDI模拟能够处理其他绘图函数,因为性能上的原因推 荐这种类型的驱动程序hok其他函数,就像 DryBitB1t和 Drv Realizebrush函数,因为模 拟需要从或向表面绘图。 Punting Punting回调到GDI的意思是提交一个调用到相应的GDI模拟。通常,对每个Drvx 调用都有一个相应的 GDI Eng xx模拟调用,带有相同的参数。在驱动程序制作透明的位图 时,所有的参数都没有改变地传递到GDI模拟。对每个调用驱动程序punt回GDI,驱动程 序的大小缩减了(因为功能上的代码忽略了)。然而,因为引擎拥有调用,驱动程序在执行 速度上没有控制。对一些复杂的情况,在驱动程序中提供支持也许没有实际的优势 可以hook的GDI图形输出函数 驱动程序能够hook的图形输出函数和相应的GDI模拟在下表中列出 驱动程序图形输出函数 相应的GDI模拟 Drybitblt EngBitBlt DrvPlgblt EngPlgblt DryStretchBlt EngStretchBlt10 2.2.3.6 Hooking 和 Punting 术语 Hooking 和 Punting 指的是驱动程序决定是否提供标准的位图绘画操作,或依赖 GDI 提供这些操作。如果驱动程序实现了引擎管理的表面,GDI 能处理所有的绘图操作。然 而,如果硬件能加速这些操作,驱动程序能提供一个或更多的绘图函数。通过实现,或 Hooking DrvXxx 函数来做到这一点。 也许只想实现绘图操作的一个子集,实现一个特殊的 DDI 接口点。对它不支持的任何 操作,驱动程序能调用相应的 GDI 函数来实现。这称作 Punting 到 GDI。有一些情形是操作 必须在驱动程序内实现。例如,如果驱动程序实现了一个设备管理的表面,某些绘图函数必 须在显示器驱动程序内完成。 Hooking 缺省情况下,当绘图表面是引擎管理的表面时,GDI 处理绘画(绘图)操作。驱动程 序利用硬件对一给定的表面,为一些或所有的绘图函数提供了加速,或者使用了特别的块传 送硬件,能够 hook 这些函数。对于 hook 调用,驱动程序把 hook 指定为 EngAssociateSurface 和 EngModifySurface 函数 flHook 参数的标记。 如果驱动程序指定了一个函数的 hook 标记,它必须提供在其支持 DDI 入口点的列表 中的函数。驱动程序能够优化具有硬件支持的操作。这样的驱动程序在一个 hook 调用中可 能只能处理某一种情况。例如,如果在一个 hook 调用中请求了复杂的图形,它可能还要更 有效地直接回调 GDI,允许 GDI 处理操作。 这里还有另一个例子,驱动程序选择是否处理 hook 调用。考虑应该支持硬件的驱动 程序,有能力用某些 ROP 处理位块传输调用。即使驱动程序能够独立地实现许多操作,其他 方面仅是一个缓冲区。这样的驱动程序将为帧缓冲区给位图表面返回一个句柄,就像为其 PDEV 表面一样,但它将为自己 hook DrvBitBlt 调用。当 GDI 调用 DrvBitBlt 时,驱动程序 能够检查 ROP 来看它是否是由硬件支持的一个函数。如果不是,驱动程序能通过对 EngBitBlt 的一个调用把操作传递 GDI。 支持设备管理表面的驱动程序必须向外 hook 一些绘图函数,名字是 DrvCopyBits、 DrvTextOut 和 DrvStrokePath。虽然 GDI 模拟能够处理其他绘图函数,因为性能上的原因推 荐这种类型的驱动程序 hook 其他函数,就像 DrvBitBlt 和 DrvRealizeBrush 函数,因为模 拟需要从或向表面绘图。 Punting Punting 回调到 GDI 的意思是提交一个调用到相应的 GDI 模拟。通常,对每个 DrvXxx 调用都有一个相应的 GDI EngXxx 模拟调用,带有相同的参数。在驱动程序制作透明的位图 时,所有的参数都没有改变地传递到 GDI 模拟。对每个调用驱动程序 punt 回 GDI,驱动程 序的大小缩减了(因为功能上的代码忽略了)。然而,因为引擎拥有调用,驱动程序在执行 速度上没有控制。对一些复杂的情况,在驱动程序中提供支持也许没有实际的优势。 可以 hook 的 GDI 图形输出函数 驱动程序能够 hook 的图形输出函数和相应的 GDI 模拟在下表中列出。 驱动程序图形输出函数 相应的 GDI 模拟 DrvBitBlt EngBitBlt DrvPlgBlt EngPlgBlt DrvStretchBlt EngStretchBlt
<<向上翻页向下翻页>>
©2008-现在 cucdc.com 高等教育资讯网 版权所有