DRVENABLEDATA structure

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接: https://blog.csdn.net/zb774095236/article/details/101019086

记录 一下打印学习期间需要用到的驱动函数

MSDN英文详解--DrvEnableDriver

MSDN英文详解--DRVENABLEDATA  structure

                      DRVENABLEDATA structure

DRVENABLEDATA结构包含指向DRVFN结构数组的指针和基于nt的操作系统的图形DDI版本号

语法

typedef struct tagDRVENABLEDATA {
  ULONG iDriverVersion;
  ULONG c;
  DRVFN *pdrvfn;
} DRVENABLEDATA, *PDRVENABLEDATA;

成员

iDriverVersion

         指定驱动程序目标的基于nt的操作系统的图形DDI版本号。此成员可以设置为以下值之一:

操作系统的版本号

DDI_DRIVER_VERSION_NT4 Windows NT 4.0
DDI_DRIVER_VERSION_SP3 Windows NT 4.0 Service Pack 3
DDI_DRIVER_VERSION_NT5 Windows 2000
DDI_DRIVER_VERSION_NT5_01 Windows XP
DDI_DRIVER_VERSION_NT5_01_SP1 Windows XP Service Pack 1

        有关更多信息,请参见备注部分。

c

        指定由pdrvfn成员指向的缓冲区中DRVFN结构的数量。

pdrvfn

        指向包含DRVFN结构数组的缓冲区的指针

备注

要在这些基于nt的操作系统版本上运行,iDriverVersion成员必须设置如下:

Windows版本 驱动版本的参数
Windows NT 4.0 iDriverVersion == DDI_DRIVER_VERSION_NT4
Windows NT 4.0 SP3 DDI_DRIVER_VERSION_NT4 <= iDriverVersion <= DDI_DRIVER_VERSION_SP3
Windows 2000 DDI_DRIVER_VERSION_NT4 <= iDriverVersion <= DDI_DRIVER_VERSION_NT5
Windows XP DDI_DRIVER_VERSION_NT4 <= iDriverVersion <= DDI_DRIVER_VERSION_NT5_01
Windows XP SP1 DDI_DRIVER_VERSION_NT4 <= iDriverVersion <= DDI_DRIVER_VERSION_NT5_01_SP1

如表所示,一个驱动程序可以在任何这些操作系统版本上运行如果iDriverVersion DDI_DRIVER_VERSION_NT4,但是一个驱动程序可以只运行在Windows XP和更高版本的操作系统是否设置为DDI_DRIVER_VERSION_NT5_01 iDriverVersion。

注意,如果驱动程序实现了在所有Windows版本中都不支持的DrvXxx图形DDI,那么当运行在不支持该图形DDI的Windows版本上时,驱动程序不能为该图形DDI指定DRVFN条目。如果驱动程序为这样的图形DDI指定了DRVFN条目,Windows将拒绝驱动程序。permedia2示例演示了如何为不同版本的Windows指定不同的DRVFN结构。

记录 一下打印学习期间需要用到的驱动函数

MSDN英文详解--DrvEnableDriver

MSDN英文详解-- DrvEnablePDEV function

                               DrvEnablePDEV function

DrvEnablePDEV函数将物理设备特征的描述返回给GDI。

语法

DHPDEV DrvEnablePDEV(
  DEVMODEW *pdm,
  LPWSTR   pwszLogAddress,
  ULONG    cPat,
  HSURF    *phsurfPatterns,
  ULONG    cjCaps,
  ULONG    *pdevcaps,
  ULONG    cjDevInfo,
  DEVINFO  *pdi,
  HDEV     hdev,
  LPWSTR   pwszDeviceName,
  HANDLE   hDriver
);

参数

pdm

指向包含驱动程序数据的DEVMODEW结构的指针。

        对于支持Windows NT 4.0的驱动程序,DrvEnablePDEV应该在GDI调用它时返回硬件的默认模式,并将以下DEVMODEW成员设置为零:dmBitsPerPel、dmPelsWidth、dmPelsHeight和dmDisplayFrequency。

pwszLogAddress

对于打印机驱动程序,指向逻辑地址字符串,该字符串是驱动程序写入的位置的用户名。例如“LPT1”或“My Printer”

显示驱动程序应该忽略这个参数。

cPat

对于打印机驱动程序,指定phsurfPatterns指向的缓冲区中表面句柄的数量。驱动程序不能访问缓冲区末端以外的内存。

       显示驱动程序应该忽略这个参数。

