- better traces
[wine] / dlls / setupapi / setupx16.h
1 /*
2  * Copyright 2000 Andreas Mohr for CodeWeavers
3  *
4  * This library is free software; you can redistribute it and/or
5  * modify it under the terms of the GNU Lesser General Public
6  * License as published by the Free Software Foundation; either
7  * version 2.1 of the License, or (at your option) any later version.
8  *
9  * This library is distributed in the hope that it will be useful,
10  * but WITHOUT ANY WARRANTY; without even the implied warranty of
11  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
12  * Lesser General Public License for more details.
13  *
14  * You should have received a copy of the GNU Lesser General Public
15  * License along with this library; if not, write to the Free Software
16  * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
17  */
18
19 #ifndef __SETUPX16_H
20 #define __SETUPX16_H
21
22 #include "wine/windef16.h"
23
24 typedef UINT16 DI_FUNCTION16;
25 typedef UINT16 HINF16;
26 typedef UINT16 LOGDISKID16;
27 typedef UINT16 VHSTR;
28
29 #define LINE_LEN        256
30
31 /* error codes stuff */
32
33 typedef UINT16 RETERR16;
34 #define OK              0
35 #define IP_ERROR        (UINT16)100
36 #define TP_ERROR        (UINT16)200
37 #define VCP_ERROR       (UINT16)300
38 #define GEN_ERROR       (UINT16)400
39 #define DI_ERROR        (UINT16)500
40
41 enum {
42         ERR_IP_INVALID_FILENAME = IP_ERROR+1,
43         ERR_IP_ALLOC_ERR,
44         ERR_IP_INVALID_SECT_NAME,
45         ERR_IP_OUT_OF_HANDLES,
46         ERR_IP_INF_NOT_FOUND,
47         ERR_IP_INVALID_INFFILE,
48         ERR_IP_INVALID_HINF,
49         ERR_IP_INVALID_FIELD,
50         ERR_IP_SECT_NOT_FOUND,
51         ERR_IP_END_OF_SECTION,
52         ERR_IP_PROFILE_NOT_FOUND,
53         ERR_IP_LINE_NOT_FOUND,
54         ERR_IP_FILEREAD,
55         ERR_IP_TOOMANYINFFILES,
56         ERR_IP_INVALID_SAVERESTORE,
57         ERR_IP_INVALID_INFTYPE
58 };
59
60 /****** virtual copy operations ******/
61
62 typedef DWORD LPEXPANDVTBL;
63
64 typedef struct {
65         DWORD           dwSoFar;
66         DWORD           dwTotal;
67 } VCPPROGRESS, *LPVCPPROGRESS;
68
69 typedef struct {
70         WORD            cbSize;
71         LOGDISKID16     ldid;
72         VHSTR           vhstrRoot;
73         VHSTR           vhstrVolumeLabel;
74         VHSTR           vhstrDiskName;
75         WORD            wVolumeTime;
76         WORD            wVolumeDate;
77         DWORD           dwSerialNumber;
78         WORD            fl;
79         LPARAM          lparamRef;
80
81         VCPPROGRESS     prgFileRead;
82         VCPPROGRESS     prgByteRead;
83
84         VCPPROGRESS     prgFileWrite;
85         VCPPROGRESS     prgByteWrite;
86 } VCPDISKINFO, *LPVCPDISKINFO;
87
88 typedef struct {
89         LOGDISKID16     ldid;
90         VHSTR           vhstrDir;
91         VHSTR           vhstrFileName;
92 } VCPFILESPEC, *LPVCPFILESPEC;
93
94 typedef struct {
95         UINT16          uiMDate;
96         UINT16          uiMTime;
97         UINT16          uiADate;
98         UINT16          uiATime;
99         UINT16          uiAttr;
100         DWORD           llenIn;
101         DWORD           llenOut;
102 } VCPFATTR, *LPVCPFATTR;
103
104 typedef struct {
105         UINT16          uDate;
106         UINT16          uTime;
107         DWORD           dwSize;
108 } VCPFILESTAT, *LPVCPFILESTAT;
109
110 typedef struct
111 {
112         HFILE16         hFileSrc;
113         HFILE16         hFileDst;
114         VCPFATTR        fAttr;
115         WORD            dosError;
116         VHSTR           vhstrFileName;
117         WPARAM          vcpm;
118 } VIRTNODEEX, *LPVIRTNODEEX;
119
120 typedef struct {
121         WORD            cbSize;
122         VCPFILESPEC     vfsSrc;
123         VCPFILESPEC     vfsDst;
124         WORD            fl;
125         LPARAM          lParam;
126         LPEXPANDVTBL    lpExpandVtbl;
127         LPVIRTNODEEX    lpvnex;
128         VHSTR           vhstrDstFinalName;
129         VCPFILESTAT     vFileStat;
130 } VIRTNODE, *LPVIRTNODE;
131
132 typedef struct {
133         WORD            cbSize;
134         VCPPROGRESS     prgDiskRead;
135         VCPPROGRESS     prgFileRead;
136         VCPPROGRESS     prgByteRead;
137
138         VCPPROGRESS     prgDiskWrite;
139         VCPPROGRESS     prgFileWrite;
140         VCPPROGRESS     prgByteWrite;
141
142         LPVCPDISKINFO   lpvdiIn;
143         LPVCPDISKINFO   lpvdiOut;
144         LPVIRTNODE      lpvn;
145 } VCPSTATUS, *LPVCPSTATUS;
146
147 #define CNFL_BACKUP             0x0001
148 #define CNFL_DELETEONFAILURE    0x0002
149 #define CNFL_RENAMEONSUCCESS    0x0004
150 #define CNFL_CONTINUATION       0x0008
151 #define CNFL_SKIPPED            0x0010
152 #define CNFL_IGNOREERRORS       0x0020
153 #define CNFL_RETRYFILE          0x0040
154 #define CNFL_COPIED             0x0080
155 #define VNFL_UNIQUE             0x0000
156 #define VNFL_MULTIPLEOK         0x0100
157 #define VNFL_DESTROYOLD         0x0200
158 #define VNFL_COPY               0x0000
159 #define VNFL_DELETE             0x0800
160 #define VNFL_RENAME             0x1000
161 #define VNFL_NODE_TYPE          (VNFL_RENAME|VNFL_DELETE|VNFL_COPY)
162 #define VNFL_CREATED            0x2000
163 #define VNFL_REJECTED           0x4000
164 #define VNFL_DEVICEINSTALLER    0x8000
165
166 enum {
167         ERR_VCP_IOFAIL = VCP_ERROR+1,
168         ERR_VCP_STRINGTOOLONG,
169         ERR_VCP_NOMEM,
170         ERR_VCP_QUEUEFULL,
171         ERR_VCP_NOVHSTR,
172         ERR_VCP_OVERFLOW,
173         ERR_VCP_BADARG,
174         ERR_VCP_UNINIT,
175         ERR_VCP_NOTFOUND,
176         ERR_VCP_BUSY,
177         ERR_VCP_INTERRUPTED,
178         ERR_VCP_BADDEST,
179         ERR_VCP_SKIPPED,
180         ERR_VCP_IO,
181         ERR_VCP_LOCKED,
182         ERR_VCP_WRONGDISK,
183         ERR_VCP_CHANGEMODE,
184         ERR_VCP_LDDINVALID,
185         ERR_VCP_LDDFIND,
186         ERR_VCP_LDDUNINIT,
187         ERR_VCP_LDDPATH_INVALID,
188         ERR_VCP_NOEXPANSION,
189         ERR_VCP_NOTOPEN,
190         ERR_VCP_NO_DIGITAL_SIGNATURE_CATALOG,
191         ERR_VCP_NO_DIGITAL_SIGNATURE_FILE
192 };
193
194 #define VCPN_OK         0
195 #define VCPN_PROCEED    0
196 #define VCPN_ABORT      -1
197 #define VCPN_RETRY      -2
198 #define VCPN_IGNORE     -3
199 #define VCPN_SKIP       -4
200 #define VCPN_FORCE      -5
201 #define VCPN_DEFER      -6
202 #define VCPN_FAIL       -7
203 #define VCPN_RETRYFILE  -8
204
205 #define VCPFL_ABANDON           0x00
206 #define VCPFL_BACKUP            0x01
207 #define VCPFL_COPY              0x02
208 #define VCPFL_BACKUPANDCOPY     (VCPFL_BACKUP|VCPFL_COPY)
209 #define VCPFL_INSPECIFIEDORDER  0x04
210 #define VCPFL_DELETE            0x08
211 #define VCPFL_RENAME            0x10
212 #define VCPFL_ALL               (VCPFL_COPY|VCPFL_DELETE|VCPFL_RENAME)
213
214 #define CFNL_BACKUP             0x0001
215 #define CFNL_DELETEONFAILURE    0x0002
216 #define CFNL_RENAMEONSUCCESS    0x0004
217 #define CFNL_CONTINUATION       0x0008
218 #define CFNL_SKIPPED            0x0010
219 #define CFNL_IGNOREERRORS       0x0020
220 #define CFNL_RETRYFILE          0x0040
221 #define CFNL_COPIED             0x0080
222 #define VFNL_MULTIPLEOK         0x0100
223 #define VFNL_DESTROYOLD         0x0200
224 #define VFNL_NOW                0x0400
225 #define VFNL_COPY               0x0000
226 #define VFNL_DELETE             0x0800
227 #define VFNL_RENAME             0x1000
228 #define VFNL_CREATED            0x2000
229 #define VFNL_REJECTED           0x4000
230 #define VCPM_DISKCLASS          0x01
231 #define VCPM_DISKFIRST          0x0100
232 #define VCPM_DISKLAST           0x01ff
233
234 enum {
235         VCPM_DISKCREATEINFO = VCPM_DISKFIRST,
236         VCPM_DISKGETINFO,
237         VCPM_DISKDESTROYINFO,
238         VCPM_DISKPREPINFO,
239         VCPM_DISKENSURE,
240         VCPM_DISKPROMPT,
241         VCPM_DISKFORMATBEGIN,
242         VCPM_DISKFORMATTING,
243         VCPM_DISKFORMATEND
244 };
245
246 #define VCPM_FILEINCLASS        0x02
247 #define VCPM_FILEOUTCLASS       0x03
248 #define VCPM_FILEFIRSTIN        0x0200
249 #define VCPM_FILEFIRSTOUT       0x0300
250 #define VCPM_FILELAST           0x03ff
251
252 enum {
253         VCPM_FILEOPENIN = VCPM_FILEFIRSTIN,
254         VCPM_FILEGETFATTR,
255         VCPM_FILECLOSEIN,
256         VCPM_FILECOPY,
257         VCPM_FILENEEDED,
258
259         VCPM_FILEOPENOUT = VCPM_FILEFIRSTOUT,
260         VCPM_FILESETFATTR,
261         VCPM_FILECLOSEOUT,
262         VCPM_FILEFINALIZE,
263         VCPM_FILEDELETE,
264         VCPM_FILERENAME
265 };
266
267 #define VCPM_NODECLASS          0x04
268 #define VCPM_NODEFIRST          0x0400
269 #define VCPM_NODELAST           0x04ff
270
271 enum {
272         VCPM_NODECREATE = VCPM_NODEFIRST,
273         VCPM_NODEACCEPT,
274         VCPM_NODEREJECT,
275         VCPM_NODEDESTROY,
276         VCPM_NODECHANGEDESTDIR,
277         VCPM_NODECOMPARE
278 };
279
280 #define VCPM_TALLYCLASS         0x05
281 #define VCPM_TALLYFIRST         0x0500
282 #define VCPM_TALLYLAST          0x05ff
283
284 enum {
285         VCPM_TALLYSTART = VCPM_TALLYFIRST,
286         VCPM_TALLYEND,
287         VCPM_TALLYFILE,
288         VCPM_TALLYDISK
289 };
290
291 #define VCPM_VERCLASS           0x06
292 #define VCPM_VERFIRST           0x0600
293 #define VCPM_VERLAST            0x06ff
294
295 enum {
296         VCPM_VERCHECK = VCPM_VERFIRST,
297         VCPM_VERCHECKDONE,
298         VCPM_VERRESOLVECONFLICT
299 };
300
301 #define VCPM_VSTATCLASS         0x07
302 #define VCPM_VSTATFIRST         0x0700
303 #define VCPM_VSTATLAST          0x07ff
304
305 enum {
306         VCPM_VSTATSTART = VCPM_VSTATFIRST,
307         VCPM_VSTATEND,
308         VCPM_VSTATREAD,
309         VCPM_VSTATWRITE,
310         VCPM_VSTATNEWDISK,
311         VCPM_VSTATCLOSESTART,
312         VCPM_VSTATCLOSEEND,
313         VCPM_VSTATBACKUPSTART,
314         VCPM_VSTATBACKUPEND,
315         VCPM_VSTATRENAMESTART,
316         VCPM_VSTATRENAMEEND,
317         VCPM_VSTATCOPYSTART,
318         VCPM_VSTATCOPYEND,
319         VCPM_VSTATDELETESTART,
320         VCPM_VSTATDELETEEND,
321         VCPM_VSTATPATHCHECKSTART,
322         VCPM_VSTATPATHCHECKEND,
323         VCPM_VSTATCERTIFYSTART,
324         VCPM_VSTATCERTIFYEND,
325         VCPM_VSTATUSERABORT,
326         VCPM_VSTATYIELD
327 };
328
329 #define VCPM_PATHCLASS          0x08
330 #define VCPM_PATHFIRST          0x0800
331 #define VCPM_PATHLAST           0x08ff
332
333 enum {
334         VCPM_BUILDPATH = VCPM_PATHFIRST,
335         VCPM_UNIQUEPATH,
336         VCPM_CHECKPATH
337 };
338
339 #define VCPM_PATCHCLASS         0x09
340 #define VCPM_PATCHFIRST         0x0900
341 #define VCPM_PATCHLAST          0x09ff
342
343 enum {
344         VCPM_FILEPATCHBEFORECPY = VCPM_PATCHFIRST,
345         VCPM_FILEPATCHAFTERCPY,
346         VCPM_FILEPATCHINFOPEN,
347         VCPM_FILEPATCHINFCLOSE
348 };
349
350 #define VCPM_CERTCLASS          0x0a
351 #define VCPM_CERTFIRST          0x0a00
352 #define VCPM_CERTLAST           0x0aff
353
354 enum {
355         VCPM_FILECERTIFY = VCPM_CERTFIRST,
356         VCPM_FILECERTIFYWARN
357 };
358
359 typedef LRESULT (CALLBACK *VIFPROC)(LPVOID lpvObj, UINT16 uMsg, WPARAM wParam, LPARAM lParam, LPARAM lparamRef);
360
361 typedef int (CALLBACK *VCPENUMPROC)(LPVIRTNODE lpvn, LPARAM lparamRef);
362
363 RETERR16 WINAPI VcpOpen16(VIFPROC vifproc, LPARAM lparamMsgRef);
364
365 /* VcpQueueCopy flags */
366 #define VNLP_SYSCRITICAL        0x0001
367 #define VNLP_SETUPCRITICAL      0x0002
368 #define VNLP_NOVERCHECK         0x0004
369 #define VNLP_FORCETEMP          0x0008
370 #define VNLP_IFEXISTS           0x0010
371 #define VNLP_KEEPNEWER          0x0020
372 #define VNLP_PATCHIFEXIST       0x0040
373 #define VNLP_NOPATCH            0x0080
374 #define VNLP_CATALOGCERT        0x0100
375 #define VNLP_NEEDCERTIFY        0x0200
376 #define VNLP_COPYIFEXISTS       0x0400
377
378 RETERR16 WINAPI VcpQueueCopy16(
379         LPCSTR lpszSrcFileName, LPCSTR lpszDstFileName,
380         LPCSTR lpszSrcDir, LPCSTR lpszDstDir,
381         LOGDISKID16 ldidSrc, LOGDISKID16 ldidDst,
382         LPEXPANDVTBL lpExpandVtbl,
383         WORD fl, LPARAM lParam
384 );
385 RETERR16 VcpFlush16(WORD fl, LPCSTR lpszBackupDest);
386 RETERR16 WINAPI VcpClose16(WORD fl, LPCSTR lpszBackupDest);
387
388 /* VcpExplain flags */
389 enum {
390         VCPEX_SRC_DISK,
391         VCPEX_SRC_CABINET,
392         VCPEX_SRC_LOCN,
393         VCPEX_DST_LOCN,
394         VCPEX_SRC_FILE,
395         VCPEX_DST_FILE,
396         VCPEX_DST_FILE_FINAL,
397         VCPEX_DOS_ERROR,
398         VCPEX_MESSAGE,
399         VCPEX_DOS_SOLUTION,
400         VCPEX_SRC_FULL,
401         VCPEX_DST_FULL,
402         VCPEX_DST_FULL_FINAL
403 };
404
405 LPCSTR WINAPI VcpExplain16(LPVIRTNODE lpVn, DWORD dwWhat);
406
407 /****** logical disk management ******/
408
409 typedef struct _LOGDISKDESC_S { /* ldd */
410         WORD        cbSize;       /* struct size */
411         LOGDISKID16 ldid;         /* logical disk ID */
412         LPSTR       pszPath;      /* path this descriptor points to */
413         LPSTR       pszVolLabel;  /* volume label of the disk related to it */
414         LPSTR       pszDiskName;  /* name of this disk */
415         WORD        wVolTime;     /* modification time of volume label */
416         WORD        wVolDate;     /* modification date */
417         DWORD       dwSerNum;     /* serial number of disk */
418         WORD        wFlags;
419 } LOGDISKDESC_S, *LPLOGDISKDESC;
420
421 /** logical disk identifiers (LDID) **/
422
423 /* predefined LDIDs */
424 #define LDID_PREDEF_START       0x0001
425 #define LDID_PREDEF_END         0x7fff
426
427 /* registry-assigned LDIDs */
428 #define LDID_VAR_START          0x7000
429 #define LDID_VAR_END            0x7fff
430
431 /* dynamically assigned LDIDs */
432 #define LDID_ASSIGN_START       0x8000
433 #define LDID_ASSIGN_END         0xbfff
434
435 #define LDID_NULL               0
436 #define LDID_ABSOLUTE           ((UINT)-1)
437 #define LDID_SRCPATH            1               /* setup source path */
438 #define LDID_SETUPTEMP          2               /* setup temp dir */
439 #define LDID_UNINSTALL          3               /* uninstall dir */
440 #define LDID_BACKUP             4               /* backup dir */
441 #define LDID_SETUPSCRATCH       5               /* setup scratch dir */
442 #define LDID_WIN                10              /* win dir */
443 #define LDID_SYS                11              /* win system dir */
444 #define LDID_IOS                12              /* win Iosubsys dir */
445 #define LDID_CMD                13              /* win command dir */
446 #define LDID_CPL                14              /* win control panel dir */
447 #define LDID_PRINT              15              /* win printer dir */
448 #define LDID_MAIL               16              /* win mail dir */
449 #define LDID_INF                17              /* win inf dir */
450 #define LDID_HELP               18              /* win help dir */
451 #define LDID_WINADMIN           19              /* admin dir */
452 #define LDID_FONTS              20              /* win fonts dir */
453 #define LDID_VIEWERS            21              /* win viewers dir */
454 #define LDID_VMM32              22              /* win VMM32 dir */
455 #define LDID_COLOR              23              /* win color mngment dir */
456 #define LDID_APPS               24              /* win apps dir */
457 #define LDID_SHARED             25              /* win shared dir */
458 #define LDID_WINBOOT            26              /* guaranteed win boot drive */
459 #define LDID_MACHINE            27              /* machine specific files */
460 #define LDID_HOST_WINBOOT       28
461 #define LDID_BOOT               30              /* boot drive root dir */
462 #define LDID_BOOT_HOST          31              /* boot drive host root dir */
463 #define LDID_OLD_WINBOOT        32              /* root subdir */
464 #define LDID_OLD_WIN            33              /* old windows dir */
465
466 /* flags for GenInstall() */
467 #define GENINSTALL_DO_FILES             1
468 #define GENINSTALL_DO_INI               2
469 #define GENINSTALL_DO_REG               4
470 #define GENINSTALL_DO_INI2REG           8
471 #define GENINSTALL_DO_CFGAUTO           16
472 #define GENINSTALL_DO_LOGCONFIG         32
473 #define GENINSTALL_DO_REGSRCPATH        64
474 #define GENINSTALL_DO_PERUSER           128
475
476 #define GEINISTALL_DO_INIREG            14
477 #define GENINSTALL_DO_ALL               255
478
479 /*
480  * flags for InstallHinfSection()
481  * 128 can be added, too. This means that the .inf file is provided by you
482  * instead of being a 32 bit file (i.e. Windows .inf file).
483  * In this case all files you install must be in the same dir
484  * as your .inf file on the install disk.
485  */
486 #define HOW_NEVER_REBOOT                0
487 #define HOW_ALWAYS_SILENT_REBOOT        1
488 #define HOW_ALWAYS_PROMPT_REBOOT        2
489 #define HOW_SILENT_REBOOT               3
490 #define HOW_PROMPT_REBOOT               4
491
492 /****** device installation stuff ******/
493
494 #define MAX_CLASS_NAME_LEN      32
495 #define MAX_DEVNODE_ID_LEN      256
496 #define MAX_GUID_STR            50
497
498 typedef struct _DEVICE_INFO
499 {
500         UINT16              cbSize;
501         struct _DEVICE_INFO *lpNextDi;
502         char                szDescription[LINE_LEN];
503         DWORD               dnDevnode;
504         HKEY                hRegKey;
505         char                szRegSubkey[MAX_DEVNODE_ID_LEN];
506         char                szClassName[MAX_CLASS_NAME_LEN];
507         DWORD               Flags;
508         HWND16              hwndParent;
509         /*LPDRIVER_NODE*/ LPVOID      lpCompatDrvList;
510         /*LPDRIVER_NODE*/ LPVOID      lpClassDrvList;
511         /*LPDRIVER_NODE*/ LPVOID      lpSelectedDriver;
512         ATOM                atDriverPath;
513         ATOM                atTempInfFile;
514         HINSTANCE16         hinstClassInstaller;
515         HINSTANCE16         hinstClassPropProvidor;
516         HINSTANCE16         hinstDevicePropProvidor;
517         HINSTANCE16         hinstBasicPropProvidor;
518         FARPROC16           fpClassInstaller;
519         FARPROC16           fpClassEnumPropPages;
520         FARPROC16           fpDeviceEnumPropPages;
521         FARPROC16           fpEnumBasicProperties;
522         DWORD               dwSetupReserved;
523         DWORD               dwClassInstallReserved;
524         /*GENCALLBACKPROC*/ LPVOID     gicpGenInstallCallBack;
525
526         LPARAM              gicplParam;
527         UINT16              InfType;
528
529         HINSTANCE16         hinstPrivateProblemHandler;
530         FARPROC16           fpPrivateProblemHandler;
531         LPARAM              lpClassInstallParams;
532         struct _DEVICE_INFO *lpdiChildList;
533         DWORD               dwFlagsEx;
534         /*LPDRIVER_INFO*/ LPVOID       lpCompatDrvInfoList;
535         /*LPDRIVER_INFO*/ LPVOID      lpClassDrvInfoList;
536         char                szClassGUID[MAX_GUID_STR];
537 } DEVICE_INFO16, *LPDEVICE_INFO16, **LPLPDEVICE_INFO16;
538
539
540 extern void WINAPI GenFormStrWithoutPlaceHolders16(LPSTR,LPCSTR,HINF16);
541 extern RETERR16 WINAPI IpOpen16(LPCSTR,HINF16 *);
542 extern RETERR16 WINAPI IpClose16(HINF16);
543 extern RETERR16 WINAPI CtlSetLdd16(LPLOGDISKDESC);
544 extern RETERR16 WINAPI CtlGetLdd16(LPLOGDISKDESC);
545 extern RETERR16 WINAPI CtlFindLdd16(LPLOGDISKDESC);
546 extern RETERR16 WINAPI CtlAddLdd16(LPLOGDISKDESC);
547 extern RETERR16 WINAPI CtlDelLdd16(LOGDISKID16);
548 extern RETERR16 WINAPI CtlGetLddPath16(LOGDISKID16 ldid, LPSTR szPath);
549 extern RETERR16 WINAPI GenInstall16(HINF16,LPCSTR,WORD);
550
551 typedef struct tagLDD_LIST {
552         LPLOGDISKDESC pldd;
553         struct tagLDD_LIST *next;
554 } LDD_LIST;
555
556 #define INIT_LDD(ldd, LDID) \
557   do { \
558    memset(&(ldd), 0, sizeof(LOGDISKDESC_S)); \
559    (ldd).cbSize = sizeof(LOGDISKDESC_S); \
560    ldd.ldid = LDID; \
561   } while(0)
562
563 #endif /* __SETUPX16_H */