merge from 2.2
[samba.git] / docs / docbook / projdoc / printer_driver2.sgml
1 <chapter>
2
3
4 <chapterinfo>
5         <author>
6                 <firstname>Gerald (Jerry)</firstname><surname>Carter</surname>
7                 <affiliation>
8                         <orgname>Samba Team</orgname>
9                         <address>
10                                 <email>jerry@samba.org</email>
11                         </address>
12                 </affiliation>
13         </author>
14         
15                 
16         <pubdate> (3 May 2001) </pubdate>
17 </chapterinfo>
18
19 <title>Printing Support in Samba 2.2.x</title>
20
21 <sect1>
22 <title>Introduction</title>
23         
24 <para>Beginning with the 2.2.0 release, Samba supports 
25 the native Windows NT printing mechanisms implemented via 
26 MS-RPC (i.e. the SPOOLSS named pipe).  Previous versions of 
27 Samba only supported LanMan printing calls.</para>
28
29 <para>The additional functionality provided by the new 
30 SPOOLSS support includes:</para>
31         
32 <itemizedlist>
33         <listitem><para>Support for downloading printer driver 
34         files to Windows 95/98/NT/2000 clients upon demand.
35         </para></listitem>
36         
37         <listitem><para>Uploading of printer drivers via the 
38         Windows NT Add Printer Wizard (APW) or the 
39         Imprints tool set (refer to <ulink 
40         url="http://imprints.sourceforge.net">http://imprints.sourceforge.net</ulink>). 
41         </para></listitem>
42                 
43         <listitem><para>Support for the native MS-RPC printing 
44         calls such as StartDocPrinter, EnumJobs(), etc...  (See 
45         the MSDN documentation at <ulink 
46         url="http://msdn.microsoft.com/">http://msdn.microsoft.com/</ulink> 
47         for more information on the Win32 printing API)
48         </para></listitem>
49                 
50         <listitem><para>Support for NT Access Control Lists (ACL) 
51         on printer objects</para></listitem>
52         
53         <listitem><para>Improved support for printer queue manipulation 
54         through the use of an internal databases for spooled job 
55         information</para></listitem>
56 </itemizedlist>
57
58 <para>
59 There has been some initial confusion about what all this means
60 and whether or not it is a requirement for printer drivers to be 
61 installed on a Samba host in order to support printing from Windows 
62 clients.  A bug existed in Samba 2.2.0 which made Windows NT/2000 clients 
63 require that the Samba server possess a valid driver for the printer.  
64 This is fixed in Samba 2.2.1 and once again, Windows NT/2000 clients
65 can use the local APW for installing drivers to be used with a Samba 
66 served printer.  This is the same behavior exhibited by Windows 9x clients.
67 As a side note, Samba does not use these drivers in any way to process 
68 spooled files.  They are utilized entirely by the clients.
69 </para>
70
71 <para>
72 The following MS KB article, may be of some help if you are dealing with
73 Windows 2000 clients:  <emphasis>How to Add Printers with No User 
74 Interaction in Windows 2000</emphasis>
75 </para>
76
77 <para>
78 <ulink url="http://support.microsoft.com/support/kb/articles/Q189/1/05.ASP">http://support.microsoft.com/support/kb/articles/Q189/1/05.ASP</ulink>
79 </para>
80
81 </sect1>
82
83
84 <sect1>
85 <title>Configuration</title>
86
87 <warning>
88 <title>[print$] vs. [printer$]</title>
89
90 <para>
91 Previous versions of Samba recommended using a share named [printer$].  
92 This name was taken from the printer$ service created by Windows 9x 
93 clients when a printer was shared.  Windows 9x printer servers always have 
94 a printer$ service which provides read-only access via no 
95 password in order to support printer driver downloads.
96 </para>
97         
98 <para>
99 However, the initial implementation allowed for a 
100 parameter named <parameter>printer driver location</parameter> 
101 to be used on a per share basis to specify the location of 
102 the driver files associated with that printer.  Another 
103 parameter named <parameter>printer driver</parameter> provided 
104 a means of defining the printer driver name to be sent to 
105 the client.
106 </para>
107  
108 <para>
109 These parameters, including <parameter>printer driver
110 file</parameter> parameter, are being depreciated and should not 
111 be used in new installations.  For more information on this change, 
112 you should refer to the <link linkend="MIGRATION">Migration section</link>
113 of this document.
114 </para>
115 </warning>
116
117 <sect2>
118 <title>Creating [print$]</title>        
119
120 <para>
121 In order to support the uploading of printer driver 
122 files, you must first configure a file share named [print$].  
123 The name of this share is hard coded in Samba's internals so 
124 the name is very important (print$ is the service used by 
125 Windows NT print servers to provide support for printer driver 
126 download).
127 </para>
128
129 <para>You should modify the server's smb.conf file to create the 
130 following file share (of course, some of the parameter values,
131 such as 'path' are arbitrary and should be replaced with
132 appropriate values for your site):</para>
133
134 <para><programlisting>
135 [print$]
136     path = /usr/local/samba/printers
137     guest ok = yes
138     browseable = yes
139     read only = yes
140     ; since this share is configured as read only, then we need
141     ; a 'write list'.  Check the file system permissions to make
142     ; sure this account can copy files to the share.  If this
143     ; is setup to a non-root account, then it should also exist
144     ; as a 'printer admin'
145     write list = ntadmin
146 </programlisting></para>
147         
148 <para>The <ulink url="smb.conf.5.html#WRITELIST"><parameter>
149 write list</parameter></ulink> is used to allow administrative 
150 level user accounts to have write access in order to update files 
151 on the share.  See the <ulink url="smb./conf.5.html">smb.conf(5) 
152 man page</ulink> for more information on configuring file shares.</para>
153         
154 <para>The requirement for <ulink url="smb.conf.5.html#GUESTOK"><command>guest 
155 ok = yes</command></ulink> depends upon how your
156 site is configured.  If users will be guaranteed to have 
157 an account on the Samba host, then this is a non-issue.</para>
158
159 <note>  
160 <title>Author's Note</title>
161
162 <para>
163 The non-issue is that if all your Windows NT users are guaranteed to be 
164 authenticated by the Samba server (such as a domain member server and the NT 
165 user has already been validated by the Domain Controller in 
166 order to logon to the Windows NT console), then guest access 
167 is not necessary.  Of course, in a workgroup environment where 
168 you just want to be able to print without worrying about 
169 silly accounts and security, then configure the share for 
170 guest access.  You'll probably want to add <ulink 
171 url="smb.conf.5.html#MAPTOGUEST"><command>map to guest = Bad User
172 </command></ulink> in the [global] section as well.  Make sure 
173 you understand what this parameter does before using it 
174 though. --jerry
175 </para>
176 </note>
177
178 <para>In order for a Windows NT print server to support 
179 the downloading of driver files by multiple client architectures,
180 it must create subdirectories within the [print$] service
181 which correspond to each of the supported client architectures.
182 Samba follows this model as well.</para>
183
184 <para>Next create the directory tree below the [print$] share 
185 for each architecture you wish to support.</para>
186
187 <para><programlisting>
188 [print$]-----
189         |-W32X86           ; "Windows NT x86"
190         |-WIN40            ; "Windows 95/98"
191         |-W32ALPHA         ; "Windows NT Alpha_AXP"
192         |-W32MIPS          ; "Windows NT R4000"
193         |-W32PPC           ; "Windows NT PowerPC"
194 </programlisting></para>
195
196 <warning>
197 <title>ATTENTION!  REQUIRED PERMISSIONS</title>
198         
199 <para>
200 In order to currently add a new driver to you Samba host, 
201 one of two conditions must hold true:
202 </para>
203                 
204 <itemizedlist>
205         <listitem><para>The account used to connect to the Samba host 
206         must have a uid of 0 (i.e. a root account)</para></listitem>
207                 
208         <listitem><para>The account used to connect to the Samba host
209         must be a member of the <ulink 
210         url="smb.conf.5.html#PRINTERADMIN"><parameter>printer 
211         admin</parameter></ulink> list.</para></listitem>
212 </itemizedlist>
213
214 <para>
215 Of course, the connected account must still possess access
216 to add files to the subdirectories beneath [print$]. Remember
217 that all file shares are set to 'read only' by default.
218 </para>
219 </warning>
220
221
222 <para>
223 Once you have created the required [print$] service and 
224 associated subdirectories, simply log onto the Samba server using 
225 a root (or <parameter>printer admin</parameter>) account
226 from a Windows NT 4.0 client.  Navigate to the "Printers" folder
227 on the Samba server.  You should see an initial listing of printers
228 that matches the printer shares defined on your Samba host.
229 </para>
230 </sect2>
231
232 <sect2>
233 <title>Setting Drivers for Existing Printers</title>
234
235 <para>The initial listing of printers in the Samba host's 
236 Printers folder will have no real printer driver assigned 
237 to them.  By default, in Samba 2.2.0 this driver name was set to 
238 <emphasis>NO PRINTER DRIVER AVAILABLE FOR THIS PRINTER</emphasis>.
239 Later versions changed this to a NULL string to allow the use
240 tof the local Add Printer Wizard on NT/2000 clients.
241 Attempting to view the printer properties for a printer
242 which has this default driver assigned will result in 
243 the error message:</para>
244
245 <para>
246 <emphasis>Device settings cannot be displayed.  The driver 
247 for the specified printer is not installed, only spooler 
248 properties will be displayed.  Do you want to install the 
249 driver now?</emphasis>
250 </para>
251
252 <para>
253 Click "No" in the error dialog and you will be presented with
254 the printer properties window.  The way assign a driver to a 
255 printer is to either
256 </para>
257         
258 <itemizedlist>
259         <listitem><para>Use the "New Driver..." button to install 
260         a new printer driver, or</para></listitem>
261         
262         <listitem><para>Select a driver from the popup list of 
263         installed drivers.  Initially this list will be empty.</para>
264         </listitem>
265 </itemizedlist>
266         
267 <para>If you wish to install printer drivers for client 
268 operating systems other than "Windows NT x86", you will need 
269 to use the "Sharing" tab of the printer properties dialog.</para>
270
271 <para>Assuming you have connected with a root account, you 
272 will also be able modify other printer properties such as 
273 ACLs and device settings using this dialog box.</para>
274
275 <para>A few closing comments for this section, it is possible 
276 on a Windows NT print server to have printers
277 listed in the Printers folder which are not shared.  Samba does
278 not make this distinction.  By definition, the only printers of
279 which Samba is aware are those which are specified as shares in
280 <filename>smb.conf</filename>.</para>
281   
282 <para>Another interesting side note is that Windows NT clients do
283 not use the SMB printer share, but rather can print directly 
284 to any printer on another Windows NT host using MS-RPC.  This
285 of course assumes that the printing client has the necessary
286 privileges on the remote host serving the printer.  The default
287 permissions assigned by Windows NT to a printer gives the "Print"
288 permissions to the "Everyone" well-known group.
289 </para>
290
291 </sect2>        
292
293
294 <sect2>
295 <title>Support a large number of printers</title>
296                 
297 <para>One issue that has arisen during the development
298 phase of Samba 2.2 is the need to support driver downloads for
299 100's of printers.  Using the Windows NT APW is somewhat 
300 awkward to say the list.  If more than one printer are using the 
301 same driver, the <ulink url="rpcclient.1.html"><command>rpcclient's
302 setdriver command</command></ulink> can be used to set the driver
303 associated with an installed driver.  The following is example
304 of how this could be accomplished:</para>
305                 
306 <para><programlisting> 
307 <prompt>$ </prompt>rpcclient pogo -U root%secret -c "enumdrivers"
308 Domain=[NARNIA] OS=[Unix] Server=[Samba 2.2.0-alpha3]
309  
310 [Windows NT x86]
311 Printer Driver Info 1:
312      Driver Name: [HP LaserJet 4000 Series PS]
313  
314 Printer Driver Info 1:
315      Driver Name: [HP LaserJet 2100 Series PS]
316  
317 Printer Driver Info 1:
318      Driver Name: [HP LaserJet 4Si/4SiMX PS]
319                                   
320 <prompt>$ </prompt>rpcclient pogo -U root%secret -c "enumprinters"
321 Domain=[NARNIA] OS=[Unix] Server=[Samba 2.2.0-alpha3]
322      flags:[0x800000]
323      name:[\\POGO\hp-print]
324      description:[POGO\\POGO\hp-print,NO DRIVER AVAILABLE FOR THIS PRINTER,]
325      comment:[]
326                                   
327 <prompt>$ </prompt>rpcclient pogo -U root%secret \
328 <prompt>&gt; </prompt> -c "setdriver hp-print \"HP LaserJet 4000 Series PS\""
329 Domain=[NARNIA] OS=[Unix] Server=[Samba 2.2.0-alpha3]
330 Successfully set hp-print to driver HP LaserJet 4000 Series PS.
331 </programlisting></para>
332 </sect2>
333
334
335
336 <sect2>
337 <title>Adding New Printers via the Windows NT APW</title>
338         
339 <para>
340 By default, Samba offers all printer shares defined in <filename>smb.conf</filename>
341 in the "Printers..." folder.  Also existing in this folder is the Windows NT 
342 Add Printer Wizard icon.  The APW will be show only if
343 </para>
344
345 <itemizedlist>
346         <listitem><para>The connected user is able to successfully
347         execute an OpenPrinterEx(\\server) with administrative
348         priviledges (i.e. root or <parameter>printer admin</parameter>).
349         </para></listitem>
350         
351         <listitem><para><ulink url="smb.conf.5.html#SHOWADDPRINTERWIZARD"><parameter>show 
352         add printer wizard = yes</parameter></ulink> (the default).
353         </para></listitem>
354 </itemizedlist>
355
356 <para>
357 In order to be able to use the APW to successfully add a printer to a Samba 
358 server, the <ulink url="smb.conf.5.html#ADDPRINTERCOMMAND"><parameter>add 
359 printer command</parameter></ulink> must have a defined value.  The program
360 hook must successfully add the printer to the system (i.e. 
361 <filename>/etc/printcap</filename> or appropriate files) and 
362 <filename>smb.conf</filename> if necessary.
363 </para>
364
365 <para>
366 When using the APW from a client, if the named printer share does 
367 not exist, <command>smbd</command> will execute the <parameter>add printer 
368 command</parameter> and reparse to the <filename>smb.conf</filename>
369 to attempt to locate the new printer share.  If the share is still not defined,
370 an error of "Access Denied" is returned to the client.  Note that the 
371 <parameter>add printer program</parameter> is executed under the context
372 of the connected user, not necessarily a root account.
373 </para>
374
375 <para>
376 There is a complementing <ulink url="smb.conf.5.html#DELETEPRINTERCOMMAND"><parameter>delete
377 printer command</parameter></ulink> for removing entries from the "Printers..."
378 folder.
379 </para>
380
381 </sect2>
382
383
384 <sect2>
385 <title>Samba and Printer Ports</title>
386
387 <para>
388 Windows NT/2000 print servers associate a port with each printer.  These normally
389 take the form of LPT1:, COM1:, FILE:, etc...  Samba must also support the
390 concept of ports associated with a printer.  By default, only one printer port,
391 named "Samba Printer Port", exists on a system.  Samba does not really a port in
392 order to print, rather it is a requirement of Windows clients.  
393 </para>
394
395 <para>
396 Note that Samba does not support the concept of "Printer Pooling" internally 
397 either.  This is when a logical printer is assigned to multiple ports as 
398 a form of load balancing or fail over.
399 </para>
400
401 <para>
402 If you require that multiple ports be defined for some reason,
403 <filename>smb.conf</filename> possesses a <ulink 
404 url="smb.conf.5.html#ENUMPORTSCOMMAND"><parameter>enumports 
405 command</parameter></ulink> which can be used to define an external program 
406 that generates a listing of ports on a system.
407 </para>
408
409 </sect2>
410
411 </sect1>
412
413
414 <sect1>
415         <title>The Imprints Toolset</title>
416         
417         <para>The Imprints tool set provides a UNIX equivalent of the 
418         Windows NT Add Printer Wizard.  For complete information, please 
419         refer to the Imprints web site at <ulink url="http://imprints.sourceforge.net/">
420         http://imprints.sourceforge.net/</ulink> as well as the documentation 
421         included with the imprints source distribution.  This section will 
422         only provide a brief introduction to the features of Imprints.</para>
423         
424         
425         <sect2>
426                 <title>What is Imprints?</title>
427
428                 <para>Imprints is a collection of tools for supporting the goals 
429                 of</para>
430                 
431                 <itemizedlist>
432                         <listitem><para>Providing a central repository information 
433                         regarding Windows NT and 95/98 printer driver packages</para>
434                         </listitem>
435                         
436                         <listitem><para>Providing the tools necessary for creating 
437                         the Imprints printer driver packages.</para></listitem>
438                         
439                         <listitem><para>Providing an installation client which 
440                         will obtain and install printer drivers on remote Samba 
441                         and Windows NT 4 print servers.</para></listitem>
442                 </itemizedlist>
443                 
444         </sect2>
445         
446         
447         <sect2>
448                 <title>Creating Printer Driver Packages</title>
449                 
450                 <para>The process of creating printer driver packages is beyond
451                 the scope of this document (refer to Imprints.txt also included
452                 with the Samba distribution for more information).  In short,
453                 an Imprints driver package is a gzipped tarball containing the
454                 driver files, related INF files, and a control file needed by the
455                 installation client.</para>
456         </sect2>
457         
458         
459         <sect2>
460                 <title>The Imprints server</title>
461                 
462                 <para>The Imprints server is really a database server that 
463                 may be queried via standard HTTP mechanisms.  Each printer 
464                 entry in the database has an associated URL for the actual
465                 downloading of the package.  Each package is digitally signed
466                 via GnuPG which can be used to verify that package downloaded
467                 is actually the one referred in the Imprints database.  It is 
468                 <emphasis>not</emphasis> recommended that this security check 
469                 be disabled.</para>
470         </sect2>
471         
472         <sect2>
473                 <title>The Installation Client</title>
474
475                 <para>More information regarding the Imprints installation client 
476                 is available in the <filename>Imprints-Client-HOWTO.ps</filename> 
477                 file included with the imprints source package.</para>
478
479                 <para>The Imprints installation client comes in two forms.</para>
480
481                 <itemizedlist>
482                         <listitem><para>a set of command line Perl scripts</para>
483                         </listitem>
484                         
485                         <listitem><para>a GTK+ based graphical interface to 
486                         the command line perl scripts</para></listitem>
487                 </itemizedlist>
488                 
489                 <para>The installation client (in both forms) provides a means
490                 of querying the Imprints database server for a matching
491                 list of known printer model names as well as a means to 
492                 download and install the drivers on remote Samba and Windows
493                 NT print servers.</para>
494
495                 <para>The basic installation process is in four steps and 
496                 perl code is wrapped around <command>smbclient</command> 
497                 and <command>rpcclient</command>.</para>
498
499 <para><programlisting>  
500 foreach (supported architecture for a given driver)
501 {
502      1.  rpcclient: Get the appropriate upload directory 
503          on the remote server
504      2.  smbclient: Upload the driver files
505      3.  rpcclient: Issues an AddPrinterDriver() MS-RPC
506 }
507         
508 4.  rpcclient: Issue an AddPrinterEx() MS-RPC to actually
509     create the printer
510 </programlisting></para>
511                 
512                 <para>One of the problems encountered when implementing 
513                 the Imprints tool set was the name space issues between 
514                 various supported client architectures.  For example, Windows 
515                 NT includes a driver named "Apple LaserWriter II NTX v51.8" 
516                 and Windows 95 callsits version of this driver "Apple 
517                 LaserWriter II NTX"</para>
518                 
519                 <para>The problem is how to know what client drivers have 
520                 been uploaded for a printer.  As astute reader will remember 
521                 that the Windows NT Printer Properties dialog only includes 
522                 space for one printer driver name.  A quick look in the 
523                 Windows NT 4.0 system registry at</para>
524         
525                 <para><filename>HKLM\System\CurrentControlSet\Control\Print\Environment
526                 </filename></para>
527                 
528                 <para>will reveal that Windows NT always uses the NT driver 
529                 name.  This is ok as Windows NT always requires that at least 
530                 the Windows NT version of the printer driver is present.  
531                 However, Samba does not have the requirement internally.  
532                 Therefore, how can you use the NT driver name if is has not 
533                 already been installed?</para>
534                 
535                 <para>The way of sidestepping this limitation is to require 
536                 that all Imprints printer driver packages include both the Intel 
537                 Windows NT and 95/98 printer drivers and that NT driver is 
538                 installed first.</para>
539         </sect2>
540         
541 </sect1>
542
543
544 <sect1>
545 <title><anchor id="MIGRATION">Migration to from Samba 2.0.x to 2.2.x</title>
546
547 <para>
548 Given that printer driver management has changed (we hope improved) in 
549 2.2 over prior releases, migration from an existing setup to 2.2 can 
550 follow several paths.
551 </para>
552
553 <para>
554 Windows clients have a tendency to remember things for quite a while.
555 For example, if a Windows NT client has attached to a Samba 2.0 server,
556 it will remember the server as a LanMan printer server.  Upgrading 
557 the Samba host to 2.2 makes support for MSRPC printing possible, but 
558 the NT client will still remember the previous setting.
559 </para>
560
561 <para>
562 In order to give an NT client printing "amesia" (only necessary if you 
563 want to use the newer MSRPC printing functionality in Samba), delete 
564 the registry keys associated with the print server contained in 
565 <constant>[HKLM\SYSTEM\CurrentControlSet\Control\Print]</constant>.  The 
566 spooler service on the client should be stopped prior to doing this:
567 </para>
568
569 <para>
570 <prompt>C:\WINNT\ ></prompt> <userinput>net stop spooler</userinput>
571 </para>
572
573 <para>
574 <emphasis>All the normal disclaimers about editing the registry go 
575 here.</emphasis>  Be careful, and know what you are doing.
576 </para>
577
578 <para>
579 The spooler service should be restarted after you have finished 
580 removing the appropriate registry entries by replacing the 
581 <command>stop</command> command above with <command>start</command>.
582 </para>
583
584 <para>
585 Windows 9x clients will continue to use LanMan printing calls
586 with a 2.2 Samba server so there is no need to perform any of these
587 modifications on non-NT clients.
588 </para>
589         
590 <warning>
591 <title>Achtung!</title>
592
593 <para>
594 The following smb.conf parameters are considered to be depreciated and will 
595 be removed soon.  Do not use them in new installations
596 </para>
597                 
598 <itemizedlist>
599         <listitem><para><parameter>printer driver file (G)</parameter>
600         </para></listitem>
601                         
602         <listitem><para><parameter>printer driver (S)</parameter>
603         </para></listitem>
604                         
605         <listitem><para><parameter>printer driver location (S)</parameter>
606         </para></listitem>
607 </itemizedlist>
608 </warning>
609
610
611 <para>
612 Here are the possible scenarios for supporting migration:
613 </para>
614         
615 <itemizedlist>
616         <listitem><para>If you do not desire the new Windows NT 
617         print driver support, nothing needs to be done.  
618         All existing parameters work the same.</para></listitem>
619
620         <listitem><para>If you want to take advantage of NT printer 
621         driver support but do not want to migrate the 
622         9x drivers to the new setup, the leave the existing 
623         printers.def file.  When smbd attempts to locate a 
624         9x driver for the printer in the TDB and fails it 
625         will drop down to using the printers.def (and all 
626         associated parameters).  The <command>make_printerdef</command> 
627         tool will also remain for backwards compatibility but will 
628         be moved to the "this tool is the old way of doing it" 
629         pile.</para></listitem>
630
631         <listitem><para>If you install a Windows 9x driver for a printer 
632         on your Samba host (in the printing TDB), this information will 
633         take precedence and the three old printing parameters
634         will be ignored (including print driver location).</para></listitem>
635
636         <listitem><para>If you want to migrate an existing <filename>printers.def</filename> 
637         file into the new setup, the current only solution is to use the Windows 
638         NT APW to install the NT drivers and the 9x  drivers.  This can be scripted 
639         using <command>smbclient</command> and <command>rpcclient</command>.  See the 
640         Imprints installation client at <ulink 
641         url="http://imprints.sourceforge.net/">http://imprints.sourceforge.net/</ulink> 
642         for an example.
643         </para></listitem>
644 </itemizedlist>
645
646 </sect1>
647
648
649 <!--
650
651   This comment from rpc_server/srv_spoolss_nt.c:_spoolss_open_printer_ex()
652   needs to be added into a section probably.  This is to remind me it needs 
653   to be done.  -jerry
654
655                 /*
656                  * If the openprinterex rpc call contains a devmode,
657                  * it's a per-user one. This per-user devmode is derivated
658                  * from the global devmode. Openprinterex() contains a per-user
659                  * devmode for when you do EMF printing and spooling.
660                  * In the EMF case, the NT workstation is only doing half the job
661                  * of rendering the page. The other half is done by running the printer
662                  * driver on the server.
663                  * The EMF file doesn't contain the page description (paper size, orientation, ...).
664                  * The EMF file only contains what is to be printed on the page.
665                  * So in order for the server to know how to print, the NT client sends
666                  * a devicemode attached to the openprinterex call.
667                  * But this devicemode is short lived, it's only valid for the current print job.
668                  *
669                  * If Samba would have supported EMF spooling, this devicemode would
670                  * have been attached to the handle, to sent it to the driver to correctly
671                  * rasterize the EMF file.
672                  *
673                  * As Samba only supports RAW spooling, we only receive a ready-to-print file,
674                  * we just act as a pass-thru between windows and the printer.
675                  *
676                  * In order to know that Samba supports only RAW spooling, NT has to call
677                  * getprinter() at level 2 (attribute field) or NT has to call startdoc()
678                  * and until NT sends a RAW job, we refuse it.
679                  *
680                  * But to call getprinter() or startdoc(), you first need a valid handle,
681                  * and to get an handle you have to call openprintex(). Hence why you have
682                  * a devicemode in the openprinterex() call.
683                  *
684                  *
685                  * Differences between NT4 and NT 2000.
686                  * NT4:
687                  * 
688                  * On NT4, you only have a global devicemode. This global devicemode can be changed
689                  * by the administrator (or by a user with enough privs). Everytime a user
690                  * wants to print, the devicemode is resetted to the default. In Word, everytime
691                  * you print, the printer's characteristics are always reset to the global devicemode.
692                  *
693                  * NT 2000:
694                  * 
695                  * In W2K, there is the notion of per-user devicemode. The first time you use
696                  * a printer, a per-user devicemode is build from the global devicemode.
697                  * If you change your per-user devicemode, it is saved in the registry, under the
698                  * H_KEY_CURRENT_KEY sub_tree. So that everytime you print, you have your default
699                  * printer preferences available.
700                  *
701                  * To change the per-user devicemode: it's the "Printing Preferences ..." button
702                  * on the General Tab of the printer properties windows.
703                  *
704                  * To change the global devicemode: it's the "Printing Defaults..." button
705                  * on the Advanced Tab of the printer properties window.
706 -->
707
708 </chapter>