Implement Set/GetPrinterData[Ex].

Remove ordinals from winspool.drv.spec .
oldstable
Huw D M Davies 2001-02-12 01:26:47 +00:00 committed by Alexandre Julliard
parent ae4f72f5be
commit d2b850e8aa
3 changed files with 333 additions and 123 deletions

View File

@ -73,6 +73,8 @@ static WCHAR Print_ProcessorW[] = {'P','r','i','n','t',' ','P','r','o','c','e',
's','s','o','r',0};
static WCHAR Printer_DriverW[] = {'P','r','i','n','t','e','r',' ','D','r','i',
'v','e','r',0};
static WCHAR PrinterDriverDataW[] = {'P','r','i','n','t','e','r','D','r','i',
'v','e','r','D','a','t','a',0};
static WCHAR Separator_FileW[] = {'S','e','p','a','r','a','t','o','r',' ','F',
'i','l','e',0};
static WCHAR Share_NameW[] = {'S','h','a','r','e',' ','N','a','m','e',0};
@ -151,6 +153,34 @@ static LPOPENEDPRINTER WINSPOOL_GetOpenedPrinter(int printerHandle)
return pOpenedPrinter;
}
/******************************************************************
* WINSPOOL_GetOpenedPrinterRegKey
*
*/
static DWORD WINSPOOL_GetOpenedPrinterRegKey(HANDLE hPrinter, HKEY *phkey)
{
LPOPENEDPRINTER lpOpenedPrinter = WINSPOOL_GetOpenedPrinter(hPrinter);
DWORD ret;
HKEY hkeyPrinters;
if(!lpOpenedPrinter)
return ERROR_INVALID_HANDLE;
if((ret = RegCreateKeyA(HKEY_LOCAL_MACHINE, Printers, &hkeyPrinters)) !=
ERROR_SUCCESS)
return ret;
if(RegOpenKeyW(hkeyPrinters, lpOpenedPrinter->lpsPrinterName, phkey)
!= ERROR_SUCCESS) {
ERR("Can't find opened printer %s in registry\n",
debugstr_w(lpOpenedPrinter->lpsPrinterName));
RegCloseKey(hkeyPrinters);
return ERROR_INVALID_PRINTER_NAME; /* ? */
}
RegCloseKey(hkeyPrinters);
return ERROR_SUCCESS;
}
/***********************************************************
* DEVMODEcpyAtoW
*/
@ -2371,3 +2401,163 @@ BOOL WINAPI EnumPortsA(LPSTR name,DWORD level,LPBYTE ports,DWORD bufsize,
FIXME("(%s,%ld,%p,%ld,%p,%p), stub!\n",name,level,ports,bufsize,bufneeded,bufreturned);
return FALSE;
}
/******************************************************************************
* SetPrinterDataExA (WINSPOOL)
*/
DWORD WINAPI SetPrinterDataExA(HANDLE hPrinter, LPSTR pKeyName,
LPSTR pValueName, DWORD Type,
LPBYTE pData, DWORD cbData)
{
HKEY hkeyPrinter, hkeySubkey;
DWORD ret;
TRACE("(%08x, %s, %s %08lx, %p, %08lx)\n", hPrinter, debugstr_a(pKeyName),
debugstr_a(pValueName), Type, pData, cbData);
if((ret = WINSPOOL_GetOpenedPrinterRegKey(hPrinter, &hkeyPrinter))
!= ERROR_SUCCESS)
return ret;
if((ret = RegCreateKeyA(hkeyPrinter, pKeyName, &hkeySubkey))
!= ERROR_SUCCESS) {
ERR("Can't create subkey %s\n", debugstr_a(pKeyName));
RegCloseKey(hkeyPrinter);
return ret;
}
ret = RegSetValueExA(hkeySubkey, pValueName, 0, Type, pData, cbData);
RegCloseKey(hkeySubkey);
RegCloseKey(hkeyPrinter);
return ret;
}
/******************************************************************************
* SetPrinterDataExW (WINSPOOL)
*/
DWORD WINAPI SetPrinterDataExW(HANDLE hPrinter, LPWSTR pKeyName,
LPWSTR pValueName, DWORD Type,
LPBYTE pData, DWORD cbData)
{
HKEY hkeyPrinter, hkeySubkey;
DWORD ret;
TRACE("(%08x, %s, %s %08lx, %p, %08lx)\n", hPrinter, debugstr_w(pKeyName),
debugstr_w(pValueName), Type, pData, cbData);
if((ret = WINSPOOL_GetOpenedPrinterRegKey(hPrinter, &hkeyPrinter))
!= ERROR_SUCCESS)
return ret;
if((ret = RegCreateKeyW(hkeyPrinter, pKeyName, &hkeySubkey))
!= ERROR_SUCCESS) {
ERR("Can't create subkey %s\n", debugstr_w(pKeyName));
RegCloseKey(hkeyPrinter);
return ret;
}
ret = RegSetValueExW(hkeySubkey, pValueName, 0, Type, pData, cbData);
RegCloseKey(hkeySubkey);
RegCloseKey(hkeyPrinter);
return ret;
}
/******************************************************************************
* SetPrinterDataA (WINSPOOL)
*/
DWORD WINAPI SetPrinterDataA(HANDLE hPrinter, LPSTR pValueName, DWORD Type,
LPBYTE pData, DWORD cbData)
{
return SetPrinterDataExA(hPrinter, "PrinterDriverData", pValueName, Type,
pData, cbData);
}
/******************************************************************************
* SetPrinterDataW (WINSPOOL)
*/
DWORD WINAPI SetPrinterDataW(HANDLE hPrinter, LPWSTR pValueName, DWORD Type,
LPBYTE pData, DWORD cbData)
{
return SetPrinterDataExW(hPrinter, PrinterDriverDataW, pValueName, Type,
pData, cbData);
}
/******************************************************************************
* GetPrinterDataExA (WINSPOOL)
*/
DWORD WINAPI GetPrinterDataExA(HANDLE hPrinter, LPSTR pKeyName,
LPSTR pValueName, LPDWORD pType,
LPBYTE pData, DWORD nSize, LPDWORD pcbNeeded)
{
HKEY hkeyPrinter, hkeySubkey;
DWORD ret;
TRACE("(%08x, %s, %s %p, %p, %08lx, %p)\n", hPrinter,
debugstr_a(pKeyName), debugstr_a(pValueName), pType, pData, nSize,
pcbNeeded);
if((ret = WINSPOOL_GetOpenedPrinterRegKey(hPrinter, &hkeyPrinter))
!= ERROR_SUCCESS)
return ret;
if((ret = RegOpenKeyA(hkeyPrinter, pKeyName, &hkeySubkey))
!= ERROR_SUCCESS) {
WARN("Can't open subkey %s\n", debugstr_a(pKeyName));
RegCloseKey(hkeyPrinter);
return ret;
}
*pcbNeeded = nSize;
ret = RegQueryValueExA(hkeySubkey, pValueName, 0, pType, pData, pcbNeeded);
RegCloseKey(hkeySubkey);
RegCloseKey(hkeyPrinter);
return ret;
}
/******************************************************************************
* GetPrinterDataExW (WINSPOOL)
*/
DWORD WINAPI GetPrinterDataExW(HANDLE hPrinter, LPWSTR pKeyName,
LPWSTR pValueName, LPDWORD pType,
LPBYTE pData, DWORD nSize, LPDWORD pcbNeeded)
{
HKEY hkeyPrinter, hkeySubkey;
DWORD ret;
TRACE("(%08x, %s, %s %p, %p, %08lx, %p)\n", hPrinter,
debugstr_w(pKeyName), debugstr_w(pValueName), pType, pData, nSize,
pcbNeeded);
if((ret = WINSPOOL_GetOpenedPrinterRegKey(hPrinter, &hkeyPrinter))
!= ERROR_SUCCESS)
return ret;
if((ret = RegOpenKeyW(hkeyPrinter, pKeyName, &hkeySubkey))
!= ERROR_SUCCESS) {
WARN("Can't open subkey %s\n", debugstr_w(pKeyName));
RegCloseKey(hkeyPrinter);
return ret;
}
*pcbNeeded = nSize;
ret = RegQueryValueExW(hkeySubkey, pValueName, 0, pType, pData, pcbNeeded);
RegCloseKey(hkeySubkey);
RegCloseKey(hkeyPrinter);
return ret;
}
/******************************************************************************
* GetPrinterDataA (WINSPOOL)
*/
DWORD WINAPI GetPrinterDataA(HANDLE hPrinter, LPSTR pValueName, LPDWORD pType,
LPBYTE pData, DWORD nSize, LPDWORD pcbNeeded)
{
return GetPrinterDataExA(hPrinter, "PrinterDriverData", pValueName, pType,
pData, nSize, pcbNeeded);
}
/******************************************************************************
* GetPrinterDataW (WINSPOOL)
*/
DWORD WINAPI GetPrinterDataW(HANDLE hPrinter, LPWSTR pValueName, LPDWORD pType,
LPBYTE pData, DWORD nSize, LPDWORD pcbNeeded)
{
return GetPrinterDataExW(hPrinter, PrinterDriverDataW, pValueName, pType,
pData, nSize, pcbNeeded);
}