phsurfPatterns

      显示驱动程序应该忽略这个参数。

      对于打印机驱动程序,指向一个缓冲区,该缓冲区将由表示标准填充模式的表面句柄填充。必须按照以下顺序定义模式:

  模式

描述

HS_HORIZONTAL 横向填充
HS_VERTICAL 竖向填充
HS_FDIAGONAL 45°向上填充(从左到右)
HS_BDIAGONAL 45°向下填充(从左到右)
HS_CROSS 水平和垂直交叉填充
HS_DIAGCROSS 45°阴影填充

        注意,在驱动程序开发工具包(DDK)的前一个版本中,需要驱动程序支持的默认孵化模式的数量有所减少。因此,HS_DDI_MAX(通常由驱动程序用来声明模式数组的大小)减少了。

GDI使用其中一个表面调用DrvRealizeBrush来实现具有标准模式的画笔。

对于光栅设备,这些表面必须是单色的(每像素1位)GDI位图。设备驱动程序应该选择在设备表面编写时看起来最像标准模式的模式。

GDI从来不需要在矢量设备的支持例程中使用这些画笔。因此,表面可以是设备支持的表面,DrvRealizeBrush将其识别为标准模式。

cjCaps

指定pdevcaps指向的缓冲区的大小。驱动程序不能访问缓冲区末端以外的内存。

pdevcaps

指向将用于描述设备功能的GDIINFO结构的指针。GDI zero初始化这个调用DrvEnablePDEV的结构。

cjDevInfo

      指定pdi指向的DEVINFO结构中的字节数。驱动程序在DEVINFO中修改的字节数不能超过这个数字。

pdi

      指向DEVINFO结构的指针,该结构描述驱动程序和物理设备。驱动程序应该只改变它所理解的成员。GDI在调用DrvEnablePDEV之前用0填充这个结构。

hdev

      gdi提供的设备手柄。这个句柄必须用作一些GDI回调的输入,比如EngGetDriverName。

pwszDeviceName

      指向以null结尾的字符串的指针,该字符串是设备的用户可读名称。

hDriver

       输出设备的句柄。对于显示驱动程序,这是显示设备句柄。对于打印机驱动程序,在调用假脱机程序时,此参数应该用作打印机的句柄。

返回值


            返回值是PDEV的句柄,如果函数成功,它将标识启用的设备。也就是说,DrvEnablePDEV在成功时返回私有的、驱动程序定义的设备实例信息的句柄。否则,返回NULL。

备注

图形设备驱动程序可能支持连接到不同逻辑地址的多个物理设备。驱动程序还必须支持不同绘图表面的模拟使用。

DrvEnablePDEV的目的如下:

       1.告知GDI设备的物理特性。

       2.创建描述当前设备实例的私有PDEV结构(基于接收到的DEVMODE结构和设备名称)。

当GDI随后调用其他图形DDI函数时,它提供DrvEnablePDEV返回的句柄作为输入(通常在SURFOBJ结构中),以便驱动程序能够识别设备实例。

一个逻辑设备可以管理多个PDEVs,这些PDEVs可以通过以下方式进行区分:

       1.硬件类型——单个设备驱动程序可能支持“LaserWhiz”、“LaserWhiz II”和“LaserWhiz Super”。

        2.逻辑地址——单个设备驱动程序可以支持连接到“LPT1”、“COM2”、“\SERVER1\PSLAZER”等的打印机。同时支持多个VGA显示的显示驱动程序可以根据端口号区分它们;例如,0x3CE或0x2CE

        3.surface——打印机驱动程序可以同时处理两个打印作业。这两个表面表示将要打印的两页。类似地,显示设备驱动程序可能支持同一设备上的两个桌面。

当接收到对这个函数的调用时,驱动程序必须分配内存来支持PDEV。但是,在GDI调用DrvEnableSurface之前,不需要支持实际的surface。

如果设备表面需要分配位图,则在需要之前不需要进行这些分配。尽管应用程序常常在实际写入设备之前很久就请求设备信息,但是等待分配资源(如大位图)可以节省内存。

GDI zero在调用这个函数之前初始化phsurfPatterns指向的缓冲区。

       图形驱动程序需要DrvEnablePDEV。

猜你喜欢

转载自blog.csdn.net/zb774095236/article/details/101019086
今日推荐