msvcrt: NULL terminate program arguments list in __getmainargs.
[wine] / dlls / cabinet / fdi.c
1 /*
2  * File Decompression Interface
3  *
4  * Copyright 2000-2002 Stuart Caie
5  * Copyright 2002 Patrik Stridvall
6  * Copyright 2003 Greg Turner
7  *
8  * This library is free software; you can redistribute it and/or
9  * modify it under the terms of the GNU Lesser General Public
10  * License as published by the Free Software Foundation; either
11  * version 2.1 of the License, or (at your option) any later version.
12  *
13  * This library is distributed in the hope that it will be useful,
14  * but WITHOUT ANY WARRANTY; without even the implied warranty of
15  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
16  * Lesser General Public License for more details.
17  *
18  * You should have received a copy of the GNU Lesser General Public
19  * License along with this library; if not, write to the Free Software
20  * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
21  *
22  *
23  * This is a largely redundant reimplementation of the stuff in cabextract.c.  It
24  * would be theoretically preferable to have only one, shared implementation, however
25  * there are semantic differences which may discourage efforts to unify the two.  It
26  * should be possible, if awkward, to go back and reimplement cabextract.c using FDI.
27  * But this approach would be quite a bit less performant.  Probably a better way
28  * would be to create a "library" of routines in cabextract.c which do the actual
29  * decompression, and have both fdi.c and cabextract share those routines.  The rest
30  * of the code is not sufficiently similar to merit a shared implementation.
31  *
32  * The worst thing about this API is the bug.  "The bug" is this: when you extract a
33  * cabinet, it /always/ informs you (via the hasnext field of PFDICABINETINFO), that
34  * there is no subsequent cabinet, even if there is one.  wine faithfully reproduces
35  * this behavior.
36  *
37  * TODO:
38  *
39  * Wine does not implement the AFAIK undocumented "enumerate" callback during
40  * FDICopy.  It is implemented in Windows and therefore worth investigating...
41  *
42  * Lots of pointers flying around here... am I leaking RAM?
43  *
44  * WTF is FDITruncate?
45  *
46  * Probably, I need to weed out some dead code-paths.
47  *
48  * Test unit(s).
49  *
50  * The fdintNEXT_CABINET callbacks are probably not working quite as they should.
51  * There are several FIXMEs in the source describing some of the deficiencies in
52  * some detail.  Additionally, we do not do a very good job of returning the right
53  * error codes to this callback.
54  *
55  * FDICopy and fdi_decomp are incomprehensibly large; separating these into smaller
56  * functions would be nice.
57  *
58  *   -gmt
59  */
60
61 #include "config.h"
62
63 #include <stdarg.h>
64 #include <stdio.h>
65
66 #include "windef.h"
67 #include "winbase.h"
68 #include "winerror.h"
69 #include "fdi.h"
70 #include "cabinet.h"
71
72 #include "wine/debug.h"
73
74 WINE_DEFAULT_DEBUG_CHANNEL(cabinet);
75
76 THOSE_ZIP_CONSTS;
77
78 struct fdi_file {
79   struct fdi_file *next;               /* next file in sequence          */
80   LPSTR filename;                     /* output name of file            */
81   int    fh;                           /* open file handle or NULL       */
82   cab_ULONG length;                    /* uncompressed length of file    */
83   cab_ULONG offset;                    /* uncompressed offset in folder  */
84   cab_UWORD index;                     /* magic index number of folder   */
85   cab_UWORD time, date, attribs;       /* MS-DOS time/date/attributes    */
86   BOOL oppressed;                      /* never to be processed          */
87 };
88
89 struct fdi_folder {
90   struct fdi_folder *next;
91   cab_off_t offset;                    /* offset to data blocks (32 bit) */
92   cab_UWORD comp_type;                 /* compression format/window size */
93   cab_ULONG comp_size;                 /* compressed size of folder      */
94   cab_UBYTE num_splits;                /* number of split blocks + 1     */
95   cab_UWORD num_blocks;                /* total number of blocks         */
96 };
97
98 /*
99  * this structure fills the gaps between what is available in a PFDICABINETINFO
100  * vs what is needed by FDICopy.  Memory allocated for these becomes the responsibility
101  * of the caller to free.  Yes, I am aware that this is totally, utterly inelegant.
102  * To make things even more unnecessarily confusing, we now attach these to the
103  * fdi_decomp_state.
104  */
105 typedef struct {
106    char *prevname, *previnfo;
107    char *nextname, *nextinfo;
108    BOOL hasnext;  /* bug free indicator */
109    int folder_resv, header_resv;
110    cab_UBYTE block_resv;
111 } MORE_ISCAB_INFO, *PMORE_ISCAB_INFO;
112
113 typedef struct
114 {
115   unsigned int magic;
116   PFNALLOC     alloc;
117   PFNFREE      free;
118   PFNOPEN      open;
119   PFNREAD      read;
120   PFNWRITE     write;
121   PFNCLOSE     close;
122   PFNSEEK      seek;
123   PERF         perf;
124 } FDI_Int;
125
126 #define FDI_INT_MAGIC 0xfdfdfd05
127
128 /*
129  * ugh, well, this ended up being pretty damn silly...
130  * now that I've conceded to build equivalent structures to struct cab.*,
131  * I should have just used those, or, better yet, unified the two... sue me.
132  * (Note to Microsoft: That's a joke.  Please /don't/ actually sue me! -gmt).
133  * Nevertheless, I've come this far, it works, so I'm not gonna change it
134  * for now.  This implementation has significant semantic differences anyhow.
135  */
136
137 typedef struct fdi_cds_fwd {
138   FDI_Int *fdi;                    /* the hfdi we are using                 */
139   INT_PTR filehf, cabhf;           /* file handle we are using              */
140   struct fdi_folder *current;      /* current folder we're extracting from  */
141   cab_ULONG offset;                /* uncompressed offset within folder     */
142   cab_UBYTE *outpos;               /* (high level) start of data to use up  */
143   cab_UWORD outlen;                /* (high level) amount of data to use up */
144   int (*decompress)(int, int, struct fdi_cds_fwd *); /* chosen compress fn  */
145   cab_UBYTE inbuf[CAB_INPUTMAX+2]; /* +2 for lzx bitbuffer overflows!       */
146   cab_UBYTE outbuf[CAB_BLOCKMAX];
147   union {
148     struct ZIPstate zip;
149     struct QTMstate qtm;
150     struct LZXstate lzx;
151   } methods;
152   /* some temp variables for use during decompression */
153   cab_UBYTE q_length_base[27], q_length_extra[27], q_extra_bits[42];
154   cab_ULONG q_position_base[42];
155   cab_ULONG lzx_position_base[51];
156   cab_UBYTE extra_bits[51];
157   USHORT  setID;                   /* Cabinet set ID */
158   USHORT  iCabinet;                /* Cabinet number in set (0 based) */
159   struct fdi_cds_fwd *decomp_cab;
160   MORE_ISCAB_INFO mii;
161   struct fdi_folder *firstfol; 
162   struct fdi_file   *firstfile;
163   struct fdi_cds_fwd *next;
164 } fdi_decomp_state;
165
166 #define ZIPNEEDBITS(n) {while(k<(n)){cab_LONG c=*(ZIP(inpos)++);\
167     b|=((cab_ULONG)c)<<k;k+=8;}}
168 #define ZIPDUMPBITS(n) {b>>=(n);k-=(n);}
169
170 /* endian-neutral reading of little-endian data */
171 #define EndGetI32(a)  ((((a)[3])<<24)|(((a)[2])<<16)|(((a)[1])<<8)|((a)[0]))
172 #define EndGetI16(a)  ((((a)[1])<<8)|((a)[0]))
173
174 #define CAB(x) (decomp_state->x)
175 #define ZIP(x) (decomp_state->methods.zip.x)
176 #define QTM(x) (decomp_state->methods.qtm.x)
177 #define LZX(x) (decomp_state->methods.lzx.x)
178 #define DECR_OK           (0)
179 #define DECR_DATAFORMAT   (1)
180 #define DECR_ILLEGALDATA  (2)
181 #define DECR_NOMEMORY     (3)
182 #define DECR_CHECKSUM     (4)
183 #define DECR_INPUT        (5)
184 #define DECR_OUTPUT       (6)
185 #define DECR_USERABORT    (7)
186
187 static void set_error( FDI_Int *fdi, int oper, int err )
188 {
189     fdi->perf->erfOper = oper;
190     fdi->perf->erfType = err;
191     fdi->perf->fError = TRUE;
192     if (err) SetLastError( err );
193 }
194
195 static FDI_Int *get_fdi_ptr( HFDI hfdi )
196 {
197     FDI_Int *fdi= (FDI_Int *)hfdi;
198
199     if (!fdi || fdi->magic != FDI_INT_MAGIC)
200     {
201         SetLastError( ERROR_INVALID_HANDLE );
202         return NULL;
203     }
204     return fdi;
205 }
206
207 /****************************************************************
208  * QTMupdatemodel (internal)
209  */
210 static void QTMupdatemodel(struct QTMmodel *model, int sym) {
211   struct QTMmodelsym temp;
212   int i, j;
213
214   for (i = 0; i < sym; i++) model->syms[i].cumfreq += 8;
215
216   if (model->syms[0].cumfreq > 3800) {
217     if (--model->shiftsleft) {
218       for (i = model->entries - 1; i >= 0; i--) {
219         /* -1, not -2; the 0 entry saves this */
220         model->syms[i].cumfreq >>= 1;
221         if (model->syms[i].cumfreq <= model->syms[i+1].cumfreq) {
222           model->syms[i].cumfreq = model->syms[i+1].cumfreq + 1;
223         }
224       }
225     }
226     else {
227       model->shiftsleft = 50;
228       for (i = 0; i < model->entries ; i++) {
229         /* no -1, want to include the 0 entry */
230         /* this converts cumfreqs into frequencies, then shifts right */
231         model->syms[i].cumfreq -= model->syms[i+1].cumfreq;
232         model->syms[i].cumfreq++; /* avoid losing things entirely */
233         model->syms[i].cumfreq >>= 1;
234       }
235
236       /* now sort by frequencies, decreasing order -- this must be an
237        * inplace selection sort, or a sort with the same (in)stability
238        * characteristics
239        */
240       for (i = 0; i < model->entries - 1; i++) {
241         for (j = i + 1; j < model->entries; j++) {
242           if (model->syms[i].cumfreq < model->syms[j].cumfreq) {
243             temp = model->syms[i];
244             model->syms[i] = model->syms[j];
245             model->syms[j] = temp;
246           }
247         }
248       }
249
250       /* then convert frequencies back to cumfreq */
251       for (i = model->entries - 1; i >= 0; i--) {
252         model->syms[i].cumfreq += model->syms[i+1].cumfreq;
253       }
254       /* then update the other part of the table */
255       for (i = 0; i < model->entries; i++) {
256         model->tabloc[model->syms[i].sym] = i;
257       }
258     }
259   }
260 }
261
262 /*************************************************************************
263  * make_decode_table (internal)
264  *
265  * This function was coded by David Tritscher. It builds a fast huffman
266  * decoding table out of just a canonical huffman code lengths table.
267  *
268  * PARAMS
269  *   nsyms:  total number of symbols in this huffman tree.
270  *   nbits:  any symbols with a code length of nbits or less can be decoded
271  *           in one lookup of the table.
272  *   length: A table to get code lengths from [0 to syms-1]
273  *   table:  The table to fill up with decoded symbols and pointers.
274  *
275  * RETURNS
276  *   OK:    0
277  *   error: 1
278  */
279 static int make_decode_table(cab_ULONG nsyms, cab_ULONG nbits,
280                              const cab_UBYTE *length, cab_UWORD *table) {
281   register cab_UWORD sym;
282   register cab_ULONG leaf;
283   register cab_UBYTE bit_num = 1;
284   cab_ULONG fill;
285   cab_ULONG pos         = 0; /* the current position in the decode table */
286   cab_ULONG table_mask  = 1 << nbits;
287   cab_ULONG bit_mask    = table_mask >> 1; /* don't do 0 length codes */
288   cab_ULONG next_symbol = bit_mask; /* base of allocation for long codes */
289
290   /* fill entries for codes short enough for a direct mapping */
291   while (bit_num <= nbits) {
292     for (sym = 0; sym < nsyms; sym++) {
293       if (length[sym] == bit_num) {
294         leaf = pos;
295
296         if((pos += bit_mask) > table_mask) return 1; /* table overrun */
297
298         /* fill all possible lookups of this symbol with the symbol itself */
299         fill = bit_mask;
300         while (fill-- > 0) table[leaf++] = sym;
301       }
302     }
303     bit_mask >>= 1;
304     bit_num++;
305   }
306
307   /* if there are any codes longer than nbits */
308   if (pos != table_mask) {
309     /* clear the remainder of the table */
310     for (sym = pos; sym < table_mask; sym++) table[sym] = 0;
311
312     /* give ourselves room for codes to grow by up to 16 more bits */
313     pos <<= 16;
314     table_mask <<= 16;
315     bit_mask = 1 << 15;
316
317     while (bit_num <= 16) {
318       for (sym = 0; sym < nsyms; sym++) {
319         if (length[sym] == bit_num) {
320           leaf = pos >> 16;
321           for (fill = 0; fill < bit_num - nbits; fill++) {
322             /* if this path hasn't been taken yet, 'allocate' two entries */
323             if (table[leaf] == 0) {
324               table[(next_symbol << 1)] = 0;
325               table[(next_symbol << 1) + 1] = 0;
326               table[leaf] = next_symbol++;
327             }
328             /* follow the path and select either left or right for next bit */
329             leaf = table[leaf] << 1;
330             if ((pos >> (15-fill)) & 1) leaf++;
331           }
332           table[leaf] = sym;
333
334           if ((pos += bit_mask) > table_mask) return 1; /* table overflow */
335         }
336       }
337       bit_mask >>= 1;
338       bit_num++;
339     }
340   }
341
342   /* full table? */
343   if (pos == table_mask) return 0;
344
345   /* either erroneous table, or all elements are 0 - let's find out. */
346   for (sym = 0; sym < nsyms; sym++) if (length[sym]) return 1;
347   return 0;
348 }
349
350 /*************************************************************************
351  * checksum (internal)
352  */
353 static cab_ULONG checksum(const cab_UBYTE *data, cab_UWORD bytes, cab_ULONG csum) {
354   int len;
355   cab_ULONG ul = 0;
356
357   for (len = bytes >> 2; len--; data += 4) {
358     csum ^= ((data[0]) | (data[1]<<8) | (data[2]<<16) | (data[3]<<24));
359   }
360
361   switch (bytes & 3) {
362   case 3: ul |= *data++ << 16;
363   /* fall through */
364   case 2: ul |= *data++ <<  8;
365   /* fall through */
366   case 1: ul |= *data;
367   }
368   csum ^= ul;
369
370   return csum;
371 }
372
373 /***********************************************************************
374  *              FDICreate (CABINET.20)
375  *
376  * Provided with several callbacks (all of them are mandatory),
377  * returns a handle which can be used to perform operations
378  * on cabinet files.
379  *
380  * PARAMS
381  *   pfnalloc [I]  A pointer to a function which allocates ram.  Uses
382  *                 the same interface as malloc.
383  *   pfnfree  [I]  A pointer to a function which frees ram.  Uses the
384  *                 same interface as free.
385  *   pfnopen  [I]  A pointer to a function which opens a file.  Uses
386  *                 the same interface as _open.
387  *   pfnread  [I]  A pointer to a function which reads from a file into
388  *                 a caller-provided buffer.  Uses the same interface
389  *                 as _read
390  *   pfnwrite [I]  A pointer to a function which writes to a file from
391  *                 a caller-provided buffer.  Uses the same interface
392  *                 as _write.
393  *   pfnclose [I]  A pointer to a function which closes a file handle.
394  *                 Uses the same interface as _close.
395  *   pfnseek  [I]  A pointer to a function which seeks in a file.
396  *                 Uses the same interface as _lseek.
397  *   cpuType  [I]  The type of CPU; ignored in wine (recommended value:
398  *                 cpuUNKNOWN, aka -1).
399  *   perf     [IO] A pointer to an ERF structure.  When FDICreate
400  *                 returns an error condition, error information may
401  *                 be found here as well as from GetLastError.
402  *
403  * RETURNS
404  *   On success, returns an FDI handle of type HFDI.
405  *   On failure, the NULL file handle is returned. Error
406  *   info can be retrieved from perf.
407  *
408  * INCLUDES
409  *   fdi.h
410  * 
411  */
412 HFDI __cdecl FDICreate(
413         PFNALLOC pfnalloc,
414         PFNFREE  pfnfree,
415         PFNOPEN  pfnopen,
416         PFNREAD  pfnread,
417         PFNWRITE pfnwrite,
418         PFNCLOSE pfnclose,
419         PFNSEEK  pfnseek,
420         int      cpuType,
421         PERF     perf)
422 {
423   FDI_Int *fdi;
424
425   TRACE("(pfnalloc == ^%p, pfnfree == ^%p, pfnopen == ^%p, pfnread == ^%p, pfnwrite == ^%p, "
426         "pfnclose == ^%p, pfnseek == ^%p, cpuType == %d, perf == ^%p)\n",
427         pfnalloc, pfnfree, pfnopen, pfnread, pfnwrite, pfnclose, pfnseek,
428         cpuType, perf);
429
430   if ((!pfnalloc) || (!pfnfree)) {
431     perf->erfOper = FDIERROR_NONE;
432     perf->erfType = ERROR_BAD_ARGUMENTS;
433     perf->fError = TRUE;
434
435     SetLastError(ERROR_BAD_ARGUMENTS);
436     return NULL;
437   }
438
439   if (!((fdi = pfnalloc(sizeof(FDI_Int))))) {
440     perf->erfOper = FDIERROR_ALLOC_FAIL;
441     perf->erfType = 0;
442     perf->fError = TRUE;
443     return NULL;
444   }
445
446   fdi->magic = FDI_INT_MAGIC;
447   fdi->alloc = pfnalloc;
448   fdi->free  = pfnfree;
449   fdi->open  = pfnopen;
450   fdi->read  = pfnread;
451   fdi->write = pfnwrite;
452   fdi->close = pfnclose;
453   fdi->seek  = pfnseek;
454   /* no-brainer: we ignore the cpu type; this is only used
455      for the 16-bit versions in Windows anyhow... */
456   fdi->perf = perf;
457
458   return (HFDI)fdi;
459 }
460
461 /*******************************************************************
462  * FDI_getoffset (internal)
463  *
464  * returns the file pointer position of a file handle.
465  */
466 static LONG FDI_getoffset(FDI_Int *fdi, INT_PTR hf)
467 {
468   return fdi->seek(hf, 0, SEEK_CUR);
469 }
470
471 /**********************************************************************
472  * FDI_read_string (internal)
473  *
474  * allocate and read an arbitrarily long string from the cabinet
475  */
476 static char *FDI_read_string(FDI_Int *fdi, INT_PTR hf, long cabsize)
477 {
478   size_t len=256,
479          base = FDI_getoffset(fdi, hf),
480          maxlen = cabsize - base;
481   BOOL ok = FALSE;
482   unsigned int i;
483   cab_UBYTE *buf = NULL;
484
485   TRACE("(fdi == %p, hf == %ld, cabsize == %ld)\n", fdi, hf, cabsize);
486
487   do {
488     if (len > maxlen) len = maxlen;
489     if (!(buf = fdi->alloc(len))) break;
490     if (!fdi->read(hf, buf, len)) break;
491
492     /* search for a null terminator in what we've just read */
493     for (i=0; i < len; i++) {
494       if (!buf[i]) {ok=TRUE; break;}
495     }
496
497     if (!ok) {
498       if (len == maxlen) {
499         ERR("cabinet is truncated\n");
500         break;
501       }
502       /* The buffer is too small for the string. Reset the file to the point
503        * were we started, free the buffer and increase the size for the next try
504        */
505       fdi->seek(hf, base, SEEK_SET);
506       fdi->free(buf);
507       buf = NULL;
508       len *= 2;
509     }
510   } while (!ok);
511
512   if (!ok) {
513     if (buf)
514       fdi->free(buf);
515     else
516       ERR("out of memory!\n");
517     return NULL;
518   }
519
520   /* otherwise, set the stream to just after the string and return */
521   fdi->seek(hf, base + strlen((char *)buf) + 1, SEEK_SET);
522
523   return (char *) buf;
524 }
525
526 /******************************************************************
527  * FDI_read_entries (internal)
528  *
529  * process the cabinet header in the style of FDIIsCabinet, but
530  * without the sanity checks (and bug)
531  */
532 static BOOL FDI_read_entries(
533         FDI_Int         *fdi,
534         INT_PTR          hf,
535         PFDICABINETINFO  pfdici,
536         PMORE_ISCAB_INFO pmii)
537 {
538   int num_folders, num_files, header_resv, folder_resv = 0;
539   LONG base_offset, cabsize;
540   USHORT setid, cabidx, flags;
541   cab_UBYTE buf[64], block_resv;
542   char *prevname = NULL, *previnfo = NULL, *nextname = NULL, *nextinfo = NULL;
543
544   TRACE("(fdi == ^%p, hf == %ld, pfdici == ^%p)\n", fdi, hf, pfdici);
545
546   /* 
547    * FIXME: I just noticed that I am memorizing the initial file pointer
548    * offset and restoring it before reading in the rest of the header
549    * information in the cabinet.  Perhaps that's correct -- that is, perhaps
550    * this API is supposed to support "streaming" cabinets which are embedded
551    * in other files, or cabinets which begin at file offsets other than zero.
552    * Otherwise, I should instead go to the absolute beginning of the file.
553    * (Either way, the semantics of wine's FDICopy require me to leave the
554    * file pointer where it is afterwards -- If Windows does not do so, we
555    * ought to duplicate the native behavior in the FDIIsCabinet API, not here.
556    * 
557    * So, the answer lies in Windows; will native cabinet.dll recognize a
558    * cabinet "file" embedded in another file?  Note that cabextract.c does
559    * support this, which implies that Microsoft's might.  I haven't tried it
560    * yet so I don't know.  ATM, most of wine's FDI cabinet routines (except
561    * this one) would not work in this way.  To fix it, we could just make the
562    * various references to absolute file positions in the code relative to an
563    * initial "beginning" offset.  Because the FDICopy API doesn't take a
564    * file-handle like this one, we would therein need to search through the
565    * file for the beginning of the cabinet (as we also do in cabextract.c).
566    * Note that this limits us to a maximum of one cabinet per. file: the first.
567    *
568    * So, in summary: either the code below is wrong, or the rest of fdi.c is
569    * wrong... I cannot imagine that both are correct ;)  One of these flaws
570    * should be fixed after determining the behavior on Windows.   We ought
571    * to check both FDIIsCabinet and FDICopy for the right behavior.
572    *
573    * -gmt
574    */
575
576   /* get basic offset & size info */
577   base_offset = FDI_getoffset(fdi, hf);
578
579   if (fdi->seek(hf, 0, SEEK_END) == -1) {
580     if (pmii) set_error( fdi, FDIERROR_NOT_A_CABINET, 0 );
581     return FALSE;
582   }
583
584   cabsize = FDI_getoffset(fdi, hf);
585
586   if ((cabsize == -1) || (base_offset == -1) || 
587       ( fdi->seek(hf, base_offset, SEEK_SET) == -1 )) {
588     if (pmii) set_error( fdi, FDIERROR_NOT_A_CABINET, 0 );
589     return FALSE;
590   }
591
592   /* read in the CFHEADER */
593   if (fdi->read(hf, buf, cfhead_SIZEOF) != cfhead_SIZEOF) {
594     if (pmii) set_error( fdi, FDIERROR_NOT_A_CABINET, 0 );
595     return FALSE;
596   }
597   
598   /* check basic MSCF signature */
599   if (EndGetI32(buf+cfhead_Signature) != 0x4643534d) {
600     if (pmii) set_error( fdi, FDIERROR_NOT_A_CABINET, 0 );
601     return FALSE;
602   }
603
604   /* get the number of folders */
605   num_folders = EndGetI16(buf+cfhead_NumFolders);
606
607   /* get the number of files */
608   num_files = EndGetI16(buf+cfhead_NumFiles);
609
610   /* setid */
611   setid = EndGetI16(buf+cfhead_SetID);
612
613   /* cabinet (set) index */
614   cabidx = EndGetI16(buf+cfhead_CabinetIndex);
615
616   /* check the header revision */
617   if ((buf[cfhead_MajorVersion] > 1) ||
618       (buf[cfhead_MajorVersion] == 1 && buf[cfhead_MinorVersion] > 3))
619   {
620     WARN("cabinet format version > 1.3\n");
621     if (pmii) set_error( fdi, FDIERROR_UNKNOWN_CABINET_VERSION, 0 /* ? */ );
622     return FALSE;
623   }
624
625   /* pull the flags out */
626   flags = EndGetI16(buf+cfhead_Flags);
627
628   /* read the reserved-sizes part of header, if present */
629   if (flags & cfheadRESERVE_PRESENT) {
630     if (fdi->read(hf, buf, cfheadext_SIZEOF) != cfheadext_SIZEOF) {
631       ERR("bunk reserve-sizes?\n");
632       if (pmii) set_error( fdi, FDIERROR_CORRUPT_CABINET, 0 /* ? */ );
633       return FALSE;
634     }
635
636     header_resv = EndGetI16(buf+cfheadext_HeaderReserved);
637     if (pmii) pmii->header_resv = header_resv;
638     folder_resv = buf[cfheadext_FolderReserved];
639     if (pmii) pmii->folder_resv = folder_resv;
640     block_resv  = buf[cfheadext_DataReserved];
641     if (pmii) pmii->block_resv = block_resv;
642
643     if (header_resv > 60000) {
644       WARN("WARNING; header reserved space > 60000\n");
645     }
646
647     /* skip the reserved header */
648     if ((header_resv) && (fdi->seek(hf, header_resv, SEEK_CUR) == -1)) {
649       ERR("seek failure: header_resv\n");
650       if (pmii) set_error( fdi, FDIERROR_CORRUPT_CABINET, 0 /* ? */ );
651       return FALSE;
652     }
653   }
654
655   if (flags & cfheadPREV_CABINET) {
656     prevname = FDI_read_string(fdi, hf, cabsize);
657     if (!prevname) {
658       if (pmii) set_error( fdi, FDIERROR_CORRUPT_CABINET, 0 /* ? */ );
659       return FALSE;
660     } else
661       if (pmii)
662         pmii->prevname = prevname;
663       else
664         fdi->free(prevname);
665     previnfo = FDI_read_string(fdi, hf, cabsize);
666     if (previnfo) {
667       if (pmii) 
668         pmii->previnfo = previnfo;
669       else
670         fdi->free(previnfo);
671     }
672   }
673
674   if (flags & cfheadNEXT_CABINET) {
675     if (pmii)
676       pmii->hasnext = TRUE;
677     nextname = FDI_read_string(fdi, hf, cabsize);
678     if (!nextname) {
679       if ((flags & cfheadPREV_CABINET) && pmii) {
680         if (pmii->prevname) fdi->free(prevname);
681         if (pmii->previnfo) fdi->free(previnfo);
682       }
683       set_error( fdi, FDIERROR_CORRUPT_CABINET, 0 /* ? */ );
684       return FALSE;
685     } else
686       if (pmii)
687         pmii->nextname = nextname;
688       else
689         fdi->free(nextname);
690     nextinfo = FDI_read_string(fdi, hf, cabsize);
691     if (nextinfo) {
692       if (pmii)
693         pmii->nextinfo = nextinfo;
694       else
695         fdi->free(nextinfo);
696     }
697   }
698
699   /* we could process the whole cabinet searching for problems;
700      instead lets stop here.  Now let's fill out the paperwork */
701   pfdici->cbCabinet = cabsize;
702   pfdici->cFolders  = num_folders;
703   pfdici->cFiles    = num_files;
704   pfdici->setID     = setid;
705   pfdici->iCabinet  = cabidx;
706   pfdici->fReserve  = (flags & cfheadRESERVE_PRESENT) != 0;
707   pfdici->hasprev   = (flags & cfheadPREV_CABINET) != 0;
708   pfdici->hasnext   = (flags & cfheadNEXT_CABINET) != 0;
709   return TRUE;
710 }
711
712 /***********************************************************************
713  * FDIIsCabinet (CABINET.21)
714  *
715  * Informs the caller as to whether or not the provided file handle is
716  * really a cabinet or not, filling out the provided PFDICABINETINFO
717  * structure with information about the cabinet.  Brief explanations of
718  * the elements of this structure are available as comments accompanying
719  * its definition in wine's include/fdi.h.
720  *
721  * PARAMS
722  *   hfdi   [I]  An HFDI from FDICreate
723  *   hf     [I]  The file handle about which the caller inquires
724  *   pfdici [IO] Pointer to a PFDICABINETINFO structure which will
725  *               be filled out with information about the cabinet
726  *               file indicated by hf if, indeed, it is determined
727  *               to be a cabinet.
728  *
729  * RETURNS
730  *   TRUE  if the file is a cabinet.  The info pointed to by pfdici will
731  *         be provided.
732  *   FALSE if the file is not a cabinet, or if an error was encountered
733  *         while processing the cabinet.  The PERF structure provided to
734  *         FDICreate can be queried for more error information.
735  *
736  * INCLUDES
737  *   fdi.c
738  */
739 BOOL __cdecl FDIIsCabinet(HFDI hfdi, INT_PTR hf, PFDICABINETINFO pfdici)
740 {
741   BOOL rv;
742   FDI_Int *fdi = get_fdi_ptr( hfdi );
743
744   TRACE("(hfdi == ^%p, hf == ^%ld, pfdici == ^%p)\n", hfdi, hf, pfdici);
745
746   if (!fdi) return FALSE;
747
748   if (!hf) {
749     SetLastError(ERROR_INVALID_HANDLE);
750     return FALSE;
751   }
752
753   if (!pfdici) {
754     SetLastError(ERROR_BAD_ARGUMENTS);
755     return FALSE;
756   }
757   rv = FDI_read_entries(fdi, hf, pfdici, NULL);
758
759   if (rv)
760     pfdici->hasnext = FALSE; /* yuck. duplicate apparent cabinet.dll bug */
761
762   return rv;
763 }
764
765 /******************************************************************
766  * QTMfdi_initmodel (internal)
767  *
768  * Initialize a model which decodes symbols from [s] to [s]+[n]-1
769  */
770 static void QTMfdi_initmodel(struct QTMmodel *m, struct QTMmodelsym *sym, int n, int s) {
771   int i;
772   m->shiftsleft = 4;
773   m->entries    = n;
774   m->syms       = sym;
775   memset(m->tabloc, 0xFF, sizeof(m->tabloc)); /* clear out look-up table */
776   for (i = 0; i < n; i++) {
777     m->tabloc[i+s]     = i;   /* set up a look-up entry for symbol */
778     m->syms[i].sym     = i+s; /* actual symbol */
779     m->syms[i].cumfreq = n-i; /* current frequency of that symbol */
780   }
781   m->syms[n].cumfreq = 0;
782 }
783
784 /******************************************************************
785  * QTMfdi_init (internal)
786  */
787 static int QTMfdi_init(int window, int level, fdi_decomp_state *decomp_state) {
788   unsigned int wndsize = 1 << window;
789   int msz = window * 2, i;
790   cab_ULONG j;
791
792   /* QTM supports window sizes of 2^10 (1Kb) through 2^21 (2Mb) */
793   /* if a previously allocated window is big enough, keep it    */
794   if (window < 10 || window > 21) return DECR_DATAFORMAT;
795   if (QTM(actual_size) < wndsize) {
796     if (QTM(window)) CAB(fdi)->free(QTM(window));
797     QTM(window) = NULL;
798   }
799   if (!QTM(window)) {
800     if (!(QTM(window) = CAB(fdi)->alloc(wndsize))) return DECR_NOMEMORY;
801     QTM(actual_size) = wndsize;
802   }
803   QTM(window_size) = wndsize;
804   QTM(window_posn) = 0;
805
806   /* initialize static slot/extrabits tables */
807   for (i = 0, j = 0; i < 27; i++) {
808     CAB(q_length_extra)[i] = (i == 26) ? 0 : (i < 2 ? 0 : i - 2) >> 2;
809     CAB(q_length_base)[i] = j; j += 1 << ((i == 26) ? 5 : CAB(q_length_extra)[i]);
810   }
811   for (i = 0, j = 0; i < 42; i++) {
812     CAB(q_extra_bits)[i] = (i < 2 ? 0 : i-2) >> 1;
813     CAB(q_position_base)[i] = j; j += 1 << CAB(q_extra_bits)[i];
814   }
815
816   /* initialize arithmetic coding models */
817
818   QTMfdi_initmodel(&QTM(model7), QTM(m7sym), 7, 0);
819
820   QTMfdi_initmodel(&QTM(model00), QTM(m00sym), 0x40, 0x00);
821   QTMfdi_initmodel(&QTM(model40), QTM(m40sym), 0x40, 0x40);
822   QTMfdi_initmodel(&QTM(model80), QTM(m80sym), 0x40, 0x80);
823   QTMfdi_initmodel(&QTM(modelC0), QTM(mC0sym), 0x40, 0xC0);
824
825   /* model 4 depends on table size, ranges from 20 to 24  */
826   QTMfdi_initmodel(&QTM(model4), QTM(m4sym), (msz < 24) ? msz : 24, 0);
827   /* model 5 depends on table size, ranges from 20 to 36  */
828   QTMfdi_initmodel(&QTM(model5), QTM(m5sym), (msz < 36) ? msz : 36, 0);
829   /* model 6pos depends on table size, ranges from 20 to 42 */
830   QTMfdi_initmodel(&QTM(model6pos), QTM(m6psym), msz, 0);
831   QTMfdi_initmodel(&QTM(model6len), QTM(m6lsym), 27, 0);
832
833   return DECR_OK;
834 }
835
836 /************************************************************
837  * LZXfdi_init (internal)
838  */
839 static int LZXfdi_init(int window, fdi_decomp_state *decomp_state) {
840   static const cab_UBYTE bits[]  =
841                         { 0,  0,  0,  0,  1,  1,  2,  2,  3,  3,  4,  4,  5,  5,  6,  6,
842                           7,  7,  8,  8,  9,  9, 10, 10, 11, 11, 12, 12, 13, 13, 14, 14,
843                          15, 15, 16, 16, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
844                          17, 17, 17};
845   static const cab_ULONG base[] =
846                 {      0,       1,       2,       3,       4,       6,       8,      12,
847                       16,      24,      32,      48,      64,      96,     128,     192,
848                      256,     384,     512,     768,    1024,    1536,    2048,    3072,
849                     4096,    6144,    8192,   12288,   16384,   24576,   32768,   49152,
850                    65536,   98304,  131072,  196608,  262144,  393216,  524288,  655360,
851                   786432,  917504, 1048576, 1179648, 1310720, 1441792, 1572864, 1703936,
852                  1835008, 1966080, 2097152};
853   cab_ULONG wndsize = 1 << window;
854   int posn_slots;
855
856   /* LZX supports window sizes of 2^15 (32Kb) through 2^21 (2Mb) */
857   /* if a previously allocated window is big enough, keep it     */
858   if (window < 15 || window > 21) return DECR_DATAFORMAT;
859   if (LZX(actual_size) < wndsize) {
860     if (LZX(window)) CAB(fdi)->free(LZX(window));
861     LZX(window) = NULL;
862   }
863   if (!LZX(window)) {
864     if (!(LZX(window) = CAB(fdi)->alloc(wndsize))) return DECR_NOMEMORY;
865     LZX(actual_size) = wndsize;
866   }
867   LZX(window_size) = wndsize;
868
869   /* initialize static tables */
870   memcpy(CAB(extra_bits), bits, sizeof(bits));
871   memcpy(CAB(lzx_position_base), base, sizeof(base));
872
873   /* calculate required position slots */
874   if (window == 20) posn_slots = 42;
875   else if (window == 21) posn_slots = 50;
876   else posn_slots = window << 1;
877
878   /*posn_slots=i=0; while (i < wndsize) i += 1 << CAB(extra_bits)[posn_slots++]; */
879
880   LZX(R0)  =  LZX(R1)  = LZX(R2) = 1;
881   LZX(main_elements)   = LZX_NUM_CHARS + (posn_slots << 3);
882   LZX(header_read)     = 0;
883   LZX(frames_read)     = 0;
884   LZX(block_remaining) = 0;
885   LZX(block_type)      = LZX_BLOCKTYPE_INVALID;
886   LZX(intel_curpos)    = 0;
887   LZX(intel_started)   = 0;
888   LZX(window_posn)     = 0;
889
890   /* initialize tables to 0 (because deltas will be applied to them) */
891   memset(LZX(MAINTREE_len), 0, sizeof(LZX(MAINTREE_len)));
892   memset(LZX(LENGTH_len), 0, sizeof(LZX(LENGTH_len)));
893
894   return DECR_OK;
895 }
896
897 /****************************************************
898  * NONEfdi_decomp(internal)
899  */
900 static int NONEfdi_decomp(int inlen, int outlen, fdi_decomp_state *decomp_state)
901 {
902   if (inlen != outlen) return DECR_ILLEGALDATA;
903   if (outlen > CAB_BLOCKMAX) return DECR_DATAFORMAT;
904   memcpy(CAB(outbuf), CAB(inbuf), (size_t) inlen);
905   return DECR_OK;
906 }
907
908 /********************************************************
909  * Ziphuft_free (internal)
910  */
911 static void fdi_Ziphuft_free(FDI_Int *fdi, struct Ziphuft *t)
912 {
913   register struct Ziphuft *p, *q;
914
915   /* Go through linked list, freeing from the allocated (t[-1]) address. */
916   p = t;
917   while (p != NULL)
918   {
919     q = (--p)->v.t;
920     fdi->free(p);
921     p = q;
922   } 
923 }
924
925 /*********************************************************
926  * fdi_Ziphuft_build (internal)
927  */
928 static cab_LONG fdi_Ziphuft_build(cab_ULONG *b, cab_ULONG n, cab_ULONG s, const cab_UWORD *d, const cab_UWORD *e,
929 struct Ziphuft **t, cab_LONG *m, fdi_decomp_state *decomp_state)
930 {
931   cab_ULONG a;                          /* counter for codes of length k */
932   cab_ULONG el;                         /* length of EOB code (value 256) */
933   cab_ULONG f;                          /* i repeats in table every f entries */
934   cab_LONG g;                           /* maximum code length */
935   cab_LONG h;                           /* table level */
936   register cab_ULONG i;                 /* counter, current code */
937   register cab_ULONG j;                 /* counter */
938   register cab_LONG k;                  /* number of bits in current code */
939   cab_LONG *l;                          /* stack of bits per table */
940   register cab_ULONG *p;                /* pointer into ZIP(c)[],ZIP(b)[],ZIP(v)[] */
941   register struct Ziphuft *q;           /* points to current table */
942   struct Ziphuft r;                     /* table entry for structure assignment */
943   register cab_LONG w;                  /* bits before this table == (l * h) */
944   cab_ULONG *xp;                        /* pointer into x */
945   cab_LONG y;                           /* number of dummy codes added */
946   cab_ULONG z;                          /* number of entries in current table */
947
948   l = ZIP(lx)+1;
949
950   /* Generate counts for each bit length */
951   el = n > 256 ? b[256] : ZIPBMAX; /* set length of EOB code, if any */
952
953   for(i = 0; i < ZIPBMAX+1; ++i)
954     ZIP(c)[i] = 0;
955   p = b;  i = n;
956   do
957   {
958     ZIP(c)[*p]++; p++;               /* assume all entries <= ZIPBMAX */
959   } while (--i);
960   if (ZIP(c)[0] == n)                /* null input--all zero length codes */
961   {
962     *t = NULL;
963     *m = 0;
964     return 0;
965   }
966
967   /* Find minimum and maximum length, bound *m by those */
968   for (j = 1; j <= ZIPBMAX; j++)
969     if (ZIP(c)[j])
970       break;
971   k = j;                        /* minimum code length */
972   if ((cab_ULONG)*m < j)
973     *m = j;
974   for (i = ZIPBMAX; i; i--)
975     if (ZIP(c)[i])
976       break;
977   g = i;                        /* maximum code length */
978   if ((cab_ULONG)*m > i)
979     *m = i;
980
981   /* Adjust last length count to fill out codes, if needed */
982   for (y = 1 << j; j < i; j++, y <<= 1)
983     if ((y -= ZIP(c)[j]) < 0)
984       return 2;                 /* bad input: more codes than bits */
985   if ((y -= ZIP(c)[i]) < 0)
986     return 2;
987   ZIP(c)[i] += y;
988
989   /* Generate starting offsets LONGo the value table for each length */
990   ZIP(x)[1] = j = 0;
991   p = ZIP(c) + 1;  xp = ZIP(x) + 2;
992   while (--i)
993   {                 /* note that i == g from above */
994     *xp++ = (j += *p++);
995   }
996
997   /* Make a table of values in order of bit lengths */
998   p = b;  i = 0;
999   do{
1000     if ((j = *p++) != 0)
1001       ZIP(v)[ZIP(x)[j]++] = i;
1002   } while (++i < n);
1003
1004
1005   /* Generate the Huffman codes and for each, make the table entries */
1006   ZIP(x)[0] = i = 0;                 /* first Huffman code is zero */
1007   p = ZIP(v);                        /* grab values in bit order */
1008   h = -1;                       /* no tables yet--level -1 */
1009   w = l[-1] = 0;                /* no bits decoded yet */
1010   ZIP(u)[0] = NULL;             /* just to keep compilers happy */
1011   q = NULL;                     /* ditto */
1012   z = 0;                        /* ditto */
1013
1014   /* go through the bit lengths (k already is bits in shortest code) */
1015   for (; k <= g; k++)
1016   {
1017     a = ZIP(c)[k];
1018     while (a--)
1019     {
1020       /* here i is the Huffman code of length k bits for value *p */
1021       /* make tables up to required level */
1022       while (k > w + l[h])
1023       {
1024         w += l[h++];            /* add bits already decoded */
1025
1026         /* compute minimum size table less than or equal to *m bits */
1027         if ((z = g - w) > (cab_ULONG)*m)    /* upper limit */
1028           z = *m;
1029         if ((f = 1 << (j = k - w)) > a + 1)     /* try a k-w bit table */
1030         {                       /* too few codes for k-w bit table */
1031           f -= a + 1;           /* deduct codes from patterns left */
1032           xp = ZIP(c) + k;
1033           while (++j < z)       /* try smaller tables up to z bits */
1034           {
1035             if ((f <<= 1) <= *++xp)
1036               break;            /* enough codes to use up j bits */
1037             f -= *xp;           /* else deduct codes from patterns */
1038           }
1039         }
1040         if ((cab_ULONG)w + j > el && (cab_ULONG)w < el)
1041           j = el - w;           /* make EOB code end at table */
1042         z = 1 << j;             /* table entries for j-bit table */
1043         l[h] = j;               /* set table size in stack */
1044
1045         /* allocate and link in new table */
1046         if (!(q = CAB(fdi)->alloc((z + 1)*sizeof(struct Ziphuft))))
1047         {
1048           if(h)
1049             fdi_Ziphuft_free(CAB(fdi), ZIP(u)[0]);
1050           return 3;             /* not enough memory */
1051         }
1052         *t = q + 1;             /* link to list for Ziphuft_free() */
1053         *(t = &(q->v.t)) = NULL;
1054         ZIP(u)[h] = ++q;             /* table starts after link */
1055
1056         /* connect to last table, if there is one */
1057         if (h)
1058         {
1059           ZIP(x)[h] = i;              /* save pattern for backing up */
1060           r.b = (cab_UBYTE)l[h-1];    /* bits to dump before this table */
1061           r.e = (cab_UBYTE)(16 + j);  /* bits in this table */
1062           r.v.t = q;                  /* pointer to this table */
1063           j = (i & ((1 << w) - 1)) >> (w - l[h-1]);
1064           ZIP(u)[h-1][j] = r;        /* connect to last table */
1065         }
1066       }
1067
1068       /* set up table entry in r */
1069       r.b = (cab_UBYTE)(k - w);
1070       if (p >= ZIP(v) + n)
1071         r.e = 99;               /* out of values--invalid code */
1072       else if (*p < s)
1073       {
1074         r.e = (cab_UBYTE)(*p < 256 ? 16 : 15);    /* 256 is end-of-block code */
1075         r.v.n = *p++;           /* simple code is just the value */
1076       }
1077       else
1078       {
1079         r.e = (cab_UBYTE)e[*p - s];   /* non-simple--look up in lists */
1080         r.v.n = d[*p++ - s];
1081       }
1082
1083       /* fill code-like entries with r */
1084       f = 1 << (k - w);
1085       for (j = i >> w; j < z; j += f)
1086         q[j] = r;
1087
1088       /* backwards increment the k-bit code i */
1089       for (j = 1 << (k - 1); i & j; j >>= 1)
1090         i ^= j;
1091       i ^= j;
1092
1093       /* backup over finished tables */
1094       while ((i & ((1 << w) - 1)) != ZIP(x)[h])
1095         w -= l[--h];            /* don't need to update q */
1096     }
1097   }
1098
1099   /* return actual size of base table */
1100   *m = l[0];
1101
1102   /* Return true (1) if we were given an incomplete table */
1103   return y != 0 && g != 1;
1104 }
1105
1106 /*********************************************************
1107  * fdi_Zipinflate_codes (internal)
1108  */
1109 static cab_LONG fdi_Zipinflate_codes(const struct Ziphuft *tl, const struct Ziphuft *td,
1110   cab_LONG bl, cab_LONG bd, fdi_decomp_state *decomp_state)
1111 {
1112   register cab_ULONG e;     /* table entry flag/number of extra bits */
1113   cab_ULONG n, d;           /* length and index for copy */
1114   cab_ULONG w;              /* current window position */
1115   const struct Ziphuft *t;  /* pointer to table entry */
1116   cab_ULONG ml, md;         /* masks for bl and bd bits */
1117   register cab_ULONG b;     /* bit buffer */
1118   register cab_ULONG k;     /* number of bits in bit buffer */
1119
1120   /* make local copies of globals */
1121   b = ZIP(bb);                       /* initialize bit buffer */
1122   k = ZIP(bk);
1123   w = ZIP(window_posn);                       /* initialize window position */
1124
1125   /* inflate the coded data */
1126   ml = Zipmask[bl];             /* precompute masks for speed */
1127   md = Zipmask[bd];
1128
1129   for(;;)
1130   {
1131     ZIPNEEDBITS((cab_ULONG)bl)
1132     if((e = (t = tl + (b & ml))->e) > 16)
1133       do
1134       {
1135         if (e == 99)
1136           return 1;
1137         ZIPDUMPBITS(t->b)
1138         e -= 16;
1139         ZIPNEEDBITS(e)
1140       } while ((e = (t = t->v.t + (b & Zipmask[e]))->e) > 16);
1141     ZIPDUMPBITS(t->b)
1142     if (e == 16)                /* then it's a literal */
1143       CAB(outbuf)[w++] = (cab_UBYTE)t->v.n;
1144     else                        /* it's an EOB or a length */
1145     {
1146       /* exit if end of block */
1147       if(e == 15)
1148         break;
1149
1150       /* get length of block to copy */
1151       ZIPNEEDBITS(e)
1152       n = t->v.n + (b & Zipmask[e]);
1153       ZIPDUMPBITS(e);
1154
1155       /* decode distance of block to copy */
1156       ZIPNEEDBITS((cab_ULONG)bd)
1157       if ((e = (t = td + (b & md))->e) > 16)
1158         do {
1159           if (e == 99)
1160             return 1;
1161           ZIPDUMPBITS(t->b)
1162           e -= 16;
1163           ZIPNEEDBITS(e)
1164         } while ((e = (t = t->v.t + (b & Zipmask[e]))->e) > 16);
1165       ZIPDUMPBITS(t->b)
1166       ZIPNEEDBITS(e)
1167       d = w - t->v.n - (b & Zipmask[e]);
1168       ZIPDUMPBITS(e)
1169       do
1170       {
1171         d &= ZIPWSIZE - 1;
1172         e = ZIPWSIZE - max(d, w);
1173         e = min(e, n);
1174         n -= e;
1175         do
1176         {
1177           CAB(outbuf)[w++] = CAB(outbuf)[d++];
1178         } while (--e);
1179       } while (n);
1180     }
1181   }
1182
1183   /* restore the globals from the locals */
1184   ZIP(window_posn) = w;              /* restore global window pointer */
1185   ZIP(bb) = b;                       /* restore global bit buffer */
1186   ZIP(bk) = k;
1187
1188   /* done */
1189   return 0;
1190 }
1191
1192 /***********************************************************
1193  * Zipinflate_stored (internal)
1194  */
1195 static cab_LONG fdi_Zipinflate_stored(fdi_decomp_state *decomp_state)
1196 /* "decompress" an inflated type 0 (stored) block. */
1197 {
1198   cab_ULONG n;           /* number of bytes in block */
1199   cab_ULONG w;           /* current window position */
1200   register cab_ULONG b;  /* bit buffer */
1201   register cab_ULONG k;  /* number of bits in bit buffer */
1202
1203   /* make local copies of globals */
1204   b = ZIP(bb);                       /* initialize bit buffer */
1205   k = ZIP(bk);
1206   w = ZIP(window_posn);              /* initialize window position */
1207
1208   /* go to byte boundary */
1209   n = k & 7;
1210   ZIPDUMPBITS(n);
1211
1212   /* get the length and its complement */
1213   ZIPNEEDBITS(16)
1214   n = (b & 0xffff);
1215   ZIPDUMPBITS(16)
1216   ZIPNEEDBITS(16)
1217   if (n != ((~b) & 0xffff))
1218     return 1;                   /* error in compressed data */
1219   ZIPDUMPBITS(16)
1220
1221   /* read and output the compressed data */
1222   while(n--)
1223   {
1224     ZIPNEEDBITS(8)
1225     CAB(outbuf)[w++] = (cab_UBYTE)b;
1226     ZIPDUMPBITS(8)
1227   }
1228
1229   /* restore the globals from the locals */
1230   ZIP(window_posn) = w;              /* restore global window pointer */
1231   ZIP(bb) = b;                       /* restore global bit buffer */
1232   ZIP(bk) = k;
1233   return 0;
1234 }
1235
1236 /******************************************************
1237  * fdi_Zipinflate_fixed (internal)
1238  */
1239 static cab_LONG fdi_Zipinflate_fixed(fdi_decomp_state *decomp_state)
1240 {
1241   struct Ziphuft *fixed_tl;
1242   struct Ziphuft *fixed_td;
1243   cab_LONG fixed_bl, fixed_bd;
1244   cab_LONG i;                /* temporary variable */
1245   cab_ULONG *l;
1246
1247   l = ZIP(ll);
1248
1249   /* literal table */
1250   for(i = 0; i < 144; i++)
1251     l[i] = 8;
1252   for(; i < 256; i++)
1253     l[i] = 9;
1254   for(; i < 280; i++)
1255     l[i] = 7;
1256   for(; i < 288; i++)          /* make a complete, but wrong code set */
1257     l[i] = 8;
1258   fixed_bl = 7;
1259   if((i = fdi_Ziphuft_build(l, 288, 257, Zipcplens, Zipcplext, &fixed_tl, &fixed_bl, decomp_state)))
1260     return i;
1261
1262   /* distance table */
1263   for(i = 0; i < 30; i++)      /* make an incomplete code set */
1264     l[i] = 5;
1265   fixed_bd = 5;
1266   if((i = fdi_Ziphuft_build(l, 30, 0, Zipcpdist, Zipcpdext, &fixed_td, &fixed_bd, decomp_state)) > 1)
1267   {
1268     fdi_Ziphuft_free(CAB(fdi), fixed_tl);
1269     return i;
1270   }
1271
1272   /* decompress until an end-of-block code */
1273   i = fdi_Zipinflate_codes(fixed_tl, fixed_td, fixed_bl, fixed_bd, decomp_state);
1274
1275   fdi_Ziphuft_free(CAB(fdi), fixed_td);
1276   fdi_Ziphuft_free(CAB(fdi), fixed_tl);
1277   return i;
1278 }
1279
1280 /**************************************************************
1281  * fdi_Zipinflate_dynamic (internal)
1282  */
1283 static cab_LONG fdi_Zipinflate_dynamic(fdi_decomp_state *decomp_state)
1284  /* decompress an inflated type 2 (dynamic Huffman codes) block. */
1285 {
1286   cab_LONG i;           /* temporary variables */
1287   cab_ULONG j;
1288   cab_ULONG *ll;
1289   cab_ULONG l;                  /* last length */
1290   cab_ULONG m;                  /* mask for bit lengths table */
1291   cab_ULONG n;                  /* number of lengths to get */
1292   struct Ziphuft *tl;           /* literal/length code table */
1293   struct Ziphuft *td;           /* distance code table */
1294   cab_LONG bl;                  /* lookup bits for tl */
1295   cab_LONG bd;                  /* lookup bits for td */
1296   cab_ULONG nb;                 /* number of bit length codes */
1297   cab_ULONG nl;                 /* number of literal/length codes */
1298   cab_ULONG nd;                 /* number of distance codes */
1299   register cab_ULONG b;         /* bit buffer */
1300   register cab_ULONG k;         /* number of bits in bit buffer */
1301
1302   /* make local bit buffer */
1303   b = ZIP(bb);
1304   k = ZIP(bk);
1305   ll = ZIP(ll);
1306
1307   /* read in table lengths */
1308   ZIPNEEDBITS(5)
1309   nl = 257 + (b & 0x1f);      /* number of literal/length codes */
1310   ZIPDUMPBITS(5)
1311   ZIPNEEDBITS(5)
1312   nd = 1 + (b & 0x1f);        /* number of distance codes */
1313   ZIPDUMPBITS(5)
1314   ZIPNEEDBITS(4)
1315   nb = 4 + (b & 0xf);         /* number of bit length codes */
1316   ZIPDUMPBITS(4)
1317   if(nl > 288 || nd > 32)
1318     return 1;                   /* bad lengths */
1319
1320   /* read in bit-length-code lengths */
1321   for(j = 0; j < nb; j++)
1322   {
1323     ZIPNEEDBITS(3)
1324     ll[Zipborder[j]] = b & 7;
1325     ZIPDUMPBITS(3)
1326   }
1327   for(; j < 19; j++)
1328     ll[Zipborder[j]] = 0;
1329
1330   /* build decoding table for trees--single level, 7 bit lookup */
1331   bl = 7;
1332   if((i = fdi_Ziphuft_build(ll, 19, 19, NULL, NULL, &tl, &bl, decomp_state)) != 0)
1333   {
1334     if(i == 1)
1335       fdi_Ziphuft_free(CAB(fdi), tl);
1336     return i;                   /* incomplete code set */
1337   }
1338
1339   /* read in literal and distance code lengths */
1340   n = nl + nd;
1341   m = Zipmask[bl];
1342   i = l = 0;
1343   while((cab_ULONG)i < n)
1344   {
1345     ZIPNEEDBITS((cab_ULONG)bl)
1346     j = (td = tl + (b & m))->b;
1347     ZIPDUMPBITS(j)
1348     j = td->v.n;
1349     if (j < 16)                 /* length of code in bits (0..15) */
1350       ll[i++] = l = j;          /* save last length in l */
1351     else if (j == 16)           /* repeat last length 3 to 6 times */
1352     {
1353       ZIPNEEDBITS(2)
1354       j = 3 + (b & 3);
1355       ZIPDUMPBITS(2)
1356       if((cab_ULONG)i + j > n)
1357         return 1;
1358       while (j--)
1359         ll[i++] = l;
1360     }
1361     else if (j == 17)           /* 3 to 10 zero length codes */
1362     {
1363       ZIPNEEDBITS(3)
1364       j = 3 + (b & 7);
1365       ZIPDUMPBITS(3)
1366       if ((cab_ULONG)i + j > n)
1367         return 1;
1368       while (j--)
1369         ll[i++] = 0;
1370       l = 0;
1371     }
1372     else                        /* j == 18: 11 to 138 zero length codes */
1373     {
1374       ZIPNEEDBITS(7)
1375       j = 11 + (b & 0x7f);
1376       ZIPDUMPBITS(7)
1377       if ((cab_ULONG)i + j > n)
1378         return 1;
1379       while (j--)
1380         ll[i++] = 0;
1381       l = 0;
1382     }
1383   }
1384
1385   /* free decoding table for trees */
1386   fdi_Ziphuft_free(CAB(fdi), tl);
1387
1388   /* restore the global bit buffer */
1389   ZIP(bb) = b;
1390   ZIP(bk) = k;
1391
1392   /* build the decoding tables for literal/length and distance codes */
1393   bl = ZIPLBITS;
1394   if((i = fdi_Ziphuft_build(ll, nl, 257, Zipcplens, Zipcplext, &tl, &bl, decomp_state)) != 0)
1395   {
1396     if(i == 1)
1397       fdi_Ziphuft_free(CAB(fdi), tl);
1398     return i;                   /* incomplete code set */
1399   }
1400   bd = ZIPDBITS;
1401   fdi_Ziphuft_build(ll + nl, nd, 0, Zipcpdist, Zipcpdext, &td, &bd, decomp_state);
1402
1403   /* decompress until an end-of-block code */
1404   if(fdi_Zipinflate_codes(tl, td, bl, bd, decomp_state))
1405     return 1;
1406
1407   /* free the decoding tables, return */
1408   fdi_Ziphuft_free(CAB(fdi), tl);
1409   fdi_Ziphuft_free(CAB(fdi), td);
1410   return 0;
1411 }
1412
1413 /*****************************************************
1414  * fdi_Zipinflate_block (internal)
1415  */
1416 static cab_LONG fdi_Zipinflate_block(cab_LONG *e, fdi_decomp_state *decomp_state) /* e == last block flag */
1417 { /* decompress an inflated block */
1418   cab_ULONG t;                  /* block type */
1419   register cab_ULONG b;     /* bit buffer */
1420   register cab_ULONG k;     /* number of bits in bit buffer */
1421
1422   /* make local bit buffer */
1423   b = ZIP(bb);
1424   k = ZIP(bk);
1425
1426   /* read in last block bit */
1427   ZIPNEEDBITS(1)
1428   *e = (cab_LONG)b & 1;
1429   ZIPDUMPBITS(1)
1430
1431   /* read in block type */
1432   ZIPNEEDBITS(2)
1433   t = b & 3;
1434   ZIPDUMPBITS(2)
1435
1436   /* restore the global bit buffer */
1437   ZIP(bb) = b;
1438   ZIP(bk) = k;
1439
1440   /* inflate that block type */
1441   if(t == 2)
1442     return fdi_Zipinflate_dynamic(decomp_state);
1443   if(t == 0)
1444     return fdi_Zipinflate_stored(decomp_state);
1445   if(t == 1)
1446     return fdi_Zipinflate_fixed(decomp_state);
1447   /* bad block type */
1448   return 2;
1449 }
1450
1451 /****************************************************
1452  * ZIPfdi_decomp(internal)
1453  */
1454 static int ZIPfdi_decomp(int inlen, int outlen, fdi_decomp_state *decomp_state)
1455 {
1456   cab_LONG e;               /* last block flag */
1457
1458   TRACE("(inlen == %d, outlen == %d)\n", inlen, outlen);
1459
1460   ZIP(inpos) = CAB(inbuf);
1461   ZIP(bb) = ZIP(bk) = ZIP(window_posn) = 0;
1462   if(outlen > ZIPWSIZE)
1463     return DECR_DATAFORMAT;
1464
1465   /* CK = Chris Kirmse, official Microsoft purloiner */
1466   if(ZIP(inpos)[0] != 0x43 || ZIP(inpos)[1] != 0x4B)
1467     return DECR_ILLEGALDATA;
1468   ZIP(inpos) += 2;
1469
1470   do {
1471     if(fdi_Zipinflate_block(&e, decomp_state))
1472       return DECR_ILLEGALDATA;
1473   } while(!e);
1474
1475   /* return success */
1476   return DECR_OK;
1477 }
1478
1479 /*******************************************************************
1480  * QTMfdi_decomp(internal)
1481  */
1482 static int QTMfdi_decomp(int inlen, int outlen, fdi_decomp_state *decomp_state)
1483 {
1484   cab_UBYTE *inpos  = CAB(inbuf);
1485   cab_UBYTE *window = QTM(window);
1486   cab_UBYTE *runsrc, *rundest;
1487   cab_ULONG window_posn = QTM(window_posn);
1488   cab_ULONG window_size = QTM(window_size);
1489
1490   /* used by bitstream macros */
1491   register int bitsleft, bitrun, bitsneed;
1492   register cab_ULONG bitbuf;
1493
1494   /* used by GET_SYMBOL */
1495   cab_ULONG range;
1496   cab_UWORD symf;
1497   int i;
1498
1499   int extra, togo = outlen, match_length = 0, copy_length;
1500   cab_UBYTE selector, sym;
1501   cab_ULONG match_offset = 0;
1502
1503   cab_UWORD H = 0xFFFF, L = 0, C;
1504
1505   TRACE("(inlen == %d, outlen == %d)\n", inlen, outlen);
1506
1507   /* read initial value of C */
1508   Q_INIT_BITSTREAM;
1509   Q_READ_BITS(C, 16);
1510
1511   /* apply 2^x-1 mask */
1512   window_posn &= window_size - 1;
1513   /* runs can't straddle the window wraparound */
1514   if ((window_posn + togo) > window_size) {
1515     TRACE("straddled run\n");
1516     return DECR_DATAFORMAT;
1517   }
1518
1519   while (togo > 0) {
1520     GET_SYMBOL(model7, selector);
1521     switch (selector) {
1522     case 0:
1523       GET_SYMBOL(model00, sym); window[window_posn++] = sym; togo--;
1524       break;
1525     case 1:
1526       GET_SYMBOL(model40, sym); window[window_posn++] = sym; togo--;
1527       break;
1528     case 2:
1529       GET_SYMBOL(model80, sym); window[window_posn++] = sym; togo--;
1530       break;
1531     case 3:
1532       GET_SYMBOL(modelC0, sym); window[window_posn++] = sym; togo--;
1533       break;
1534
1535     case 4:
1536       /* selector 4 = fixed length of 3 */
1537       GET_SYMBOL(model4, sym);
1538       Q_READ_BITS(extra, CAB(q_extra_bits)[sym]);
1539       match_offset = CAB(q_position_base)[sym] + extra + 1;
1540       match_length = 3;
1541       break;
1542
1543     case 5:
1544       /* selector 5 = fixed length of 4 */
1545       GET_SYMBOL(model5, sym);
1546       Q_READ_BITS(extra, CAB(q_extra_bits)[sym]);
1547       match_offset = CAB(q_position_base)[sym] + extra + 1;
1548       match_length = 4;
1549       break;
1550
1551     case 6:
1552       /* selector 6 = variable length */
1553       GET_SYMBOL(model6len, sym);
1554       Q_READ_BITS(extra, CAB(q_length_extra)[sym]);
1555       match_length = CAB(q_length_base)[sym] + extra + 5;
1556       GET_SYMBOL(model6pos, sym);
1557       Q_READ_BITS(extra, CAB(q_extra_bits)[sym]);
1558       match_offset = CAB(q_position_base)[sym] + extra + 1;
1559       break;
1560
1561     default:
1562       TRACE("Selector is bogus\n");
1563       return DECR_ILLEGALDATA;
1564     }
1565
1566     /* if this is a match */
1567     if (selector >= 4) {
1568       rundest = window + window_posn;
1569       togo -= match_length;
1570
1571       /* copy any wrapped around source data */
1572       if (window_posn >= match_offset) {
1573         /* no wrap */
1574         runsrc = rundest - match_offset;
1575       } else {
1576         runsrc = rundest + (window_size - match_offset);
1577         copy_length = match_offset - window_posn;
1578         if (copy_length < match_length) {
1579           match_length -= copy_length;
1580           window_posn += copy_length;
1581           while (copy_length-- > 0) *rundest++ = *runsrc++;
1582           runsrc = window;
1583         }
1584       }
1585       window_posn += match_length;
1586
1587       /* copy match data - no worries about destination wraps */
1588       while (match_length-- > 0) *rundest++ = *runsrc++;
1589     }
1590   } /* while (togo > 0) */
1591
1592   if (togo != 0) {
1593     TRACE("Frame overflow, this_run = %d\n", togo);
1594     return DECR_ILLEGALDATA;
1595   }
1596
1597   memcpy(CAB(outbuf), window + ((!window_posn) ? window_size : window_posn) -
1598     outlen, outlen);
1599
1600   QTM(window_posn) = window_posn;
1601   return DECR_OK;
1602 }
1603
1604 /************************************************************
1605  * fdi_lzx_read_lens (internal)
1606  */
1607 static int fdi_lzx_read_lens(cab_UBYTE *lens, cab_ULONG first, cab_ULONG last, struct lzx_bits *lb,
1608                   fdi_decomp_state *decomp_state) {
1609   cab_ULONG i,j, x,y;
1610   int z;
1611
1612   register cab_ULONG bitbuf = lb->bb;
1613   register int bitsleft = lb->bl;
1614   cab_UBYTE *inpos = lb->ip;
1615   cab_UWORD *hufftbl;
1616   
1617   for (x = 0; x < 20; x++) {
1618     READ_BITS(y, 4);
1619     LENTABLE(PRETREE)[x] = y;
1620   }
1621   BUILD_TABLE(PRETREE);
1622
1623   for (x = first; x < last; ) {
1624     READ_HUFFSYM(PRETREE, z);
1625     if (z == 17) {
1626       READ_BITS(y, 4); y += 4;
1627       while (y--) lens[x++] = 0;
1628     }
1629     else if (z == 18) {
1630       READ_BITS(y, 5); y += 20;
1631       while (y--) lens[x++] = 0;
1632     }
1633     else if (z == 19) {
1634       READ_BITS(y, 1); y += 4;
1635       READ_HUFFSYM(PRETREE, z);
1636       z = lens[x] - z; if (z < 0) z += 17;
1637       while (y--) lens[x++] = z;
1638     }
1639     else {
1640       z = lens[x] - z; if (z < 0) z += 17;
1641       lens[x++] = z;
1642     }
1643   }
1644
1645   lb->bb = bitbuf;
1646   lb->bl = bitsleft;
1647   lb->ip = inpos;
1648   return 0;
1649 }
1650
1651 /*******************************************************
1652  * LZXfdi_decomp(internal)
1653  */
1654 static int LZXfdi_decomp(int inlen, int outlen, fdi_decomp_state *decomp_state) {
1655   cab_UBYTE *inpos  = CAB(inbuf);
1656   const cab_UBYTE *endinp = inpos + inlen;
1657   cab_UBYTE *window = LZX(window);
1658   cab_UBYTE *runsrc, *rundest;
1659   cab_UWORD *hufftbl; /* used in READ_HUFFSYM macro as chosen decoding table */
1660
1661   cab_ULONG window_posn = LZX(window_posn);
1662   cab_ULONG window_size = LZX(window_size);
1663   cab_ULONG R0 = LZX(R0);
1664   cab_ULONG R1 = LZX(R1);
1665   cab_ULONG R2 = LZX(R2);
1666
1667   register cab_ULONG bitbuf;
1668   register int bitsleft;
1669   cab_ULONG match_offset, i,j,k; /* ijk used in READ_HUFFSYM macro */
1670   struct lzx_bits lb; /* used in READ_LENGTHS macro */
1671
1672   int togo = outlen, this_run, main_element, aligned_bits;
1673   int match_length, copy_length, length_footer, extra, verbatim_bits;
1674
1675   TRACE("(inlen == %d, outlen == %d)\n", inlen, outlen);
1676
1677   INIT_BITSTREAM;
1678
1679   /* read header if necessary */
1680   if (!LZX(header_read)) {
1681     i = j = 0;
1682     READ_BITS(k, 1); if (k) { READ_BITS(i,16); READ_BITS(j,16); }
1683     LZX(intel_filesize) = (i << 16) | j; /* or 0 if not encoded */
1684     LZX(header_read) = 1;
1685   }
1686
1687   /* main decoding loop */
1688   while (togo > 0) {
1689     /* last block finished, new block expected */
1690     if (LZX(block_remaining) == 0) {
1691       if (LZX(block_type) == LZX_BLOCKTYPE_UNCOMPRESSED) {
1692         if (LZX(block_length) & 1) inpos++; /* realign bitstream to word */
1693         INIT_BITSTREAM;
1694       }
1695
1696       READ_BITS(LZX(block_type), 3);
1697       READ_BITS(i, 16);
1698       READ_BITS(j, 8);
1699       LZX(block_remaining) = LZX(block_length) = (i << 8) | j;
1700
1701       switch (LZX(block_type)) {
1702       case LZX_BLOCKTYPE_ALIGNED:
1703         for (i = 0; i < 8; i++) { READ_BITS(j, 3); LENTABLE(ALIGNED)[i] = j; }
1704         BUILD_TABLE(ALIGNED);
1705         /* rest of aligned header is same as verbatim */
1706
1707       case LZX_BLOCKTYPE_VERBATIM:
1708         READ_LENGTHS(MAINTREE, 0, 256, fdi_lzx_read_lens);
1709         READ_LENGTHS(MAINTREE, 256, LZX(main_elements), fdi_lzx_read_lens);
1710         BUILD_TABLE(MAINTREE);
1711         if (LENTABLE(MAINTREE)[0xE8] != 0) LZX(intel_started) = 1;
1712
1713         READ_LENGTHS(LENGTH, 0, LZX_NUM_SECONDARY_LENGTHS, fdi_lzx_read_lens);
1714         BUILD_TABLE(LENGTH);
1715         break;
1716
1717       case LZX_BLOCKTYPE_UNCOMPRESSED:
1718         LZX(intel_started) = 1; /* because we can't assume otherwise */
1719         ENSURE_BITS(16); /* get up to 16 pad bits into the buffer */
1720         if (bitsleft > 16) inpos -= 2; /* and align the bitstream! */
1721         R0 = inpos[0]|(inpos[1]<<8)|(inpos[2]<<16)|(inpos[3]<<24);inpos+=4;
1722         R1 = inpos[0]|(inpos[1]<<8)|(inpos[2]<<16)|(inpos[3]<<24);inpos+=4;
1723         R2 = inpos[0]|(inpos[1]<<8)|(inpos[2]<<16)|(inpos[3]<<24);inpos+=4;
1724         break;
1725
1726       default:
1727         return DECR_ILLEGALDATA;
1728       }
1729     }
1730
1731     /* buffer exhaustion check */
1732     if (inpos > endinp) {
1733       /* it's possible to have a file where the next run is less than
1734        * 16 bits in size. In this case, the READ_HUFFSYM() macro used
1735        * in building the tables will exhaust the buffer, so we should
1736        * allow for this, but not allow those accidentally read bits to
1737        * be used (so we check that there are at least 16 bits
1738        * remaining - in this boundary case they aren't really part of
1739        * the compressed data)
1740        */
1741       if (inpos > (endinp+2) || bitsleft < 16) return DECR_ILLEGALDATA;
1742     }
1743
1744     while ((this_run = LZX(block_remaining)) > 0 && togo > 0) {
1745       if (this_run > togo) this_run = togo;
1746       togo -= this_run;
1747       LZX(block_remaining) -= this_run;
1748
1749       /* apply 2^x-1 mask */
1750       window_posn &= window_size - 1;
1751       /* runs can't straddle the window wraparound */
1752       if ((window_posn + this_run) > window_size)
1753         return DECR_DATAFORMAT;
1754
1755       switch (LZX(block_type)) {
1756
1757       case LZX_BLOCKTYPE_VERBATIM:
1758         while (this_run > 0) {
1759           READ_HUFFSYM(MAINTREE, main_element);
1760
1761           if (main_element < LZX_NUM_CHARS) {
1762             /* literal: 0 to LZX_NUM_CHARS-1 */
1763             window[window_posn++] = main_element;
1764             this_run--;
1765           }
1766           else {
1767             /* match: LZX_NUM_CHARS + ((slot<<3) | length_header (3 bits)) */
1768             main_element -= LZX_NUM_CHARS;
1769   
1770             match_length = main_element & LZX_NUM_PRIMARY_LENGTHS;
1771             if (match_length == LZX_NUM_PRIMARY_LENGTHS) {
1772               READ_HUFFSYM(LENGTH, length_footer);
1773               match_length += length_footer;
1774             }
1775             match_length += LZX_MIN_MATCH;
1776   
1777             match_offset = main_element >> 3;
1778   
1779             if (match_offset > 2) {
1780               /* not repeated offset */
1781               if (match_offset != 3) {
1782                 extra = CAB(extra_bits)[match_offset];
1783                 READ_BITS(verbatim_bits, extra);
1784                 match_offset = CAB(lzx_position_base)[match_offset] 
1785                                - 2 + verbatim_bits;
1786               }
1787               else {
1788                 match_offset = 1;
1789               }
1790   
1791               /* update repeated offset LRU queue */
1792               R2 = R1; R1 = R0; R0 = match_offset;
1793             }
1794             else if (match_offset == 0) {
1795               match_offset = R0;
1796             }
1797             else if (match_offset == 1) {
1798               match_offset = R1;
1799               R1 = R0; R0 = match_offset;
1800             }
1801             else /* match_offset == 2 */ {
1802               match_offset = R2;
1803               R2 = R0; R0 = match_offset;
1804             }
1805
1806             rundest = window + window_posn;
1807             this_run -= match_length;
1808
1809             /* copy any wrapped around source data */
1810             if (window_posn >= match_offset) {
1811               /* no wrap */
1812               runsrc = rundest - match_offset;
1813             } else {
1814               runsrc = rundest + (window_size - match_offset);
1815               copy_length = match_offset - window_posn;
1816               if (copy_length < match_length) {
1817                 match_length -= copy_length;
1818                 window_posn += copy_length;
1819                 while (copy_length-- > 0) *rundest++ = *runsrc++;
1820                 runsrc = window;
1821               }
1822             }
1823             window_posn += match_length;
1824
1825             /* copy match data - no worries about destination wraps */
1826             while (match_length-- > 0) *rundest++ = *runsrc++;
1827           }
1828         }
1829         break;
1830
1831       case LZX_BLOCKTYPE_ALIGNED:
1832         while (this_run > 0) {
1833           READ_HUFFSYM(MAINTREE, main_element);
1834   
1835           if (main_element < LZX_NUM_CHARS) {
1836             /* literal: 0 to LZX_NUM_CHARS-1 */
1837             window[window_posn++] = main_element;
1838             this_run--;
1839           }
1840           else {
1841             /* match: LZX_NUM_CHARS + ((slot<<3) | length_header (3 bits)) */
1842             main_element -= LZX_NUM_CHARS;
1843   
1844             match_length = main_element & LZX_NUM_PRIMARY_LENGTHS;
1845             if (match_length == LZX_NUM_PRIMARY_LENGTHS) {
1846               READ_HUFFSYM(LENGTH, length_footer);
1847               match_length += length_footer;
1848             }
1849             match_length += LZX_MIN_MATCH;
1850   
1851             match_offset = main_element >> 3;
1852   
1853             if (match_offset > 2) {
1854               /* not repeated offset */
1855               extra = CAB(extra_bits)[match_offset];
1856               match_offset = CAB(lzx_position_base)[match_offset] - 2;
1857               if (extra > 3) {
1858                 /* verbatim and aligned bits */
1859                 extra -= 3;
1860                 READ_BITS(verbatim_bits, extra);
1861                 match_offset += (verbatim_bits << 3);
1862                 READ_HUFFSYM(ALIGNED, aligned_bits);
1863                 match_offset += aligned_bits;
1864               }
1865               else if (extra == 3) {
1866                 /* aligned bits only */
1867                 READ_HUFFSYM(ALIGNED, aligned_bits);
1868                 match_offset += aligned_bits;
1869               }
1870               else if (extra > 0) { /* extra==1, extra==2 */
1871                 /* verbatim bits only */
1872                 READ_BITS(verbatim_bits, extra);
1873                 match_offset += verbatim_bits;
1874               }
1875               else /* extra == 0 */ {
1876                 /* ??? */
1877                 match_offset = 1;
1878               }
1879   
1880               /* update repeated offset LRU queue */
1881               R2 = R1; R1 = R0; R0 = match_offset;
1882             }
1883             else if (match_offset == 0) {
1884               match_offset = R0;
1885             }
1886             else if (match_offset == 1) {
1887               match_offset = R1;
1888               R1 = R0; R0 = match_offset;
1889             }
1890             else /* match_offset == 2 */ {
1891               match_offset = R2;
1892               R2 = R0; R0 = match_offset;
1893             }
1894
1895             rundest = window + window_posn;
1896             this_run -= match_length;
1897
1898             /* copy any wrapped around source data */
1899             if (window_posn >= match_offset) {
1900               /* no wrap */
1901               runsrc = rundest - match_offset;
1902             } else {
1903               runsrc = rundest + (window_size - match_offset);
1904               copy_length = match_offset - window_posn;
1905               if (copy_length < match_length) {
1906                 match_length -= copy_length;
1907                 window_posn += copy_length;
1908                 while (copy_length-- > 0) *rundest++ = *runsrc++;
1909                 runsrc = window;
1910               }
1911             }
1912             window_posn += match_length;
1913
1914             /* copy match data - no worries about destination wraps */
1915             while (match_length-- > 0) *rundest++ = *runsrc++;
1916           }
1917         }
1918         break;
1919
1920       case LZX_BLOCKTYPE_UNCOMPRESSED:
1921         if ((inpos + this_run) > endinp) return DECR_ILLEGALDATA;
1922         memcpy(window + window_posn, inpos, (size_t) this_run);
1923         inpos += this_run; window_posn += this_run;
1924         break;
1925
1926       default:
1927         return DECR_ILLEGALDATA; /* might as well */
1928       }
1929
1930     }
1931   }
1932
1933   if (togo != 0) return DECR_ILLEGALDATA;
1934   memcpy(CAB(outbuf), window + ((!window_posn) ? window_size : window_posn) -
1935     outlen, (size_t) outlen);
1936
1937   LZX(window_posn) = window_posn;
1938   LZX(R0) = R0;
1939   LZX(R1) = R1;
1940   LZX(R2) = R2;
1941
1942   /* intel E8 decoding */
1943   if ((LZX(frames_read)++ < 32768) && LZX(intel_filesize) != 0) {
1944     if (outlen <= 6 || !LZX(intel_started)) {
1945       LZX(intel_curpos) += outlen;
1946     }
1947     else {
1948       cab_UBYTE *data    = CAB(outbuf);
1949       cab_UBYTE *dataend = data + outlen - 10;
1950       cab_LONG curpos    = LZX(intel_curpos);
1951       cab_LONG filesize  = LZX(intel_filesize);
1952       cab_LONG abs_off, rel_off;
1953
1954       LZX(intel_curpos) = curpos + outlen;
1955
1956       while (data < dataend) {
1957         if (*data++ != 0xE8) { curpos++; continue; }
1958         abs_off = data[0] | (data[1]<<8) | (data[2]<<16) | (data[3]<<24);
1959         if ((abs_off >= -curpos) && (abs_off < filesize)) {
1960           rel_off = (abs_off >= 0) ? abs_off - curpos : abs_off + filesize;
1961           data[0] = (cab_UBYTE) rel_off;
1962           data[1] = (cab_UBYTE) (rel_off >> 8);
1963           data[2] = (cab_UBYTE) (rel_off >> 16);
1964           data[3] = (cab_UBYTE) (rel_off >> 24);
1965         }
1966         data += 4;
1967         curpos += 5;
1968       }
1969     }
1970   }
1971   return DECR_OK;
1972 }
1973
1974 /**********************************************************
1975  * fdi_decomp (internal)
1976  *
1977  * Decompress the requested number of bytes.  If savemode is zero,
1978  * do not save the output anywhere, just plow through blocks until we
1979  * reach the specified (uncompressed) distance from the starting point,
1980  * and remember the position of the cabfile pointer (and which cabfile)
1981  * after we are done; otherwise, save the data out to CAB(filehf),
1982  * decompressing the requested number of bytes and writing them out.  This
1983  * is also where we jump to additional cabinets in the case of split
1984  * cab's, and provide (some of) the NEXT_CABINET notification semantics.
1985  */
1986 static int fdi_decomp(const struct fdi_file *fi, int savemode, fdi_decomp_state *decomp_state,
1987   char *pszCabPath, PFNFDINOTIFY pfnfdin, void *pvUser)
1988 {
1989   cab_ULONG bytes = savemode ? fi->length : fi->offset - CAB(offset);
1990   cab_UBYTE buf[cfdata_SIZEOF], *data;
1991   cab_UWORD inlen, len, outlen, cando;
1992   cab_ULONG cksum;
1993   cab_LONG err;
1994   fdi_decomp_state *cab = (savemode && CAB(decomp_cab)) ? CAB(decomp_cab) : decomp_state;
1995
1996   TRACE("(fi == ^%p, savemode == %d, bytes == %d)\n", fi, savemode, bytes);
1997
1998   while (bytes > 0) {
1999     /* cando = the max number of bytes we can do */
2000     cando = CAB(outlen);
2001     if (cando > bytes) cando = bytes;
2002
2003     /* if cando != 0 */
2004     if (cando && savemode)
2005       CAB(fdi)->write(CAB(filehf), CAB(outpos), cando);
2006
2007     CAB(outpos) += cando;
2008     CAB(outlen) -= cando;
2009     bytes -= cando; if (!bytes) break;
2010
2011     /* we only get here if we emptied the output buffer */
2012
2013     /* read data header + data */
2014     inlen = outlen = 0;
2015     while (outlen == 0) {
2016       /* read the block header, skip the reserved part */
2017       if (CAB(fdi)->read(cab->cabhf, buf, cfdata_SIZEOF) != cfdata_SIZEOF)
2018         return DECR_INPUT;
2019
2020       if (CAB(fdi)->seek(cab->cabhf, cab->mii.block_resv, SEEK_CUR) == -1)
2021         return DECR_INPUT;
2022
2023       /* we shouldn't get blocks over CAB_INPUTMAX in size */
2024       data = CAB(inbuf) + inlen;
2025       len = EndGetI16(buf+cfdata_CompressedSize);
2026       inlen += len;
2027       if (inlen > CAB_INPUTMAX) return DECR_INPUT;
2028       if (CAB(fdi)->read(cab->cabhf, data, len) != len)
2029         return DECR_INPUT;
2030
2031       /* clear two bytes after read-in data */
2032       data[len+1] = data[len+2] = 0;
2033
2034       /* perform checksum test on the block (if one is stored) */
2035       cksum = EndGetI32(buf+cfdata_CheckSum);
2036       if (cksum && cksum != checksum(buf+4, 4, checksum(data, len, 0)))
2037         return DECR_CHECKSUM; /* checksum is wrong */
2038
2039       outlen = EndGetI16(buf+cfdata_UncompressedSize);
2040
2041       /* outlen=0 means this block was the last contiguous part
2042          of a split block, continued in the next cabinet */
2043       if (outlen == 0) {
2044         int pathlen, filenamelen, i;
2045         INT_PTR cabhf;
2046         char fullpath[MAX_PATH], userpath[256];
2047         FDINOTIFICATION fdin;
2048         FDICABINETINFO fdici;
2049         char emptystring = '\0';
2050         cab_UBYTE buf2[64];
2051         int success = FALSE;
2052         struct fdi_folder *fol = NULL, *linkfol = NULL; 
2053         struct fdi_file   *file = NULL, *linkfile = NULL;
2054
2055         tryanothercab:
2056
2057         /* set up the next decomp_state... */
2058         if (!(cab->next)) {
2059           if (!cab->mii.hasnext) return DECR_INPUT;
2060
2061           if (!((cab->next = CAB(fdi)->alloc(sizeof(fdi_decomp_state)))))
2062             return DECR_NOMEMORY;
2063
2064           ZeroMemory(cab->next, sizeof(fdi_decomp_state));
2065
2066           /* copy pszCabPath to userpath */
2067           ZeroMemory(userpath, 256);
2068           pathlen = pszCabPath ? strlen(pszCabPath) : 0;
2069           if (pathlen) {
2070             if (pathlen < 256) /* else we are in a weird place... let's leave it blank and see if the user fixes it */
2071               strcpy(userpath, pszCabPath);
2072           }
2073
2074           /* initial fdintNEXT_CABINET notification */
2075           ZeroMemory(&fdin, sizeof(FDINOTIFICATION));
2076           fdin.psz1 = cab->mii.nextname ? cab->mii.nextname : &emptystring;
2077           fdin.psz2 = cab->mii.nextinfo ? cab->mii.nextinfo : &emptystring;
2078           fdin.psz3 = userpath;
2079           fdin.fdie = FDIERROR_NONE;
2080           fdin.pv = pvUser;
2081
2082           if (((*pfnfdin)(fdintNEXT_CABINET, &fdin))) return DECR_USERABORT;
2083
2084           do {
2085
2086             pathlen = strlen(userpath);
2087             filenamelen = cab->mii.nextname ? strlen(cab->mii.nextname) : 0;
2088
2089             /* slight overestimation here to save CPU cycles in the developer's brain */
2090             if ((pathlen + filenamelen + 3) > MAX_PATH) {
2091               ERR("MAX_PATH exceeded.\n");
2092               return DECR_ILLEGALDATA;
2093             }
2094
2095             /* paste the path and filename together */
2096             fullpath[0] = '\0';
2097             if (pathlen) {
2098               strcpy(fullpath, userpath);
2099               if (fullpath[pathlen - 1] != '\\')
2100                 strcat(fullpath, "\\");
2101             }
2102             if (filenamelen)
2103               strcat(fullpath, cab->mii.nextname);
2104
2105             TRACE("full cab path/file name: %s\n", debugstr_a(fullpath));
2106
2107             /* try to get a handle to the cabfile */
2108             cabhf = CAB(fdi)->open(fullpath, _O_RDONLY|_O_BINARY, _S_IREAD | _S_IWRITE);
2109             if (cabhf == -1) {
2110               /* no file.  allow the user to try again */
2111               fdin.fdie = FDIERROR_CABINET_NOT_FOUND;
2112               if (((*pfnfdin)(fdintNEXT_CABINET, &fdin))) return DECR_USERABORT;
2113               continue;
2114             }
2115
2116             if (cabhf == 0) {
2117               ERR("PFDI_OPEN returned zero for %s.\n", fullpath);
2118               fdin.fdie = FDIERROR_CABINET_NOT_FOUND;
2119               if (((*pfnfdin)(fdintNEXT_CABINET, &fdin))) return DECR_USERABORT;
2120               continue;
2121             }
2122
2123             /* check if it's really a cabfile. Note that this doesn't implement the bug */
2124             if (!FDI_read_entries(CAB(fdi), cabhf, &fdici, &(cab->next->mii))) {
2125               WARN("FDIIsCabinet failed.\n");
2126               CAB(fdi)->close(cabhf);
2127               fdin.fdie = FDIERROR_NOT_A_CABINET;
2128               if (((*pfnfdin)(fdintNEXT_CABINET, &fdin))) return DECR_USERABORT;
2129               continue;
2130             }
2131
2132             if ((fdici.setID != cab->setID) || (fdici.iCabinet != (cab->iCabinet + 1))) {
2133               WARN("Wrong Cabinet.\n");
2134               CAB(fdi)->close(cabhf);
2135               fdin.fdie = FDIERROR_WRONG_CABINET;
2136               if (((*pfnfdin)(fdintNEXT_CABINET, &fdin))) return DECR_USERABORT;
2137               continue;
2138             }
2139            
2140             break;
2141
2142           } while (1);
2143           
2144           /* cabinet notification */
2145           ZeroMemory(&fdin, sizeof(FDINOTIFICATION));
2146           fdin.setID = fdici.setID;
2147           fdin.iCabinet = fdici.iCabinet;
2148           fdin.pv = pvUser;
2149           fdin.psz1 = (cab->next->mii.nextname) ? cab->next->mii.nextname : &emptystring;
2150           fdin.psz2 = (cab->next->mii.nextinfo) ? cab->next->mii.nextinfo : &emptystring;
2151           fdin.psz3 = pszCabPath;
2152         
2153           if (((*pfnfdin)(fdintCABINET_INFO, &fdin))) return DECR_USERABORT;
2154           
2155           cab->next->setID = fdici.setID;
2156           cab->next->iCabinet = fdici.iCabinet;
2157           cab->next->fdi = CAB(fdi);
2158           cab->next->filehf = CAB(filehf);
2159           cab->next->cabhf = cabhf;
2160           cab->next->decompress = CAB(decompress); /* crude, but unused anyhow */
2161
2162           cab = cab->next; /* advance to the next cabinet */
2163
2164           /* read folders */
2165           for (i = 0; i < fdici.cFolders; i++) {
2166             if (CAB(fdi)->read(cab->cabhf, buf2, cffold_SIZEOF) != cffold_SIZEOF)
2167               return DECR_INPUT;
2168
2169             if (cab->mii.folder_resv > 0)
2170               CAB(fdi)->seek(cab->cabhf, cab->mii.folder_resv, SEEK_CUR);
2171
2172             fol = CAB(fdi)->alloc(sizeof(struct fdi_folder));
2173             if (!fol) {
2174               ERR("out of memory!\n");
2175               return DECR_NOMEMORY;
2176             }
2177             ZeroMemory(fol, sizeof(struct fdi_folder));
2178             if (!(cab->firstfol)) cab->firstfol = fol;
2179         
2180             fol->offset = (cab_off_t) EndGetI32(buf2+cffold_DataOffset);
2181             fol->num_blocks = EndGetI16(buf2+cffold_NumBlocks);
2182             fol->comp_type  = EndGetI16(buf2+cffold_CompType);
2183         
2184             if (linkfol)
2185               linkfol->next = fol; 
2186             linkfol = fol;
2187           }
2188         
2189           /* read files */
2190           for (i = 0; i < fdici.cFiles; i++) {
2191             if (CAB(fdi)->read(cab->cabhf, buf2, cffile_SIZEOF) != cffile_SIZEOF)
2192               return DECR_INPUT;
2193
2194             file = CAB(fdi)->alloc(sizeof(struct fdi_file));
2195             if (!file) {
2196               ERR("out of memory!\n"); 
2197               return DECR_NOMEMORY;
2198             }
2199             ZeroMemory(file, sizeof(struct fdi_file));
2200             if (!(cab->firstfile)) cab->firstfile = file;
2201               
2202             file->length   = EndGetI32(buf2+cffile_UncompressedSize);
2203             file->offset   = EndGetI32(buf2+cffile_FolderOffset);
2204             file->index    = EndGetI16(buf2+cffile_FolderIndex);
2205             file->time     = EndGetI16(buf2+cffile_Time);
2206             file->date     = EndGetI16(buf2+cffile_Date);
2207             file->attribs  = EndGetI16(buf2+cffile_Attribs);
2208             file->filename = FDI_read_string(CAB(fdi), cab->cabhf, fdici.cbCabinet);
2209         
2210             if (!file->filename) return DECR_INPUT;
2211         
2212             if (linkfile)
2213               linkfile->next = file;
2214             linkfile = file;
2215           }
2216         
2217         } else 
2218             cab = cab->next; /* advance to the next cabinet */
2219
2220         /* iterate files -- if we encounter the continued file, process it --
2221            otherwise, jump to the label above and keep looking */
2222
2223         for (file = cab->firstfile; (file); file = file->next) {
2224           if ((file->index & cffileCONTINUED_FROM_PREV) == cffileCONTINUED_FROM_PREV) {
2225             /* check to ensure a real match */
2226             if (lstrcmpiA(fi->filename, file->filename) == 0) {
2227               success = TRUE;
2228               if (CAB(fdi)->seek(cab->cabhf, cab->firstfol->offset, SEEK_SET) == -1)
2229                 return DECR_INPUT;
2230               break;
2231             }
2232           }
2233         }
2234         if (!success) goto tryanothercab; /* FIXME: shouldn't this trigger
2235                                              "Wrong Cabinet" notification? */
2236       }
2237     }
2238
2239     /* decompress block */
2240     if ((err = CAB(decompress)(inlen, outlen, decomp_state)))
2241       return err;
2242     CAB(outlen) = outlen;
2243     CAB(outpos) = CAB(outbuf);
2244   }
2245   
2246   CAB(decomp_cab) = cab;
2247   return DECR_OK;
2248 }
2249
2250 static void free_decompression_temps(FDI_Int *fdi, const struct fdi_folder *fol,
2251   fdi_decomp_state *decomp_state)
2252 {
2253   switch (fol->comp_type & cffoldCOMPTYPE_MASK) {
2254   case cffoldCOMPTYPE_LZX:
2255     if (LZX(window)) {
2256       fdi->free(LZX(window));
2257       LZX(window) = NULL;
2258     }
2259     break;
2260   case cffoldCOMPTYPE_QUANTUM:
2261     if (QTM(window)) {
2262       fdi->free(QTM(window));
2263       QTM(window) = NULL;
2264     }
2265     break;
2266   }
2267 }
2268
2269 static void free_decompression_mem(FDI_Int *fdi, fdi_decomp_state *decomp_state)
2270 {
2271   struct fdi_folder *fol;
2272   while (decomp_state) {
2273     fdi_decomp_state *prev_fds;
2274
2275     fdi->close(CAB(cabhf));
2276
2277     /* free the storage remembered by mii */
2278     if (CAB(mii).nextname) fdi->free(CAB(mii).nextname);
2279     if (CAB(mii).nextinfo) fdi->free(CAB(mii).nextinfo);
2280     if (CAB(mii).prevname) fdi->free(CAB(mii).prevname);
2281     if (CAB(mii).previnfo) fdi->free(CAB(mii).previnfo);
2282
2283     while (CAB(firstfol)) {
2284       fol = CAB(firstfol);
2285       CAB(firstfol) = CAB(firstfol)->next;
2286       fdi->free(fol);
2287     }
2288     while (CAB(firstfile)) {
2289       struct fdi_file *file = CAB(firstfile);
2290       if (file->filename) fdi->free(file->filename);
2291       CAB(firstfile) = CAB(firstfile)->next;
2292       fdi->free(file);
2293     }
2294     prev_fds = decomp_state;
2295     decomp_state = CAB(next);
2296     fdi->free(prev_fds);
2297   }
2298 }
2299
2300 /***********************************************************************
2301  *              FDICopy (CABINET.22)
2302  *
2303  * Iterates through the files in the Cabinet file indicated by name and
2304  * file-location.  May chain forward to additional cabinets (typically
2305  * only one) if files which begin in this Cabinet are continued in another
2306  * cabinet.  For each file which is partially contained in this cabinet,
2307  * and partially contained in a prior cabinet, provides fdintPARTIAL_FILE
2308  * notification to the pfnfdin callback.  For each file which begins in
2309  * this cabinet, fdintCOPY_FILE notification is provided to the pfnfdin
2310  * callback, and the file is optionally decompressed and saved to disk.
2311  * Notification is not provided for files which are not at least partially
2312  * contained in the specified cabinet file.
2313  *
2314  * See below for a thorough explanation of the various notification
2315  * callbacks.
2316  *
2317  * PARAMS
2318  *   hfdi       [I] An HFDI from FDICreate
2319  *   pszCabinet [I] C-style string containing the filename of the cabinet
2320  *   pszCabPath [I] C-style string containing the file path of the cabinet
2321  *   flags      [I] "Decoder parameters".  Ignored.  Suggested value: 0.
2322  *   pfnfdin    [I] Pointer to a notification function.  See CALLBACKS below.
2323  *   pfnfdid    [I] Pointer to a decryption function.  Ignored.  Suggested
2324  *                  value: NULL.
2325  *   pvUser     [I] arbitrary void * value which is passed to callbacks.
2326  *
2327  * RETURNS
2328  *   TRUE if successful.
2329  *   FALSE if unsuccessful (error information is provided in the ERF structure
2330  *     associated with the provided decompression handle by FDICreate).
2331  *
2332  * CALLBACKS
2333  *
2334  *   Two pointers to callback functions are provided as parameters to FDICopy:
2335  *   pfnfdin(of type PFNFDINOTIFY), and pfnfdid (of type PFNFDIDECRYPT).  These
2336  *   types are as follows:
2337  *
2338  *     typedef INT_PTR (__cdecl *PFNFDINOTIFY)  ( FDINOTIFICATIONTYPE fdint,
2339  *                                               PFDINOTIFICATION  pfdin );
2340  *
2341  *     typedef int     (__cdecl *PFNFDIDECRYPT) ( PFDIDECRYPT pfdid );
2342  *
2343  *   You can create functions of this type using the FNFDINOTIFY() and
2344  *   FNFDIDECRYPT() macros, respectively.  For example:
2345  *
2346  *     FNFDINOTIFY(mycallback) {
2347  *       / * use variables fdint and pfdin to process notification * /
2348  *     }
2349  *
2350  *   The second callback, which could be used for decrypting encrypted data,
2351  *   is not used at all.
2352  *
2353  *   Each notification informs the user of some event which has occurred during
2354  *   decompression of the cabinet file; each notification is also an opportunity
2355  *   for the callee to abort decompression.  The information provided to the
2356  *   callback and the meaning of the callback's return value vary drastically
2357  *   across the various types of notification.  The type of notification is the
2358  *   fdint parameter; all other information is provided to the callback in
2359  *   notification-specific parts of the FDINOTIFICATION structure pointed to by
2360  *   pfdin.  The only part of that structure which is assigned for every callback
2361  *   is the pv element, which contains the arbitrary value which was passed to
2362  *   FDICopy in the pvUser argument (psz1 is also used each time, but its meaning
2363  *   is highly dependent on fdint).
2364  *   
2365  *   If you encounter unknown notifications, you should return zero if you want
2366  *   decompression to continue (or -1 to abort).  All strings used in the
2367  *   callbacks are regular C-style strings.  Detailed descriptions of each
2368  *   notification type follow:
2369  *
2370  *   fdintCABINET_INFO:
2371  * 
2372  *     This is the first notification provided after calling FDICopy, and provides
2373  *     the user with various information about the cabinet.  Note that this is
2374  *     called for each cabinet FDICopy opens, not just the first one.  In the
2375  *     structure pointed to by pfdin, psz1 contains a pointer to the name of the
2376  *     next cabinet file in the set after the one just loaded (if any), psz2
2377  *     contains a pointer to the name or "info" of the next disk, psz3
2378  *     contains a pointer to the file-path of the current cabinet, setID
2379  *     contains an arbitrary constant associated with this set of cabinet files,
2380  *     and iCabinet contains the numerical index of the current cabinet within
2381  *     that set.  Return zero, or -1 to abort.
2382  *
2383  *   fdintPARTIAL_FILE:
2384  *
2385  *     This notification is provided when FDICopy encounters a part of a file
2386  *     contained in this cabinet which is missing its beginning.  Files can be
2387  *     split across cabinets, so this is not necessarily an abnormality; it just
2388  *     means that the file in question begins in another cabinet.  No file
2389  *     corresponding to this notification is extracted from the cabinet.  In the
2390  *     structure pointed to by pfdin, psz1 contains a pointer to the name of the
2391  *     partial file, psz2 contains a pointer to the file name of the cabinet in
2392  *     which this file begins, and psz3 contains a pointer to the disk name or
2393  *     "info" of the cabinet where the file begins. Return zero, or -1 to abort.
2394  *
2395  *   fdintCOPY_FILE:
2396  *
2397  *     This notification is provided when FDICopy encounters a file which starts
2398  *     in the cabinet file, provided to FDICopy in pszCabinet.  (FDICopy will not
2399  *     look for files in cabinets after the first one).  One notification will be
2400  *     sent for each such file, before the file is decompressed.  By returning
2401  *     zero, the callback can instruct FDICopy to skip the file.  In the structure
2402  *     pointed to by pfdin, psz1 contains a pointer to the file's name, cb contains
2403  *     the size of the file (uncompressed), attribs contains the file attributes,
2404  *     and date and time contain the date and time of the file.  attributes, date,
2405  *     and time are of the 16-bit ms-dos variety.  Return -1 to abort decompression
2406  *     for the entire cabinet, 0 to skip just this file but continue scanning the
2407  *     cabinet for more files, or an FDIClose()-compatible file-handle.
2408  *
2409  *   fdintCLOSE_FILE_INFO:
2410  *
2411  *     This notification is important, don't forget to implement it.  This
2412  *     notification indicates that a file has been successfully uncompressed and
2413  *     written to disk.  Upon receipt of this notification, the callee is expected
2414  *     to close the file handle, to set the attributes and date/time of the
2415  *     closed file, and possibly to execute the file.  In the structure pointed to
2416  *     by pfdin, psz1 contains a pointer to the name of the file, hf will be the
2417  *     open file handle (close it), cb contains 1 or zero, indicating respectively
2418  *     that the callee should or should not execute the file, and date, time
2419  *     and attributes will be set as in fdintCOPY_FILE.  Bizarrely, the Cabinet SDK
2420  *     specifies that _A_EXEC will be xor'ed out of attributes!  wine does not do
2421  *     do so.  Return TRUE, or FALSE to abort decompression.
2422  *
2423  *   fdintNEXT_CABINET:
2424  *
2425  *     This notification is called when FDICopy must load in another cabinet.  This
2426  *     can occur when a file's data is "split" across multiple cabinets.  The
2427  *     callee has the opportunity to request that FDICopy look in a different file
2428  *     path for the specified cabinet file, by writing that data into a provided
2429  *     buffer (see below for more information).  This notification will be received
2430  *     more than once per-cabinet in the instance that FDICopy failed to find a
2431  *     valid cabinet at the location specified by the first per-cabinet
2432  *     fdintNEXT_CABINET notification.  In such instances, the fdie element of the
2433  *     structure pointed to by pfdin indicates the error which prevented FDICopy
2434  *     from proceeding successfully.  Return zero to indicate success, or -1 to
2435  *     indicate failure and abort FDICopy.
2436  *
2437  *     Upon receipt of this notification, the structure pointed to by pfdin will
2438  *     contain the following values: psz1 pointing to the name of the cabinet
2439  *     which FDICopy is attempting to open, psz2 pointing to the name ("info") of
2440  *     the next disk, psz3 pointing to the presumed file-location of the cabinet,
2441  *     and fdie containing either FDIERROR_NONE, or one of the following: 
2442  *
2443  *       FDIERROR_CABINET_NOT_FOUND, FDIERROR_NOT_A_CABINET,
2444  *       FDIERROR_UNKNOWN_CABINET_VERSION, FDIERROR_CORRUPT_CABINET,
2445  *       FDIERROR_BAD_COMPR_TYPE, FDIERROR_RESERVE_MISMATCH, and 
2446  *       FDIERROR_WRONG_CABINET.
2447  *
2448  *     The callee may choose to change the path where FDICopy will look for the
2449  *     cabinet after this notification.  To do so, the caller may write the new
2450  *     pathname to the buffer pointed to by psz3, which is 256 characters in
2451  *     length, including the terminating null character, before returning zero.
2452  *
2453  *   fdintENUMERATE:
2454  *
2455  *     Undocumented and unimplemented in wine, this seems to be sent each time
2456  *     a cabinet is opened, along with the fdintCABINET_INFO notification.  It
2457  *     probably has an interface similar to that of fdintCABINET_INFO; maybe this
2458  *     provides information about the current cabinet instead of the next one....
2459  *     this is just a guess, it has not been looked at closely.
2460  *
2461  * INCLUDES
2462  *   fdi.c
2463  */
2464 BOOL __cdecl FDICopy(
2465         HFDI           hfdi,
2466         char          *pszCabinet,
2467         char          *pszCabPath,
2468         int            flags,
2469         PFNFDINOTIFY   pfnfdin,
2470         PFNFDIDECRYPT  pfnfdid,
2471         void          *pvUser)
2472
2473   FDICABINETINFO    fdici;
2474   FDINOTIFICATION   fdin;
2475   INT_PTR           cabhf, filehf = 0;
2476   unsigned int      i;
2477   char              fullpath[MAX_PATH];
2478   size_t            pathlen, filenamelen;
2479   char              emptystring = '\0';
2480   cab_UBYTE         buf[64];
2481   struct fdi_folder *fol = NULL, *linkfol = NULL; 
2482   struct fdi_file   *file = NULL, *linkfile = NULL;
2483   fdi_decomp_state *decomp_state;
2484   FDI_Int *fdi = get_fdi_ptr( hfdi );
2485
2486   TRACE("(hfdi == ^%p, pszCabinet == %s, pszCabPath == %s, flags == %x, "
2487         "pfnfdin == ^%p, pfnfdid == ^%p, pvUser == ^%p)\n",
2488         hfdi, debugstr_a(pszCabinet), debugstr_a(pszCabPath), flags, pfnfdin, pfnfdid, pvUser);
2489
2490   if (!fdi) return FALSE;
2491
2492   if (!(decomp_state = fdi->alloc(sizeof(fdi_decomp_state))))
2493   {
2494       SetLastError(ERROR_NOT_ENOUGH_MEMORY);
2495       return FALSE;
2496   }
2497   ZeroMemory(decomp_state, sizeof(fdi_decomp_state));
2498
2499   pathlen = pszCabPath ? strlen(pszCabPath) : 0;
2500   filenamelen = pszCabinet ? strlen(pszCabinet) : 0;
2501
2502   /* slight overestimation here to save CPU cycles in the developer's brain */
2503   if ((pathlen + filenamelen + 3) > MAX_PATH) {
2504     ERR("MAX_PATH exceeded.\n");
2505     fdi->free(decomp_state);
2506     set_error( fdi, FDIERROR_CABINET_NOT_FOUND, ERROR_FILE_NOT_FOUND );
2507     return FALSE;
2508   }
2509
2510   /* paste the path and filename together */
2511   fullpath[0] = '\0';
2512   if (pathlen)
2513     strcpy(fullpath, pszCabPath);
2514   if (filenamelen)
2515     strcat(fullpath, pszCabinet);
2516
2517   TRACE("full cab path/file name: %s\n", debugstr_a(fullpath));
2518
2519   /* get a handle to the cabfile */
2520   cabhf = fdi->open(fullpath, _O_RDONLY|_O_BINARY, _S_IREAD | _S_IWRITE);
2521   if (cabhf == -1) {
2522     fdi->free(decomp_state);
2523     set_error( fdi, FDIERROR_CABINET_NOT_FOUND, 0 );
2524     SetLastError(ERROR_FILE_NOT_FOUND);
2525     return FALSE;
2526   }
2527
2528   /* check if it's really a cabfile. Note that this doesn't implement the bug */
2529   if (!FDI_read_entries(fdi, cabhf, &fdici, &(CAB(mii)))) {
2530     WARN("FDI_read_entries failed: %u\n", fdi->perf->erfOper);
2531     fdi->free(decomp_state);
2532     fdi->close(cabhf);
2533     return FALSE;
2534   }
2535
2536   /* cabinet notification */
2537   ZeroMemory(&fdin, sizeof(FDINOTIFICATION));
2538   fdin.setID = fdici.setID;
2539   fdin.iCabinet = fdici.iCabinet;
2540   fdin.pv = pvUser;
2541   fdin.psz1 = (CAB(mii).nextname) ? CAB(mii).nextname : &emptystring;
2542   fdin.psz2 = (CAB(mii).nextinfo) ? CAB(mii).nextinfo : &emptystring;
2543   fdin.psz3 = pszCabPath;
2544
2545   if (((*pfnfdin)(fdintCABINET_INFO, &fdin))) {
2546     set_error( fdi, FDIERROR_USER_ABORT, 0 );
2547     goto bail_and_fail;
2548   }
2549
2550   CAB(setID) = fdici.setID;
2551   CAB(iCabinet) = fdici.iCabinet;
2552   CAB(cabhf) = cabhf;
2553
2554   /* read folders */
2555   for (i = 0; i < fdici.cFolders; i++) {
2556     if (fdi->read(cabhf, buf, cffold_SIZEOF) != cffold_SIZEOF) {
2557       set_error( fdi, FDIERROR_CORRUPT_CABINET, 0 );
2558       goto bail_and_fail;
2559     }
2560
2561     if (CAB(mii).folder_resv > 0)
2562       fdi->seek(cabhf, CAB(mii).folder_resv, SEEK_CUR);
2563
2564     fol = fdi->alloc(sizeof(struct fdi_folder));
2565     if (!fol) {
2566       ERR("out of memory!\n");
2567       set_error( fdi, FDIERROR_ALLOC_FAIL, ERROR_NOT_ENOUGH_MEMORY );
2568       goto bail_and_fail;
2569     }
2570     ZeroMemory(fol, sizeof(struct fdi_folder));
2571     if (!CAB(firstfol)) CAB(firstfol) = fol;
2572
2573     fol->offset = (cab_off_t) EndGetI32(buf+cffold_DataOffset);
2574     fol->num_blocks = EndGetI16(buf+cffold_NumBlocks);
2575     fol->comp_type  = EndGetI16(buf+cffold_CompType);
2576
2577     if (linkfol)
2578       linkfol->next = fol; 
2579     linkfol = fol;
2580   }
2581
2582   /* read files */
2583   for (i = 0; i < fdici.cFiles; i++) {
2584     if (fdi->read(cabhf, buf, cffile_SIZEOF) != cffile_SIZEOF) {
2585       set_error( fdi, FDIERROR_CORRUPT_CABINET, 0 );
2586       goto bail_and_fail;
2587     }
2588
2589     file = fdi->alloc(sizeof(struct fdi_file));
2590     if (!file) { 
2591       ERR("out of memory!\n"); 
2592       set_error( fdi, FDIERROR_ALLOC_FAIL, ERROR_NOT_ENOUGH_MEMORY );
2593       goto bail_and_fail;
2594     }
2595     ZeroMemory(file, sizeof(struct fdi_file));
2596     if (!CAB(firstfile)) CAB(firstfile) = file;
2597       
2598     file->length   = EndGetI32(buf+cffile_UncompressedSize);
2599     file->offset   = EndGetI32(buf+cffile_FolderOffset);
2600     file->index    = EndGetI16(buf+cffile_FolderIndex);
2601     file->time     = EndGetI16(buf+cffile_Time);
2602     file->date     = EndGetI16(buf+cffile_Date);
2603     file->attribs  = EndGetI16(buf+cffile_Attribs);
2604     file->filename = FDI_read_string(fdi, cabhf, fdici.cbCabinet);
2605
2606     if (!file->filename) {
2607       set_error( fdi, FDIERROR_CORRUPT_CABINET, 0 );
2608       goto bail_and_fail;
2609     }
2610
2611     if (linkfile)
2612       linkfile->next = file;
2613     linkfile = file;
2614   }
2615
2616   for (file = CAB(firstfile); (file); file = file->next) {
2617
2618     /*
2619      * FIXME: This implementation keeps multiple cabinet files open at once
2620      * when encountering a split cabinet.  It is a quirk of this implementation
2621      * that sometimes we decrypt the same block of data more than once, to find
2622      * the right starting point for a file, moving the file-pointer backwards.
2623      * If we kept a cache of certain file-pointer information, we could eliminate
2624      * that behavior... in fact I am not sure that the caching we already have
2625      * is not sufficient.
2626      * 
2627      * The current implementation seems to work fine in straightforward situations
2628      * where all the cabinet files needed for decryption are simultaneously
2629      * available.  But presumably, the API is supposed to support cabinets which
2630      * are split across multiple CDROMS; we may need to change our implementation
2631      * to strictly serialize it's file usage so that it opens only one cabinet
2632      * at a time.  Some experimentation with Windows is needed to figure out the
2633      * precise semantics required.  The relevant code is here and in fdi_decomp().
2634      */
2635
2636     /* partial-file notification */
2637     if ((file->index & cffileCONTINUED_FROM_PREV) == cffileCONTINUED_FROM_PREV) {
2638       /*
2639        * FIXME: Need to create a Cabinet with a single file spanning multiple files
2640        * and perform some tests to figure out the right behavior.  The SDK says
2641        * FDICopy will notify the user of the filename and "disk name" (info) of
2642        * the cabinet where the spanning file /started/.
2643        *
2644        * That would certainly be convenient for the API-user, who could abort,
2645        * everything (or parallelize, if that's allowed (it is in wine)), and call
2646        * FDICopy again with the provided filename, so as to avoid partial file
2647        * notification and successfully unpack.  This task could be quite unpleasant
2648        * from wine's perspective: the information specifying the "start cabinet" for
2649        * a file is associated nowhere with the file header and is not to be found in
2650        * the cabinet header.  We have only the index of the cabinet wherein the folder
2651        * begins, which contains the file.  To find that cabinet, we must consider the
2652        * index of the current cabinet, and chain backwards, cabinet-by-cabinet (for
2653        * each cabinet refers to its "next" and "previous" cabinet only, like a linked
2654        * list).
2655        *
2656        * Bear in mind that, in the spirit of CABINET.DLL, we must assume that any
2657        * cabinet other than the active one might be at another filepath than the
2658        * current one, or on another CDROM. This could get rather dicey, especially
2659        * if we imagine parallelized access to the FDICopy API.
2660        *
2661        * The current implementation punts -- it just returns the previous cabinet and
2662        * it's info from the header of this cabinet.  This provides the right answer in
2663        * 95% of the cases; its worth checking if Microsoft cuts the same corner before
2664        * we "fix" it.
2665        */
2666       ZeroMemory(&fdin, sizeof(FDINOTIFICATION));
2667       fdin.pv = pvUser;
2668       fdin.psz1 = (char *)file->filename;
2669       fdin.psz2 = (CAB(mii).prevname) ? CAB(mii).prevname : &emptystring;
2670       fdin.psz3 = (CAB(mii).previnfo) ? CAB(mii).previnfo : &emptystring;
2671
2672       if (((*pfnfdin)(fdintPARTIAL_FILE, &fdin))) {
2673         set_error( fdi, FDIERROR_USER_ABORT, 0 );
2674         goto bail_and_fail;
2675       }
2676       /* I don't think we are supposed to decompress partial files.  This prevents it. */
2677       file->oppressed = TRUE;
2678     }
2679     if (file->oppressed) {
2680       filehf = 0;
2681     } else {
2682       ZeroMemory(&fdin, sizeof(FDINOTIFICATION));
2683       fdin.pv = pvUser;
2684       fdin.psz1 = (char *)file->filename;
2685       fdin.cb = file->length;
2686       fdin.date = file->date;
2687       fdin.time = file->time;
2688       fdin.attribs = file->attribs;
2689       if ((filehf = ((*pfnfdin)(fdintCOPY_FILE, &fdin))) == -1) {
2690         set_error( fdi, FDIERROR_USER_ABORT, 0 );
2691         filehf = 0;
2692         goto bail_and_fail;
2693       }
2694     }
2695
2696     /* find the folder for this file if necc. */
2697     if (filehf) {
2698       int i2;
2699
2700       fol = CAB(firstfol);
2701       if ((file->index & cffileCONTINUED_TO_NEXT) == cffileCONTINUED_TO_NEXT) {
2702         /* pick the last folder */
2703         while (fol->next) fol = fol->next;
2704       } else {
2705         for (i2 = 0; (i2 < file->index); i2++)
2706           if (fol->next) /* bug resistance, should always be true */
2707             fol = fol->next;
2708       }
2709     }
2710
2711     if (filehf) {
2712       cab_UWORD comptype = fol->comp_type;
2713       int ct1 = comptype & cffoldCOMPTYPE_MASK;
2714       int ct2 = CAB(current) ? (CAB(current)->comp_type & cffoldCOMPTYPE_MASK) : 0;
2715       int err = 0;
2716
2717       TRACE("Extracting file %s as requested by callee.\n", debugstr_a(file->filename));
2718
2719       /* set up decomp_state */
2720       CAB(fdi) = fdi;
2721       CAB(filehf) = filehf;
2722
2723       /* Was there a change of folder?  Compression type?  Did we somehow go backwards? */
2724       if ((ct1 != ct2) || (CAB(current) != fol) || (file->offset < CAB(offset))) {
2725
2726         TRACE("Resetting folder for file %s.\n", debugstr_a(file->filename));
2727
2728         /* free stuff for the old decompressor */
2729         switch (ct2) {
2730         case cffoldCOMPTYPE_LZX:
2731           if (LZX(window)) {
2732             fdi->free(LZX(window));
2733             LZX(window) = NULL;
2734           }
2735           break;
2736         case cffoldCOMPTYPE_QUANTUM:
2737           if (QTM(window)) {
2738             fdi->free(QTM(window));
2739             QTM(window) = NULL;
2740           }
2741           break;
2742         }
2743
2744         CAB(decomp_cab) = NULL;
2745         CAB(fdi)->seek(CAB(cabhf), fol->offset, SEEK_SET);
2746         CAB(offset) = 0;
2747         CAB(outlen) = 0;
2748
2749         /* initialize the new decompressor */
2750         switch (ct1) {
2751         case cffoldCOMPTYPE_NONE:
2752           CAB(decompress) = NONEfdi_decomp;
2753           break;
2754         case cffoldCOMPTYPE_MSZIP:
2755           CAB(decompress) = ZIPfdi_decomp;
2756           break;
2757         case cffoldCOMPTYPE_QUANTUM:
2758           CAB(decompress) = QTMfdi_decomp;
2759           err = QTMfdi_init((comptype >> 8) & 0x1f, (comptype >> 4) & 0xF, decomp_state);
2760           break;
2761         case cffoldCOMPTYPE_LZX:
2762           CAB(decompress) = LZXfdi_decomp;
2763           err = LZXfdi_init((comptype >> 8) & 0x1f, decomp_state);
2764           break;
2765         default:
2766           err = DECR_DATAFORMAT;
2767         }
2768       }
2769
2770       CAB(current) = fol;
2771
2772       switch (err) {
2773         case DECR_OK:
2774           break;
2775         case DECR_NOMEMORY:
2776           set_error( fdi, FDIERROR_ALLOC_FAIL, ERROR_NOT_ENOUGH_MEMORY );
2777           goto bail_and_fail;
2778         default:
2779           set_error( fdi, FDIERROR_CORRUPT_CABINET, 0 );
2780           goto bail_and_fail;
2781       }
2782
2783       if (file->offset > CAB(offset)) {
2784         /* decode bytes and send them to /dev/null */
2785         switch (fdi_decomp(file, 0, decomp_state, pszCabPath, pfnfdin, pvUser)) {
2786           case DECR_OK:
2787             break;
2788           case DECR_USERABORT:
2789             set_error( fdi, FDIERROR_USER_ABORT, 0 );
2790             goto bail_and_fail;
2791           case DECR_NOMEMORY:
2792             set_error( fdi, FDIERROR_ALLOC_FAIL, ERROR_NOT_ENOUGH_MEMORY );
2793             goto bail_and_fail;
2794           default:
2795             set_error( fdi, FDIERROR_CORRUPT_CABINET, 0 );
2796             goto bail_and_fail;
2797         }
2798         CAB(offset) = file->offset;
2799       }
2800
2801       /* now do the actual decompression */
2802       err = fdi_decomp(file, 1, decomp_state, pszCabPath, pfnfdin, pvUser);
2803       if (err) CAB(current) = NULL; else CAB(offset) += file->length;
2804
2805       /* fdintCLOSE_FILE_INFO notification */
2806       ZeroMemory(&fdin, sizeof(FDINOTIFICATION));
2807       fdin.pv = pvUser;
2808       fdin.psz1 = (char *)file->filename;
2809       fdin.hf = filehf;
2810       fdin.cb = (file->attribs & cffile_A_EXEC) != 0; /* FIXME: is that right? */
2811       fdin.date = file->date;
2812       fdin.time = file->time;
2813       fdin.attribs = file->attribs; /* FIXME: filter _A_EXEC? */
2814       ((*pfnfdin)(fdintCLOSE_FILE_INFO, &fdin));
2815       filehf = 0;
2816
2817       switch (err) {
2818         case DECR_OK:
2819           break;
2820         case DECR_USERABORT:
2821           set_error( fdi, FDIERROR_USER_ABORT, 0 );
2822           goto bail_and_fail;
2823         case DECR_NOMEMORY:
2824           set_error( fdi, FDIERROR_ALLOC_FAIL, ERROR_NOT_ENOUGH_MEMORY );
2825           goto bail_and_fail;
2826         default:
2827           set_error( fdi, FDIERROR_CORRUPT_CABINET, 0 );
2828           goto bail_and_fail;
2829       }
2830     }
2831   }
2832
2833   if (fol) free_decompression_temps(fdi, fol, decomp_state);
2834   free_decompression_mem(fdi, decomp_state);
2835  
2836   return TRUE;
2837
2838   bail_and_fail: /* here we free ram before error returns */
2839
2840   if (fol) free_decompression_temps(fdi, fol, decomp_state);
2841
2842   if (filehf) fdi->close(filehf);
2843
2844   free_decompression_mem(fdi, decomp_state);
2845
2846   return FALSE;
2847 }
2848
2849 /***********************************************************************
2850  *              FDIDestroy (CABINET.23)
2851  *
2852  * Frees a handle created by FDICreate.  Do /not/ call this in the middle
2853  * of FDICopy.  Only reason for failure would be an invalid handle.
2854  * 
2855  * PARAMS
2856  *   hfdi [I] The HFDI to free
2857  *
2858  * RETURNS
2859  *   TRUE for success
2860  *   FALSE for failure
2861  */
2862 BOOL __cdecl FDIDestroy(HFDI hfdi)
2863 {
2864     FDI_Int *fdi = get_fdi_ptr( hfdi );
2865
2866     TRACE("(hfdi == ^%p)\n", hfdi);
2867     if (!fdi) return FALSE;
2868     fdi->magic = 0; /* paranoia */
2869     fdi->free(fdi);
2870     return TRUE;
2871 }
2872
2873 /***********************************************************************
2874  *              FDITruncateCabinet (CABINET.24)
2875  *
2876  * Removes all folders of a cabinet file after and including the
2877  * specified folder number.
2878  * 
2879  * PARAMS
2880  *   hfdi            [I] Handle to the FDI context.
2881  *   pszCabinetName  [I] Filename of the cabinet.
2882  *   iFolderToDelete [I] Index of the first folder to delete.
2883  * 
2884  * RETURNS
2885  *   Success: TRUE.
2886  *   Failure: FALSE.
2887  * 
2888  * NOTES
2889  *   The PFNWRITE function supplied to FDICreate must truncate the
2890  *   file at the current position if the number of bytes to write is 0.
2891  */
2892 BOOL __cdecl FDITruncateCabinet(
2893         HFDI    hfdi,
2894         char   *pszCabinetName,
2895         USHORT  iFolderToDelete)
2896 {
2897   FDI_Int *fdi = get_fdi_ptr( hfdi );
2898
2899   FIXME("(hfdi == ^%p, pszCabinetName == %s, iFolderToDelete == %hu): stub\n",
2900     hfdi, debugstr_a(pszCabinetName), iFolderToDelete);
2901
2902   if (!fdi) return FALSE;
2903
2904   SetLastError(ERROR_CALL_NOT_IMPLEMENTED);
2905   return FALSE;
2906 }