View File

@ -9,126 +9,130 @@ import ntdll.dll
debug_channels (winspool)
101 stub ADVANCEDSETUPDIALOG
102 stub AbortPrinter
103 stdcall AddFormA(long long ptr) AddFormA
104 stdcall AddFormW(long long ptr) AddFormW
105 stdcall AddJobA(long long ptr long ptr) AddJobA
106 stdcall AddJobW(long long ptr long ptr) AddJobW
107 stdcall AddMonitorA(str long ptr) AddMonitorA
108 stub AddMonitorW
109 stub AddPortA
110 stub AddPortExA
111 stub AddPortExW
112 stub AddPortW
113 stub AddPrintProcessorA
114 stub AddPrintProcessorW
115 stub AddPrintProvidorA
116 stub AddPrintProvidorW
117 stdcall AddPrinterA(str long ptr) AddPrinterA
118 stub AddPrinterConnectionA
119 stub AddPrinterConnectionW
120 stdcall AddPrinterDriverA(str long ptr) AddPrinterDriverA
121 stdcall AddPrinterDriverW(wstr long ptr) AddPrinterDriverW
122 stdcall AddPrinterW(wstr long ptr) AddPrinterW
123 stub AdvancedDocumentPropertiesA
124 stub AdvancedDocumentPropertiesW
125 stub AdvancedSetupDialog
126 stdcall ClosePrinter(long) ClosePrinter
127 stub ConfigurePortA
128 stub ConfigurePortW
129 stub ConnectToPrinterDlg
130 stub CreatePrinterIC
131 stub DEVICECAPABILITIES
132 stub DEVICEMODE
133 stdcall DeleteFormA(long str) DeleteFormA
134 stdcall DeleteFormW(long wstr) DeleteFormW
135 stdcall DeleteMonitorA(str str str) DeleteMonitorA
136 stub DeleteMonitorW
137 stdcall DeletePortA(str long str) DeletePortA
138 stub DeletePortW
139 stub DeletePrintProcessorA
140 stub DeletePrintProcessorW
141 stub DeletePrintProvidorA
142 stub DeletePrintProvidorW
143 stdcall DeletePrinter(long) DeletePrinter
144 stub DeletePrinterConnectionA
145 stub DeletePrinterConnectionW
146 stdcall DeletePrinterDriverA(str str str) DeletePrinterDriverA
147 stub DeletePrinterDriverW
148 stub DeletePrinterIC
149 stub DevQueryPrint
150 stdcall DeviceCapabilities(str str long ptr ptr) DeviceCapabilitiesA
151 stdcall DeviceCapabilitiesA(str str long ptr ptr) DeviceCapabilitiesA
152 stdcall DeviceCapabilitiesW(wstr wstr long wstr ptr) DeviceCapabilitiesW
153 stub DeviceMode
154 stub DocumentEvent
155 stdcall DocumentPropertiesA(long long ptr ptr ptr long) DocumentPropertiesA
156 stdcall DocumentPropertiesW(long long ptr ptr ptr long) DocumentPropertiesW
157 stub EXTDEVICEMODE
158 stub EndDocPrinter
159 stub EndPagePrinter
160 stub EnumFormsA
161 stub EnumFormsW
162 stdcall EnumJobsA(long long long long ptr long ptr ptr) EnumJobsA
163 stdcall EnumJobsW(long long long long ptr long ptr ptr) EnumJobsW
164 stub EnumMonitorsA
165 stub EnumMonitorsW
166 stdcall EnumPortsA(ptr long ptr ptr ptr ptr) EnumPortsA
167 stub EnumPortsW
168 stub EnumPrintProcessorDatatypesA
169 stub EnumPrintProcessorDatatypesW
170 stub EnumPrintProcessorsA
171 stub EnumPrintProcessorsW
172 stdcall EnumPrinterDriversA(str str long ptr long ptr ptr) EnumPrinterDriversA
173 stdcall EnumPrinterDriversW(wstr wstr long ptr long ptr ptr) EnumPrinterDriversW
174 stdcall EnumPrintersA(long ptr long ptr long ptr ptr) EnumPrintersA
175 stdcall EnumPrintersW(long ptr long ptr long ptr ptr) EnumPrintersW
176 stub ExtDeviceMode
177 stub FindClosePrinterChangeNotification
178 stub FindFirstPrinterChangeNotification
179 stub FindNextPrinterChangeNotification
180 stub FreePrinterNotifyInfo
181 stdcall GetFormA(long str long ptr long ptr) GetFormA
182 stdcall GetFormW(long wstr long ptr long ptr) GetFormW
183 stub GetJobA
184 stub GetJobW
185 stub GetPrintProcessorDirectoryA
186 stub GetPrintProcessorDirectoryW
187 stdcall GetPrinterA(long long ptr long ptr) GetPrinterA
188 stub GetPrinterDataA
189 stub GetPrinterDataW
190 stdcall GetPrinterDriverA(long str long ptr long ptr) GetPrinterDriverA
191 stdcall GetPrinterDriverDirectoryA(str str long ptr long ptr) GetPrinterDriverDirectoryA
192 stdcall GetPrinterDriverDirectoryW(wstr wstr long ptr long ptr) GetPrinterDriverDirectoryW
193 stdcall GetPrinterDriverW(long str long ptr long ptr) GetPrinterDriverW
194 stdcall GetPrinterW(long long ptr long ptr) GetPrinterW
195 stub InitializeDll
196 stdcall OpenPrinterA(str ptr ptr) OpenPrinterA
197 stdcall OpenPrinterW(wstr ptr ptr) OpenPrinterW
198 stub PlayGdiScriptOnPrinterIC
199 stub PrinterMessageBoxA
200 stub PrinterMessageBoxW
201 stdcall PrinterProperties(long long) PrinterProperties
202 stdcall ReadPrinter(long ptr long ptr) ReadPrinter
203 stdcall ResetPrinterA(long ptr) ResetPrinterA
204 stdcall ResetPrinterW(long ptr) ResetPrinterW
205 stub ScheduleJob
206 stub SetAllocFailCount
207 stdcall SetFormA(long str long ptr) SetFormA
208 stdcall SetFormW(long wstr long ptr) SetFormW
209 stdcall SetJobA(long long long ptr long) SetJobA
210 stdcall SetJobW(long long long ptr long) SetJobW
211 stdcall SetPrinterA(long long ptr long) SetPrinterA
212 stub SetPrinterDataA
213 stub SetPrinterDataW
214 stdcall SetPrinterW(long long ptr long) SetPrinterW
215 stub SpoolerDevQueryPrintW
216 stub SpoolerInit
217 stub StartDocDlgA
218 stub StartDocDlgW
219 stub StartDocPrinterA
220 stub StartDocPrinterW
221 stub StartPagePrinter
222 stub WaitForPrinterChange
223 stdcall WritePrinter(long ptr long ptr) WritePrinter
@ stub ADVANCEDSETUPDIALOG
@ stub AbortPrinter
@ stdcall AddFormA(long long ptr) AddFormA
@ stdcall AddFormW(long long ptr) AddFormW
@ stdcall AddJobA(long long ptr long ptr) AddJobA
@ stdcall AddJobW(long long ptr long ptr) AddJobW
@ stdcall AddMonitorA(str long ptr) AddMonitorA
@ stub AddMonitorW
@ stub AddPortA
@ stub AddPortExA
@ stub AddPortExW
@ stub AddPortW
@ stub AddPrintProcessorA
@ stub AddPrintProcessorW
@ stub AddPrintProvidorA
@ stub AddPrintProvidorW
@ stdcall AddPrinterA(str long ptr) AddPrinterA
@ stub AddPrinterConnectionA
@ stub AddPrinterConnectionW
@ stdcall AddPrinterDriverA(str long ptr) AddPrinterDriverA
@ stdcall AddPrinterDriverW(wstr long ptr) AddPrinterDriverW
@ stdcall AddPrinterW(wstr long ptr) AddPrinterW
@ stub AdvancedDocumentPropertiesA
@ stub AdvancedDocumentPropertiesW
@ stub AdvancedSetupDialog
@ stdcall ClosePrinter(long) ClosePrinter
@ stub ConfigurePortA
@ stub ConfigurePortW
@ stub ConnectToPrinterDlg
@ stub CreatePrinterIC
@ stub DEVICECAPABILITIES
@ stub DEVICEMODE
@ stdcall DeleteFormA(long str) DeleteFormA
@ stdcall DeleteFormW(long wstr) DeleteFormW
@ stdcall DeleteMonitorA(str str str) DeleteMonitorA
@ stub DeleteMonitorW
@ stdcall DeletePortA(str long str) DeletePortA
@ stub DeletePortW
@ stub DeletePrintProcessorA
@ stub DeletePrintProcessorW
@ stub DeletePrintProvidorA
@ stub DeletePrintProvidorW
@ stdcall DeletePrinter(long) DeletePrinter
@ stub DeletePrinterConnectionA
@ stub DeletePrinterConnectionW
@ stdcall DeletePrinterDriverA(str str str) DeletePrinterDriverA
@ stub DeletePrinterDriverW
@ stub DeletePrinterIC
@ stub DevQueryPrint
@ stdcall DeviceCapabilities(str str long ptr ptr) DeviceCapabilitiesA
@ stdcall DeviceCapabilitiesA(str str long ptr ptr) DeviceCapabilitiesA
@ stdcall DeviceCapabilitiesW(wstr wstr long wstr ptr) DeviceCapabilitiesW
@ stub DeviceMode
@ stub DocumentEvent
@ stdcall DocumentPropertiesA(long long ptr ptr ptr long) DocumentPropertiesA
@ stdcall DocumentPropertiesW(long long ptr ptr ptr long) DocumentPropertiesW
@ stub EXTDEVICEMODE
@ stub EndDocPrinter
@ stub EndPagePrinter
@ stub EnumFormsA
@ stub EnumFormsW
@ stdcall EnumJobsA(long long long long ptr long ptr ptr) EnumJobsA
@ stdcall EnumJobsW(long long long long ptr long ptr ptr) EnumJobsW
@ stub EnumMonitorsA
@ stub EnumMonitorsW
@ stdcall EnumPortsA(ptr long ptr ptr ptr ptr) EnumPortsA
@ stub EnumPortsW
@ stub EnumPrintProcessorDatatypesA
@ stub EnumPrintProcessorDatatypesW
@ stub EnumPrintProcessorsA
@ stub EnumPrintProcessorsW
@ stdcall EnumPrinterDriversA(str str long ptr long ptr ptr) EnumPrinterDriversA
@ stdcall EnumPrinterDriversW(wstr wstr long ptr long ptr ptr) EnumPrinterDriversW
@ stdcall EnumPrintersA(long ptr long ptr long ptr ptr) EnumPrintersA
@ stdcall EnumPrintersW(long ptr long ptr long ptr ptr) EnumPrintersW
@ stub ExtDeviceMode
@ stub FindClosePrinterChangeNotification
@ stub FindFirstPrinterChangeNotification
@ stub FindNextPrinterChangeNotification
@ stub FreePrinterNotifyInfo
@ stdcall GetFormA(long str long ptr long ptr) GetFormA
@ stdcall GetFormW(long wstr long ptr long ptr) GetFormW
@ stub GetJobA
@ stub GetJobW
@ stub GetPrintProcessorDirectoryA
@ stub GetPrintProcessorDirectoryW
@ stdcall GetPrinterA(long long ptr long ptr) GetPrinterA
@ stdcall GetPrinterDataA(long str ptr ptr long ptr) GetPrinterDataA
@ stdcall GetPrinterDataExA(long str str ptr ptr long ptr) GetPrinterDataExA
@ stdcall GetPrinterDataExW(long wstr wstr ptr ptr long ptr) GetPrinterDataExW
@ stdcall GetPrinterDataW(long wstr ptr ptr long ptr) GetPrinterDataW
@ stdcall GetPrinterDriverA(long str long ptr long ptr) GetPrinterDriverA
@ stdcall GetPrinterDriverDirectoryA(str str long ptr long ptr) GetPrinterDriverDirectoryA
@ stdcall GetPrinterDriverDirectoryW(wstr wstr long ptr long ptr) GetPrinterDriverDirectoryW
@ stdcall GetPrinterDriverW(long str long ptr long ptr) GetPrinterDriverW
@ stdcall GetPrinterW(long long ptr long ptr) GetPrinterW
@ stub InitializeDll
@ stdcall OpenPrinterA(str ptr ptr) OpenPrinterA
@ stdcall OpenPrinterW(wstr ptr ptr) OpenPrinterW
@ stub PlayGdiScriptOnPrinterIC
@ stub PrinterMessageBoxA
@ stub PrinterMessageBoxW
@ stdcall PrinterProperties(long long) PrinterProperties
@ stdcall ReadPrinter(long ptr long ptr) ReadPrinter
@ stdcall ResetPrinterA(long ptr) ResetPrinterA
@ stdcall ResetPrinterW(long ptr) ResetPrinterW
@ stub ScheduleJob
@ stub SetAllocFailCount
@ stdcall SetFormA(long str long ptr) SetFormA
@ stdcall SetFormW(long wstr long ptr) SetFormW
@ stdcall SetJobA(long long long ptr long) SetJobA
@ stdcall SetJobW(long long long ptr long) SetJobW
@ stdcall SetPrinterA(long long ptr long) SetPrinterA
@ stdcall SetPrinterDataA(long str long ptr long) SetPrinterDataA
@ stdcall SetPrinterDataExA(long str str long ptr long) SetPrinterDataExA
@ stdcall SetPrinterDataExW(long wstr wstr long ptr long) SetPrinterDataExW
@ stdcall SetPrinterDataW(long wstr long ptr long) SetPrinterDataW
@ stdcall SetPrinterW(long long ptr long) SetPrinterW
@ stub SpoolerDevQueryPrintW
@ stub SpoolerInit
@ stub StartDocDlgA
@ stub StartDocDlgW
@ stub StartDocPrinterA
@ stub StartDocPrinterW
@ stub StartPagePrinter
@ stub WaitForPrinterChange
@ stdcall WritePrinter(long ptr long ptr) WritePrinter

