123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641 |
- /*** types.h - Common defines for FCI/FDI stuff -- goes into FCI/FDI.H
- *
- * Copyright (C) Microsoft Corporation
- * All Rights Reserved.
- *
- */
- #ifndef INCLUDED_TYPES_FCI_FDI
- #define INCLUDED_TYPES_FCI_FDI 1
- #ifdef __cplusplus
- extern "C" { /* Assume C declarations for C++ */
- #endif /* __cplusplus */
- //** Define away for 32-bit build
- #ifndef HUGE
- #define HUGE
- #endif
- #ifndef FAR
- #define FAR
- #endif
- #ifndef DIAMONDAPI
- #define DIAMONDAPI __cdecl
- #endif
- //** Specify structure packing explicitly for clients of FDI
- #ifndef _WIN64
- #include <pshpack4.h>
- #endif
- //** Don't redefine types defined in Win16 WINDOWS.H (_INC_WINDOWS)
- // or Win32 WINDOWS.H (_WINDOWS_)
- //
- #if !defined(_INC_WINDOWS) && !defined(_WINDOWS_)
- typedef int BOOL; /* f */
- typedef unsigned char BYTE; /* b */
- typedef unsigned int UINT; /* ui */
- typedef unsigned short USHORT; /* us */
- typedef unsigned long ULONG; /* ul */
- #endif // _INC_WINDOWS
- typedef unsigned long CHECKSUM; /* csum */
- typedef unsigned long UOFF; /* uoff - uncompressed offset */
- typedef unsigned long COFF; /* coff - cabinet file offset */
- #ifndef TRUE
- #define TRUE 1
- #endif
- #ifndef FALSE
- #define FALSE 0
- #endif
- #ifndef NULL
- #define NULL 0
- #endif
- /*** ERF - Error structure
- *
- * This structure returns error information from FCI/FDI. The caller should
- * not modify this structure.
- */
- typedef struct {
- int erfOper; // FCI/FDI error code -- see FDIERROR_XXX
- // and FCIERR_XXX equates for details.
- int erfType; // Optional error value filled in by FCI/FDI.
- // For FCI, this is usually the C run-time
- // *errno* value.
- BOOL fError; // TRUE => error present
- } ERF; /* erf */
- typedef ERF FAR *PERF; /* perf */
- #ifdef _DEBUG
- // don't hide statics from map during debugging
- #define STATIC
- #else // !DEBUG
- #define STATIC static
- #endif // !DEBUG
- #define CB_MAX_CHUNK 32768U
- #define CB_MAX_DISK 0x7fffffffL
- #define CB_MAX_FILENAME 256
- #define CB_MAX_CABINET_NAME 256
- #define CB_MAX_CAB_PATH 256
- #define CB_MAX_DISK_NAME 256
- /*** tcompXXX - Diamond compression types
- *
- * These are passed to FCIAddFile(), and are also stored in the CFFOLDER
- * structures in cabinet files.
- *
- * NOTE: We reserve bits for the TYPE, QUANTUM_LEVEL, and QUANTUM_MEM
- * to provide room for future expansion. Since this value is stored
- * in the CFDATA records in the cabinet file, we don't want to
- * have to change the format for existing compression configurations
- * if we add new ones in the future. This will allows us to read
- * old cabinet files in the future.
- */
- typedef unsigned short TCOMP; /* tcomp */
- #define tcompMASK_TYPE 0x000F // Mask for compression type
- #define tcompTYPE_NONE 0x0000 // No compression
- #define tcompTYPE_MSZIP 0x0001 // MSZIP
- #define tcompTYPE_QUANTUM 0x0002 // Quantum
- #define tcompTYPE_LZX 0x0003 // LZX
- #define tcompBAD 0x000F // Unspecified compression type
- #define tcompMASK_LZX_WINDOW 0x1F00 // Mask for LZX Compression Memory
- #define tcompLZX_WINDOW_LO 0x0F00 // Lowest LZX Memory (15)
- #define tcompLZX_WINDOW_HI 0x1500 // Highest LZX Memory (21)
- #define tcompSHIFT_LZX_WINDOW 8 // Amount to shift over to get int
- #define tcompMASK_QUANTUM_LEVEL 0x00F0 // Mask for Quantum Compression Level
- #define tcompQUANTUM_LEVEL_LO 0x0010 // Lowest Quantum Level (1)
- #define tcompQUANTUM_LEVEL_HI 0x0070 // Highest Quantum Level (7)
- #define tcompSHIFT_QUANTUM_LEVEL 4 // Amount to shift over to get int
- #define tcompMASK_QUANTUM_MEM 0x1F00 // Mask for Quantum Compression Memory
- #define tcompQUANTUM_MEM_LO 0x0A00 // Lowest Quantum Memory (10)
- #define tcompQUANTUM_MEM_HI 0x1500 // Highest Quantum Memory (21)
- #define tcompSHIFT_QUANTUM_MEM 8 // Amount to shift over to get int
- #define tcompMASK_RESERVED 0xE000 // Reserved bits (high 3 bits)
- #define CompressionTypeFromTCOMP(tc) \
- ((tc) & tcompMASK_TYPE)
- #define CompressionLevelFromTCOMP(tc) \
- (((tc) & tcompMASK_QUANTUM_LEVEL) >> tcompSHIFT_QUANTUM_LEVEL)
- #define CompressionMemoryFromTCOMP(tc) \
- (((tc) & tcompMASK_QUANTUM_MEM) >> tcompSHIFT_QUANTUM_MEM)
- #define TCOMPfromTypeLevelMemory(t,l,m) \
- (((m) << tcompSHIFT_QUANTUM_MEM ) | \
- ((l) << tcompSHIFT_QUANTUM_LEVEL) | \
- ( t ))
- #define LZXCompressionWindowFromTCOMP(tc) \
- (((tc) & tcompMASK_LZX_WINDOW) >> tcompSHIFT_LZX_WINDOW)
- #define TCOMPfromLZXWindow(w) \
- (((w) << tcompSHIFT_LZX_WINDOW ) | \
- ( tcompTYPE_LZX ))
- //** Revert to default structure packing
- #ifndef _WIN64
- #include <poppack.h>
- #endif
- #ifdef __cplusplus
- }
- #endif /* __cplusplus */
- #endif // !INCLUDED_TYPES_FCI_FDI
- /*** fci_int.h - File Compression Interface definitions
- *
- * Microsoft Confidential
- * Copyright (C) Microsoft Corporation 1993-1994
- * All Rights Reserved.
- *
- * Author:
- * Chuck Strouss
- *
- * History:
- * 09-Jan-1994 chuckst Contents moved to bfol.h, this file is a
- * placeholder for the new 'higher-level' fci
- * 14-Feb-1994 bens Cleaned up some comments.
- * 09-Mar-1994 bens Added error codes (moved from buildcab.h);
- * Added RESERVE control
- * 17-Mar-1994 bens Specify structure packing explicitly
- * 21-Mar-1994 bens Cleaned up names
- * 22-Mar-1994 bens Documented error cods
- * 29-Mar-1994 bens Add FCIFlushFolder, renamed FCIFlushCabinet
- * 18-Apr-1994 bens Changed CDECL to DIAMONDAPI
- * 18-May-1994 bens Add ccab.fFailOnIncompressible field for
- * Chicago M6 hack.
- */
- #ifndef INCLUDED_FCI
- #define INCLUDED_FCI 1
- #include <basetsd.h>
- #ifdef __cplusplus
- extern "C" { /* Assume C declarations for C++ */
- #endif /* __cplusplus */
- //** Specify structure packing explicitly for clients of FCI
- #ifndef _WIN64
- #pragma pack(4)
- #endif
- /*** FCIERROR - Error codes returned in erf.erfOper field
- *
- */
- typedef enum {
- FCIERR_NONE, // No error
- FCIERR_OPEN_SRC, // Failure opening file to be stored in cabinet
- // erf.erfTyp has C run-time *errno* value
- FCIERR_READ_SRC, // Failure reading file to be stored in cabinet
- // erf.erfTyp has C run-time *errno* value
- FCIERR_ALLOC_FAIL, // Out of memory in FCI
- FCIERR_TEMP_FILE, // Could not create a temporary file
- // erf.erfTyp has C run-time *errno* value
- FCIERR_BAD_COMPR_TYPE, // Unknown compression type
- FCIERR_CAB_FILE, // Could not create cabinet file
- // erf.erfTyp has C run-time *errno* value
- FCIERR_USER_ABORT, // Client requested abort
- FCIERR_MCI_FAIL, // Failure compressing data
- } FCIERROR;
- /*
- * FAT file attribute flag used by FCI/FDI to indicate that
- * the filename in the CAB is a UTF string
- */
- #ifndef _A_NAME_IS_UTF
- #define _A_NAME_IS_UTF 0x80
- #endif
- /*
- * FAT file attribute flag used by FCI/FDI to indicate that
- * the file should be executed after extraction
- */
- #ifndef _A_EXEC
- #define _A_EXEC 0x40
- #endif
- /*** HFCI - Handle to an FCI Context
- *
- */
- typedef void * HFCI;
- /*** CCAB - Current Cabinet
- *
- * This structure is used for passing in the cabinet parameters to FCI,
- * and is passed back on certain FCI callbacks to provide cabinet
- * information to the client.
- */
- typedef struct {
- // longs first
- ULONG cb; // size available for cabinet on this media
- ULONG cbFolderThresh; // Thresshold for forcing a new Folder
- // then ints
- UINT cbReserveCFHeader; // Space to reserve in CFHEADER
- UINT cbReserveCFFolder; // Space to reserve in CFFOLDER
- UINT cbReserveCFData; // Space to reserve in CFDATA
- int iCab; // sequential numbers for cabinets
- int iDisk; // Disk number
- #ifndef REMOVE_CHICAGO_M6_HACK
- int fFailOnIncompressible; // TRUE => Fail if a block is incompressible
- #endif
- // then shorts
- USHORT setID; // Cabinet set ID
- // then chars
- char szDisk[CB_MAX_DISK_NAME]; // current disk name
- char szCab[CB_MAX_CABINET_NAME]; // current cabinet name
- char szCabPath[CB_MAX_CAB_PATH]; // path for creating cabinet
- } CCAB; /* ccab */
- typedef CCAB *PCCAB; /* pccab */
- /*** FNALLOC - Memory Allocation
- * FNFREE - Memory Free
- *
- * These are modeled after the C run-time routines malloc() and free()
- * (16-bit clients please note -- the size is a ULONG, so you may need
- * to write a wrapper routine for halloc!). FDI expects error
- * handling to be identical to these C run-time routines.
- *
- * As long as you faithfully copy the semantics of malloc() and free(),
- * you can supply any functions you like!
- *
- * WARNING: You should never assume anything about the sequence of
- * PFNALLOC and PFNFREE calls -- incremental releases of
- * Diamond/FDI may have radically different numbers of
- * PFNALLOC calls and allocation sizes!
- */
- //** Memory functions for FCI
- typedef void HUGE * (FAR DIAMONDAPI *PFNFCIALLOC)(ULONG cb); /* pfna */
- #define FNFCIALLOC(fn) void HUGE * FAR DIAMONDAPI fn(ULONG cb)
- typedef void (FAR DIAMONDAPI *PFNFCIFREE)(void HUGE *memory); /* pfnf */
- #define FNFCIFREE(fn) void FAR DIAMONDAPI fn(void HUGE *memory)
- //** File I/O functions for FCI
- typedef INT_PTR (FAR DIAMONDAPI *PFNFCIOPEN) (char FAR *pszFile, int oflag, int pmode, int FAR *err, void FAR *pv);
- typedef UINT (FAR DIAMONDAPI *PFNFCIREAD) (INT_PTR hf, void FAR *memory, UINT cb, int FAR *err, void FAR *pv);
- typedef UINT (FAR DIAMONDAPI *PFNFCIWRITE)(INT_PTR hf, void FAR *memory, UINT cb, int FAR *err, void FAR *pv);
- typedef int (FAR DIAMONDAPI *PFNFCICLOSE)(INT_PTR hf, int FAR *err, void FAR *pv);
- typedef long (FAR DIAMONDAPI *PFNFCISEEK) (INT_PTR hf, long dist, int seektype, int FAR *err, void FAR *pv);
- typedef int (FAR DIAMONDAPI *PFNFCIDELETE) (char FAR *pszFile, int FAR *err, void FAR *pv);
- #define FNFCIOPEN(fn) INT_PTR FAR DIAMONDAPI fn(char FAR *pszFile, int oflag, int pmode, int FAR *err, void FAR *pv)
- #define FNFCIREAD(fn) UINT FAR DIAMONDAPI fn(INT_PTR hf, void FAR *memory, UINT cb, int FAR *err, void FAR *pv)
- #define FNFCIWRITE(fn) UINT FAR DIAMONDAPI fn(INT_PTR hf, void FAR *memory, UINT cb, int FAR *err, void FAR *pv)
- #define FNFCICLOSE(fn) int FAR DIAMONDAPI fn(INT_PTR hf, int FAR *err, void FAR *pv)
- #define FNFCISEEK(fn) long FAR DIAMONDAPI fn(INT_PTR hf, long dist, int seektype, int FAR *err, void FAR *pv)
- #define FNFCIDELETE(fn) int FAR DIAMONDAPI fn(char FAR *pszFile, int FAR *err, void FAR *pv)
- /*** FNFCIGETNEXTCABINET - Callback used to request new cabinet info
- *
- * Entry:
- * pccab - Points to copy of old ccab structure to modify
- * cbPrevCab - Estimate of size of previous cabinet
- * pv - Has the caller's context pointer
- *
- * Exit-Success:
- * returns TRUE;
- *
- * Exit-Failure:
- * returns FALSE;
- */
- typedef BOOL (DIAMONDAPI *PFNFCIGETNEXTCABINET)(PCCAB pccab,
- ULONG cbPrevCab,
- void FAR *pv); /* pfnfcignc */
- #define FNFCIGETNEXTCABINET(fn) BOOL DIAMONDAPI fn(PCCAB pccab, \
- ULONG cbPrevCab, \
- void FAR *pv)
- /*** FNFCIFILEPLACED - Notify FCI client that file was placed
- *
- * Entry:
- * pccab - cabinet structure to fill in, with copy of previous one
- * pszFile - name of file, from cabinet
- * cbFile - length of file
- * fContinuation - true if this is a later segment of a continued file
- * pv - the context of the client
- *
- * Exit-Success:
- * return value anything but -1
- *
- * Exit-Failure:
- * return value -1 means to abort
- */
- typedef int (DIAMONDAPI *PFNFCIFILEPLACED)(PCCAB pccab,
- char *pszFile,
- long cbFile,
- BOOL fContinuation,
- void FAR *pv); /* pfnfcifp */
- #define FNFCIFILEPLACED(fn) int DIAMONDAPI fn(PCCAB pccab, \
- char *pszFile, \
- long cbFile, \
- BOOL fContinuation, \
- void FAR *pv)
- /*** FNCDIGETOPENINFO - Open source file, get date/time/attribs
- *
- * Entry:
- * pszName -- complete path to filename
- * pdate -- location to return FAT-style date code
- * ptime -- location to return FAT-style time code
- * pattribs -- location to return FAT-style attributes
- * pv -- client's context
- *
- * Exit-Success:
- * Return value is file handle of open file to read
- *
- * Exit-Failure:
- * Return value is -1
- */
- typedef INT_PTR (DIAMONDAPI *PFNFCIGETOPENINFO)(char *pszName,
- USHORT *pdate,
- USHORT *ptime,
- USHORT *pattribs,
- int FAR *err,
- void FAR *pv); /* pfnfcigoi */
- #define FNFCIGETOPENINFO(fn) INT_PTR DIAMONDAPI fn(char *pszName, \
- USHORT *pdate, \
- USHORT *ptime, \
- USHORT *pattribs, \
- int FAR *err, \
- void FAR *pv)
-
- /*** FNFCISTATUS - Status/Cabinet Size callback
- *
- * Entry:
- * typeStatus == statusFile if compressing a block into a folder
- * cb1 = Size of compressed block
- * cb2 = Size of uncompressed block
- *
- * typeStatus == statusFolder if adding a folder to a cabinet
- * cb1 = Amount of folder copied to cabinet so far
- * cb2 = Total size of folder
- *
- * typeStatus == statusCabinet if writing out a complete cabinet
- * cb1 = Estimated cabinet size that was previously
- * passed to fnfciGetNextCabinet().
- * cb2 = Actual cabinet size
- * NOTE: Return value is desired client size for cabinet
- * file. FCI updates the maximum cabinet size
- * remaining using this value. This allows a client
- * to generate multiple cabinets per disk, and have
- * FCI limit the size correctly -- the client can do
- * cluster size rounding on the cabinet size!
- * The client should either return cb2, or round cb2
- * up to some larger value and return that.
- * Exit-Success:
- * Returns anything other than -1;
- * NOTE: See statusCabinet for special return values!
- *
- * Exit-Failure:
- * Returns -1 to signal that FCI should abort;
- */
- #define statusFile 0 // Add File to Folder callback
- #define statusFolder 1 // Add Folder to Cabinet callback
- #define statusCabinet 2 // Write out a completed cabinet callback
- typedef long (DIAMONDAPI *PFNFCISTATUS)(UINT typeStatus,
- ULONG cb1,
- ULONG cb2,
- void FAR *pv); /* pfnfcis */
- #define FNFCISTATUS(fn) long DIAMONDAPI fn(UINT typeStatus, \
- ULONG cb1, \
- ULONG cb2, \
- void FAR *pv)
- /*** FNFCIGETTEMPFILE - Callback, requests temporary file name
- *
- * Entry:
- * pszTempName - Buffer to receive complete tempfile name
- * cbTempName - Size of pszTempName buffer
- *
- * Exit-Success:
- * return TRUE
- *
- * Exit-Failure:
- * return FALSE; could not create tempfile, or buffer too small
- *
- * Note:
- * It is conceivable that this function may return a filename
- * that will already exist by the time it is opened. For this
- * reason, the caller should make several attempts to create
- * temporary files before giving up.
- */
- typedef BOOL (DIAMONDAPI *PFNFCIGETTEMPFILE)(char *pszTempName,
- int cbTempName,
- void FAR *pv); /* pfnfcigtf */
- #define FNFCIGETTEMPFILE(fn) BOOL DIAMONDAPI fn(char *pszTempName, \
- int cbTempName, \
- void FAR *pv)
- /*** FCICreate -- create an FCI context (an open CAB, an open FOL)
- *
- * Entry:
- * perf - structure where we return error codes
- * pfnfcifp - callback to inform caller of eventual dest of files
- * pfna - memory allocation function callback
- * pfnf - memory free function callback
- * pfnfcigtf - temp file name generator callback
- * pccab - pointer to cabinet/disk name & size structure
- *
- * Notes:
- * (1) The alloc/free callbacks must remain valid throughout
- * the life of the context, up to and including the call to
- * FCIDestroy.
- * (2) The perf pointer is stored in the compression context (HCI),
- * and any errors from subsequent FCI calls are stored in the
- * erf that was passed in on *this* call.
- *
- * Exit-Success:
- * Returns non-NULL handle to an FCI context.
- *
- * Exit-Failure:
- * Returns NULL, perf filled in.
- */
- HFCI DIAMONDAPI FCICreate(PERF perf,
- PFNFCIFILEPLACED pfnfcifp,
- PFNFCIALLOC pfna,
- PFNFCIFREE pfnf,
- PFNFCIOPEN pfnopen,
- PFNFCIREAD pfnread,
- PFNFCIWRITE pfnwrite,
- PFNFCICLOSE pfnclose,
- PFNFCISEEK pfnseek,
- PFNFCIDELETE pfndelete,
- PFNFCIGETTEMPFILE pfnfcigtf,
- PCCAB pccab,
- void FAR * pv
- );
- /*** FCIAddFile - Add a disk file to a folder/cabinet
- *
- * Entry:
- * hfci - FCI context handle
- * pszSourceFile - Name of file to add to folder
- * pszFileName - Name to store into folder/cabinet
- * fExecute - Flag indicating execute on extract
- * pfn_progress - Progress callback
- * pfnfcignc - GetNextCabinet callback
- * pfnfcis - Status callback
- * pfnfcigoi - OpenInfo callback
- * typeCompress - Type of compression to use for this file
- * pv - pointer to caller's internal context
- *
- * Exit-Success:
- * returns TRUE
- *
- * Exit-Failure:
- * returns FALSE, error filled in
- *
- * This is the main function used to add file(s) to a cabinet
- * or series of cabinets. If the current file causes the current
- * folder/cabinet to overflow the disk image currently being built,
- * the cabinet will be terminated, and a new cabinet/disk name will
- * be prompted for via a callback. The pending folder will be trimmed
- * of the data which has already been generated in the finished cabinet.
- */
- BOOL DIAMONDAPI FCIAddFile(HFCI hfci,
- char *pszSourceFile,
- char *pszFileName,
- BOOL fExecute,
- PFNFCIGETNEXTCABINET pfnfcignc,
- PFNFCISTATUS pfnfcis,
- PFNFCIGETOPENINFO pfnfcigoi,
- TCOMP typeCompress
- );
-
- /*** FCIFlushCabinet - Complete the current cabinet under construction
- *
- * This will cause the current cabinet (assuming it is not empty) to
- * be gathered together and written to disk.
- *
- * Entry:
- * hfci - FCI context
- * fGetNextCab - TRUE => Call GetNextCab to get continuation info;
- * FALSE => Don't call GetNextCab unless this cabinet
- * overflows.
- * pfnfcignc - callback function to get continuation cabinets
- * pfnfcis - callback function for progress reporting
- * pv - caller's internal context for callbacks
- *
- * Exit-Success:
- * return code TRUE
- *
- * Exit-Failure:
- * return code FALSE, error structure filled in
- */
- BOOL DIAMONDAPI FCIFlushCabinet(HFCI hfci,
- BOOL fGetNextCab,
- PFNFCIGETNEXTCABINET pfnfcignc,
- PFNFCISTATUS pfnfcis
- );
-
- /*** FCIFlushFolder - Complete the current folder under construction
- *
- * This will force the termination of the current folder, which may or
- * may not cause one or more cabinet files to be completed.
- *
- * Entry:
- * hfci - FCI context
- * GetNextCab - callback function to get continuation cabinets
- * pfnProgress - callback function for progress reporting
- * pv - caller's internal context for callbacks
- *
- * Exit-Success:
- * return code TRUE
- *
- * Exit-Failure:
- * return code FALSE, error structure filled in
- */
- BOOL DIAMONDAPI FCIFlushFolder(HFCI hfci,
- PFNFCIGETNEXTCABINET pfnfcignc,
- PFNFCISTATUS pfnfcis
- );
-
- /*** FCIDestroy - Destroy a FCI context and delete temp files
- *
- * Entry:
- * hfci - FCI context
- *
- * Exit-Success:
- * return code TRUE
- *
- * Exit-Failure:
- * return code FALSE, error structure filled in
- */
- BOOL DIAMONDAPI FCIDestroy (HFCI hfci);
-
- //** Revert to default structure packing
- #ifndef _WIN64
- #pragma pack()
- #endif
- #ifdef __cplusplus
- }
- #endif /* __cplusplus */
- #endif // !INCLUDED_FCI
|