記錄 一下打印學習期間需要用到的驅動函數
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。