记录 一下打印学习期间需要用到的驱动函数
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英文详解-- 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。