View File

@ -957,12 +957,28 @@ DWORD WINAPI GetPrinterDataW(HANDLE hPrinter, LPWSTR pValueName, LPDWORD pType,
LPBYTE pData, DWORD nSize, LPDWORD pcbNeeded);
#define GetPrinterData WINELIB_NAME_AW(GetPrinterData)
DWORD WINAPI GetPrinterDataExA(HANDLE hPrinter, LPSTR pKeyName,
LPSTR pValueName, LPDWORD pType,
LPBYTE pData, DWORD nSize, LPDWORD pcbNeeded);
DWORD WINAPI GetPrinterDataExW(HANDLE hPrinter, LPWSTR pKeyName,
LPWSTR pValueName, LPDWORD pType,
LPBYTE pData, DWORD nSize, LPDWORD pcbNeeded);
#define GetPrinterDataEx WINELIB_NAME_AW(GetPrinterDataEx)
DWORD WINAPI SetPrinterDataA(HANDLE hPrinter, LPSTR pValueName, DWORD Type,
LPBYTE pData, DWORD cbData);
DWORD WINAPI SetPrinterDataW(HANDLE hPrinter, LPWSTR pValueName, DWORD Type,
LPBYTE pData, DWORD cbData);
#define SetPrinterData WINELIB_NAME_AW(SetPrinterData)
DWORD WINAPI SetPrinterDataExA(HANDLE hPrinter, LPSTR pKeyName,
LPSTR pValueName, DWORD Type,
LPBYTE pData, DWORD cbData);
DWORD WINAPI SetPrinterDataExW(HANDLE hPrinter, LPWSTR pKeyName,
LPWSTR pValueName, DWORD Type,
LPBYTE pData, DWORD cbData);
#define SetPrinterDataEx WINELIB_NAME_AW(SetPrinterDataEx)
DWORD WINAPI WaitForPrinterChange(HANDLE hPrinter, DWORD Flags);
HANDLE WINAPI FindFirstPrinterChangeNotification(HANDLE hPrinter,
DWORD fdwFlags,