Sign in to follow this  
Followers 0
DXRW4E

CabiNet API - _FCIAddFile Error

5 posts in this topic

#1 ·  Posted (edited)

I'm trying to make CabiNet API that supports unicode (for the moment is in ASCII), but I am getting an error that I can not track it, I do not understand what happens and why it happens, can someone help to understand what happens and how to fix it

;#RequireAdmin

#include <array.au3>

Global $hFCI, $itotal_compressed_size, $itotal_uncompressed_size

#Region ;Global Variables and Constants

Global Const $h_Kernel32DLL = DllOpen("Kernel32.dll")
Global Const $h_CabiNetDLL = DllOpen("CabiNet.dll")
Global Const $CB_ERROR_INVALID_HANDLE = 6
Global Const $CB_INVALID_HANDLE_VALUE = Ptr(-1)

Global $hDefaultProcessHeap = DllCall($h_Kernel32DLL, "HANDLE", "GetProcessHeap")
If Not @Error And $hDefaultProcessHeap[0] Then $hDefaultProcessHeap = $hDefaultProcessHeap[0]
Global Const $GMEM_FIXED_ZEROINIT = 0x0040  ;Combines GMEM_FIXED and GMEM_ZEROINIT.
Global Static $arDllCall

Global Const $CP_UTF8                  = 65001
Global Const $WC_ERR_INVALID_CHARS     = 0x00000080  ;; error for invalid chars
Global Const $dwConversionFlags        = StringRegExp(@OSVersion, "WIN_(?>2003|XP|XPe|2000)$") ? 0 : $WC_ERR_INVALID_CHARS

Global Static $FDI_PV = DllStructCreate("int")
Global Static $PFDI_PV = DllStructGetPtr($FDI_PV)
Global Static $FCI_PV = DllStructCreate("int")
Global Static $PFCI_PV = DllStructGetPtr($FCI_PV)
Global Const $PCB_PV = 0    ;or 128 - $_A_NAME_IS_UTF  = 0x80   ;;  /* szName[] contains UTF */

Global $FNFCIALLOC           = DllCallbackRegister("_FNFCIALLOC", "ptr:cdecl", "ULONG")
Global $FNFCICLOSE           = DllCallbackRegister("_FNFCICLOSE", "int:cdecl", "INT_PTR;ptr;ptr")   ;"HANDLE;ptr;ptr"
Global $FNFCIDELETE          = DllCallbackRegister("_FNFCIDELETE", "int:cdecl", "ptr;ptr;ptr")
Global $FNFCIFILEPLACED      = DllCallbackRegister("_FNFCIFILEPLACED", "int:cdecl", "ptr;ptr;long;BOOL;ptr")
Global $FNFCIFREE            = DllCallbackRegister("_FNFCIFREE", "none:cdecl", "HANDLE")
Global $FNFCIGETNEXTCABINET  = DllCallbackRegister("_FNFCIGETNEXTCABINET", "BOOL:cdecl", "ptr;ULONG;ptr")
Global $FNFCIGETOPENINFO     = DllCallbackRegister("_FNFCIGETOPENINFO", "INT_PTR:cdecl", "ptr;ptr;ptr;ptr;ptr;ptr") ;"ptr;USHORT;USHORT;USHORT;ptr;ptr"
Global $FNFCIGETTEMPFILE     = DllCallbackRegister("_FNFCIGETTEMPFILE", "BOOL:cdecl", "ptr;int;ptr")
Global $FNFCIOPEN            = DllCallbackRegister("_FNFCIOPEN", "INT_PTR:cdecl", "ptr;int;int;ptr;ptr")
Global $FNFCIREAD            = DllCallbackRegister("_FNFCIREAD", "UINT:cdecl", "INT_PTR;ptr;UINT;ptr;ptr")
Global $FNFCISEEK            = DllCallbackRegister("_FNFCISEEK", "long:cdecl", "INT_PTR;long;int;ptr;ptr")
Global $FNFCISTATUS          = DllCallbackRegister("_FNFCISTATUS", "long:cdecl", "UINT;ULONG;ULONG;ptr")
Global $FNFCIWRITE           = DllCallbackRegister("_FNFCIWRITE", "UINT:cdecl", "INT_PTR;ptr;UINT;ptr;ptr")
;Global $TCOMPfromLZXWindow   = DllCallbackRegister("_FNFCICLOSE", "USHORT:cdecl", "INT")

Global $PFNFCIALLOC          = DllCallbackGetPtr($FNFCIALLOC)
Global $PFNFCICLOSE          = DllCallbackGetPtr($FNFCICLOSE)
Global $PFNFCIDELETE         = DllCallbackGetPtr($FNFCIDELETE)
Global $PFNFCIFILEPLACED     = DllCallbackGetPtr($FNFCIFILEPLACED)
Global $PFNFCIFREE           = DllCallbackGetPtr($FNFCIFREE)
Global $PFNFCIGETNEXTCABINET = DllCallbackGetPtr($FNFCIGETNEXTCABINET)
Global $PFNFCIGETOPENINFO    = DllCallbackGetPtr($FNFCIGETOPENINFO)
Global $PFNFCIGETTEMPFILE    = DllCallbackGetPtr($FNFCIGETTEMPFILE)
Global $PFNFCIOPEN           = DllCallbackGetPtr($FNFCIOPEN)
Global $PFNFCIREAD           = DllCallbackGetPtr($FNFCIREAD)
Global $PFNFCISEEK           = DllCallbackGetPtr($FNFCISEEK)
Global $PFNFCISTATUS         = DllCallbackGetPtr($FNFCISTATUS)
Global $PFNFCIWRITE          = DllCallbackGetPtr($FNFCIWRITE)
;Global $PTCOMPfromLZXWindow  = DllCallbackGetPtr($FNFCICLOSE)


Global Const $GENERIC_READ                     = 0x80000000 ;; $SDDL_GENERIC_READ = "GR"
Global Const $GENERIC_WRITE                    = 0x40000000 ;; $SDDL_GENERIC_WRITE = "GW"
Global Const $GENERIC_EXECUTE                  = 0x20000000 ;; $SDDL_GENERIC_EXECUTE = "GX"
Global Const $GENERIC_ALL                      = 0x10000000 ;; $SDDL_GENERIC_ALL = "GA"
Global Const $GENERIC_READ_WRITE               = BitOR($GENERIC_READ, $GENERIC_WRITE)
Global Const $CB_dwDesiredAccess[4]            = [$GENERIC_READ, $GENERIC_WRITE, $GENERIC_READ_WRITE, $GENERIC_READ_WRITE]

;;Global Const $CREATE_NEW = 1
Global Const $CREATE_ALWAYS = 2
Global Const $OPEN_EXISTING = 3
;;Global Const $OPEN_ALWAYS = 4
;;Global Const $TRUNCATE_EXISTING = 5

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; Attributes of file; may be used in any combination:
Global Const $_A_RDONLY       = 0x01    ;;  /* file is read-only */
Global Const $_A_HIDDEN       = 0x02    ;;  /* file is hidden */
Global Const $_A_SYSTEM       = 0x04    ;;  /* file is a system file */
Global Const $_A_ARCH         = 0x20    ;;  /* file modified since last backup */
Global Const $_A_RDONLY_HIDDEN_SYSTEM_ARCH = BitOR($_A_RDONLY, $_A_SYSTEM, $_A_HIDDEN + $_A_ARCH)

;;/*
;; * FAT file attribute flag used by FCI/FDI to indicate that
;; * the file should be executed after extraction
;; */
Global Const $_A_EXEC         = 0x40    ;;  /* run after extraction */
;;/*
;; * FAT file attribute flag used by FCI/FDI to indicate that
;; * the filename in the CAB is a UTF string
;; */
Global Const $_A_NAME_IS_UTF  = 0x80    ;;  /* szName[] contains UTF */
;; All other attribute bit values are reserved.
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

;;;; from msvcrt/fcntl.h */
;;/* Specifiy one of these flags to define the access mode. */
Global Const $_O_RDONLY       = 0
Global Const $_O_WRONLY       = 1
Global Const $_O_RDWR         = 2
Global Const $_O_RDONLY_WRONLY_RDWR = 3

;;/* Mask for access mode bits in the _open flags. */
Global Const $_O_ACCMODE      = 0x0003  ;BitOR($_O_RDONLY, $_O_WRONLY, $_O_RDWR)

Global Const $_O_APPEND       = 0x0008  ;;/* Writes will add to the end of the file. */

Global Const $_O_RANDOM       = 0x0010
Global Const $_O_SEQUENTIAL   = 0x0020
Global Const $_O_TEMPORARY    = 0x0040  ;;/* Make the file dissappear after closing.  * WARNING: Even if not created by _open! */
Global Const $_O_NOINHERIT    = 0x0080

Global Const $_O_CREAT        = 0x0100  ;;/* Create the file if it does not exist. */
Global Const $_O_TRUNC        = 0x0200  ;;/* Truncate the file if it does exist. */
Global Const $_O_EXCL         = 0x0400  ;;/* Open only if the file does not exist. */

Global Const $_O_SHORT_LIVED  = 0x1000

;;/* NOTE: Text is the default even if the given _O_TEXT bit is not on. */
Global Const $_O_TEXT         = 0x4000  ;;/* CR-LF in file becomes LF in memory. */
Global Const $_O_BINARY       = 0x8000  ;;/* Input and output is not translated. */
Global Const $_O_RAW          = $_O_BINARY

Global Const $FILE_SHARE_READ   = 0x01
;;Global Const $FILE_SHARE_WRITE  = 0x02
;;Global Const $FILE_SHARE_DELETE = 0x04

Global Const $FILE_FLAG_SEQUENTIAL_SCAN          = 0x08000000
Global Const $FILE_ATTRIBUTE_ARCHIVE             = 0x00000020
Global Const $FILE_ATTRIBUTE_NORMAL              = 0x00000080
Global Const $FILE_ATTRIBUTE_NORMAL_FLAG_SEQUENTIAL_SCAN = BitOR($FILE_FLAG_SEQUENTIAL_SCAN, $FILE_ATTRIBUTE_NORMAL)

Global Const $MAX_CAB_SIZE        = 0x7FFFFFFF  ;; Total-bytes (uncompressed) in a CAB-folder
Global Const $CB_MAX_CHUNK        = 32768
Global Const $CB_MAX_DISK         = 0x7ffffff
Global Const $CB_MAX_FILENAME     = 256
Global Const $CB_MAX_CABINET_NAME = 256
Global Const $CB_MAX_CAB_PATH     = 256
Global Const $CB_MAX_DISK_NAME    = 256
Global Const $CB_MAX_FILE_COUNT   = 0xFFFF
Global Const $CB_FOLDER_THRESHOLD = 0x7FFFFFFF; // maximum compression
Global Const $CB_MAX_SIZE_UNCMPSD = 0x7FFF8000  ;; Total-bytes (uncompressed) in a CAB-folder 0x7FFF0000

Global Const $tcompMASK_TYPE          = 0x000F  ;; Mask for compression type
Global Const $tcompTYPE_NONE          = 0x0000  ;; No compression
Global Const $tcompTYPE_MSZIP         = 0x0001  ;; MSZIP
Global Const $tcompTYPE_QUANTUM       = 0x0002  ;; Quantum
Global Const $tcompTYPE_LZX           = 0x0003  ;; LZX
Global Const $tcompBAD                = 0x000F  ;; Unspecified compression type

Global Const $tcompMASK_LZX_WINDOW    = 0x1F00  ;; Mask for LZX Compression Memory
Global Const $tcompLZX_WINDOW_LO      = 0x0F00  ;; Lowest LZX Memory (15)
Global Const $tcompLZX_WINDOW_HI      = 0x1500  ;; Highest LZX Memory (21)
Global Const $tcompSHIFT_LZX_WINDOW   = 8       ;; Amount to shift over to get int

Global Const $tcompMASK_QUANTUM_LEVEL  = 0x00F0  ;; Mask for Quantum Compression Level
Global Const $tcompQUANTUM_LEVEL_LO    = 0x0010  ;; Lowest Quantum Level (1)
Global Const $tcompQUANTUM_LEVEL_HI    = 0x0070  ;; Highest Quantum Level (7)
Global Const $tcompSHIFT_QUANTUM_LEVEL = 4       ;; Amount to shift over to get int

Global Const $tcompMASK_QUANTUM_MEM   = 0x1F00  ;; Mask for Quantum Compression Memory
Global Const $tcompQUANTUM_MEM_LO     = 0x0A00  ;; Lowest Quantum Memory (10)
Global Const $tcompQUANTUM_MEM_HI     = 0x1500  ;; Highest Quantum Memory (21)
Global Const $tcompSHIFT_QUANTUM_MEM  = 8       ;; Amount to shift over to get int

Global Const $tcompMASK_RESERVED      = 0xE000  ;; Reserved bits (high 3 bits)

Global Const $tcompTYPE_LZX_EX        = BitOR($tcompTYPE_LZX, $tcompLZX_WINDOW_HI)

;;/***    FCIERROR - Error codes returned in erf.erfOper field
;; *
;; */
Const Enum _ ;FCIERROR
    $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
    $FCIERR_CAB_FORMAT_LIMIT      ;; Data-size or file-count exceeded CAB format limits.
                                  ;; i.e. Total-bytes (uncompressed) in a CAB-folder exceeded 0x7FFF8000 (~ 2GB)
                                  ;; or, CAB size (compressed) exceeded 0x7FFFFFFF
                                  ;; or, File-count in CAB exceeded 0xFFFF
;;;; The following values are returned for FCI:
;;Global Const $FCIERR_NONE             = 0x00 ;; No Error.
;;Global Const $FCIERR_OPEN_SRC         = 0x01 ;; Failure opening the file to be stored in the cabinet.
;;Global Const $FCIERR_READ_SRC         = 0x02 ;; Failure reading the file to be stored in the cabinet.
;;Global Const $FCIERR_ALLOC_FAIL       = 0x03 ;; Out of memory in FCI.
;;Global Const $FCIERR_TEMP_FILE        = 0x04 ;; Could not create a temporary file.
;;Global Const $FCIERR_BAD_COMPR_TYPE   = 0x05 ;; Unknown compression type.
;;Global Const $FCIERR_CAB_FILE         = 0x06 ;; Could not create the cabinet file.
;;Global Const $FCIERR_USER_ABORT       = 0x07 ;; FCI aborted.
;;Global Const $FCIERR_MCI_FAIL         = 0x08 ;; Failure compressing data.
;;Global Const $FCIERR_CAB_FORMAT_LIMIT = 0x09 ;; Data-size or file-count exceeded CAB format limits.
                                               ;; i.e. Total-bytes (uncompressed) in a CAB-folder exceeded 0x7FFF8000 (~ 2GB)
                                               ;; or, CAB size (compressed) exceeded 0x7FFFFFFF
                                               ;; or, File-count in CAB exceeded 0xFFFF

Global Const $statusFile      = 0   ;; Add File to Folder callback
Global Const $statusFolder    = 1   ;; Add Folder to Cabinet callback
Global Const $statusCabinet   = 2   ;; Write out a completed cabinet callback

; *******************************************************************************************************************************
; Time Structures
; *******************************************************************************************************************************
; ===============================================================================================================================
; #STRUCTURE# ===================================================================================================================
; Name...........: $tagFILETIME
; Description ...: Contains the number of 100-nanosecond intervals since January 1, 1601
; Fields ........: Lo - The low order part of the file time
;                  Hi - The high order part of the file time
; Author ........: Paul Campbell (PaulIA)
; Remarks .......:
; ===============================================================================================================================
Global Const $CB_tagFILETIME = "struct;dword Lo;dword Hi;endstruct"
;;Global Static $FDI_FileTime = DllStructCreate($CB_tagFILETIME)
;;Global Static $FDI_lpFileTime = DllStructGetPtr($FDI_FileTime)
;;Global Static $FDI_LocalFileTime = DllStructCreate($CB_tagFILETIME)
;;Global Static $FDI_lpLocalFileTime = DllStructGetPtr($FDI_LocalFileTime)
Global Static $FCI_FileTime = DllStructCreate($CB_tagFILETIME)
Global Static $FCI_lpFileTime = DllStructGetPtr($FCI_FileTime)
Global Static $FCI_LocalFileTime = DllStructCreate($CB_tagFILETIME)
Global Static $FCI_lpLocalFileTime = DllStructGetPtr($FCI_LocalFileTime)
Global Static $FCI_BY_HANDLE_FILE_INFORMATION = DllStructCreate("dword;STRUCT;dword Lo;dword Hi;ENDSTRUCT;STRUCT;dword Lo;dword Hi;ENDSTRUCT;STRUCT;dword Lo;dword Hi;ENDSTRUCT;dword;dword;dword;dword;dword;dword")
Global Static $FCI_PBY_HANDLE_FILE_INFORMATION = DllStructGetPtr($FCI_BY_HANDLE_FILE_INFORMATION)
Global Static $FCI_ftLastWriteTime = DllStructGetPtr($FCI_BY_HANDLE_FILE_INFORMATION, 6)

#EndRegion ;Global Variables and Constants


#Region ;Cabinet API Structures
;;  The CCAB structure contains cabinet information.
;;      typedef struct _CCAB {
;;        ULONG  cb;
;;        ULONG  cbFolderThresh;
;;        UINT   cbReserveCFHeader;
;;        UINT   cbReserveCFFolder;
;;        UINT   cbReserveCFData;
;;        int    iCab;
;;        int    iDisk;
;;        USHORT setID;
;;        char   szDisk[CB_MAX_DISK_NAME];
;;        char   szCab[CB_MAX_CABINET_NAME];
;;        char   szCabPath[CB_MAX_CAB_PATH];
;;      } CCAB, *PCCAB;
;;
;;  Members
;;      cb
;;          The maximum size, in bytes, of a cabinet created by FCI.
;;      cbFolderThresh
;;          The maximum size, in bytes, that a folder will contain before a new folder is created.
;;      cbReserveCFHeader
;;          The size, in bytes, of the CFHeader reserve area. Possible value range is 0-60,000.
;;      cbReserveCFFolder
;;          The size, in bytes, of the CFFolder reserve area. Possible value range is 0-255.
;;      cbReserveCFData
;;          The size, in bytes, of the CFData reserve area. Possible value range is 0-255.
;;      iCab
;;          The number of created cabinets.
;;      iDisk
;;          The maximum size, in bytes, of a cabinet created by FCI.
;;      setID
;;          A value that represents the association between a collection of linked cabinet files.
;;      szDisk
;;          The name of the disk on which the cabinet is placed.
;;      szCab
;;          The name of the cabinet.
;;      szCabPath
;;          The full path that indicates where to create the cabinet.
;;
;; /***    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.
;; */
Global Const $tds_CCAB = "" & _      ; The CCAB structure contains cabinet information.
    "ULONG  cb;" & _                 ; size available for cabinet on this media
    "ULONG  cbFolderThresh;" & _     ; Thresshold for forcing a new Folder
    "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
    "USHORT setID;" & _              ; Cabinet set ID
    "char   szDisk[256];" & _        ; current disk name
    "char   szCab[256];" & _         ; current cabinet name
    "char   szCabPath[256]"          ; path for creating cabinet
Global Static $CCAB = DllStructCreate($tds_CCAB)
Global Static $PCCAB = DllStructGetPtr($CCAB)


;;  The ERF structure contains error information from FCI/FDI. The caller should not modify this structure.
;;      typedef struct {
;;        int  erfOper;
;;        int  erfType;
;;        BOOL fError;
;;      } ERF FAR *PERF;
;;
;;  Members
;;      erfOper
;;          An FCI/FDI error code.
;;          The following values are returned for FCI:
;;              Value                        - Meaning
;;              FCIERR_NONE             0x00 - No Error.
;;              FCIERR_OPEN_SRC         0x01 - Failure opening the file to be stored in the cabinet.
;;              FCIERR_READ_SRC         0x02 - Failure reading the file to be stored in the cabinet.
;;              FCIERR_ALLOC_FAIL       0x03 - Out of memory in FCI.
;;              FCIERR_TEMP_FILE        0x04 - Could not create a temporary file.
;;              FCIERR_BAD_COMPR_TYPE   0x05 - Unknown compression type.
;;              FCIERR_CAB_FILE         0x06 - Could not create the cabinet file.
;;              FCIERR_USER_ABORT       0x07 - FCI aborted.
;;              FCIERR_MCI_FAIL         0x08 - Failure compressing data.
;;              FCIERR_CAB_FORMAT_LIMIT 0x09 - Data-size or file-count exceeded CAB format limits.
;;          The following values are returned for FDI:
;;              Value                                 - Meaning
;;              FDIERROR_NONE                    0x00 - No error.
;;              FDIERROR_CABINET_NOT_FOUND       0x01 - The cabinet file was not found.
;;              FDIERROR_NOT_A_CABINET           0x02 - The cabinet file does not have the correct format.
;;              FDIERROR_UNKNOWN_CABINET_VERSION 0x03 - The cabinet file has an unknown version number.
;;              FDIERROR_CORRUPT_CABINET         0x04 - The cabinet file is corrupt.
;;              FDIERROR_ALLOC_FAIL              0x05 - Insufficient memory.
;;              FDIERROR_BAD_COMPR_TYPE          0x06 - Unknown compression type used in the cabinet folder.
;;              FDIERROR_MDI_FAIL                0x07 - Failure decompressing data from the cabinet file.
;;              FDIERROR_TARGET_FILE             0x08 - Failure writing to the target file.
;;              FDIERROR_RESERVE_MISMATCH        0x09 - The cabinets within a set do not have the same RESERVE sizes.
;;              FDIERROR_WRONG_CABINET           0x0A - The cabinet returned by fdintNEXT_CABINET is incorrect.
;;              FDIERROR_USER_ABORT              0x0B - FDI aborted.
;;      erfType
;;          An optional error value filled in by FCI/FDI. For FCI, this is usually the C runtime errno value.
;;      fError
;;          A flag that indicates an error. If TRUE, an error is present.
;;
;; /***    ERF - Error structure
;; *
;; *  This structure returns error information from FCI/FDI.  The caller should
;; *  not modify this structure.
;; */
Global Const $tds_ERF = "" & _ ; The ERF structure contains error information from FCI/FDI. The caller should not modify this structure.
    "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
Global Static $ERF  = DllStructCreate($tds_ERF)
Global Static $PERF = DllStructGetPtr($ERF)

#EndRegion ;Cabinet API Structures


#Region ;FCI Functions
;;  The FCI (File Compression Interface) library provides the ability to create cabinets (also known as "CAB files"). Additionally,
;;    the library provides compression to reduce the size of the file data stored in cabinets.

;; The FCIAddFile adds a file to the cabinet under construction. (Add a disk file to a folder/cabinet)
;;  Parameters
;;      hfci [in]
;;          A valid FCI context handle returned by the FCICreate function.
;;      pszSourceFile [in]
;;          The name of the file to add; this value should include path information. (Name of file to add to folder)
;;      pszFileName [in]
;;          The name under which to store the file in the cabinet. (Name to store into folder/cabinet)
;;      fExecute [in]
;;          If set TRUE, the file will be executed when extracted. (Flag indicating execute on extract)
;;      GetNextCab [in]
;;          Pointer to an application-defined callback function to obtain specifications on the next cabinet to create. The function should be declared using the FNFCIGETNEXTCABINET macro.
;;      pfnProgress [in]
;;          Pointer to an application-defined callback function to update the progress information available to the user. The function should be declared using the FNFCISTATUS macro.
;;      pfnOpenInfo [in]
;;          Pointer to an application-defined callback function to open a file and retrieve the file date, time, and attributes. The function should be declared using the FNFCIGETOPENINFO macro.
;;      typeCompress [in]
;;          The compression type to use.
;;          Note  To indicate LZX compression, use the TCOMPfromLZXWindow macro.
;;          Value                  -  Meaning
;;          tcompTYPE_NONE  0x0000 - No compression.
;;          tcompTYPE_MSZIP 0x0001 - Microsoft ZIP compression.
;;
;;  Return value
;;      If the function succeeds, it returns TRUE; otherwise, FALSE.
;;      Extended error information is provided in the ERF structure used to create the FCI context.
;;
;;  Remarks
;;      When set, the _A_EXEC attribute is added to the file entry in the CAB. This mechanism is used in some Microsoft self-extracting executables,
;;        and could be used for this purpose in any custom extraction application.
;;      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.
;;
;; Syntax
;;    BOOL FCIAddFile(
;;      _In_  HFCI hfci,
;;      _In_  LPSTR pszSourceFile,
;;      _In_  LPSTR pszFileName,
;;      _In_  BOOL fExecute,
;;      _In_  PFNFCIGETNEXTCABINET GetNextCab,
;;      _In_  PFNFCISTATUS pfnProgress,
;;      _In_  PFNFCIGETOPENINFO pfnOpenInfo,
;;      _In_  TCOMP typeCompress
;;    );
Func _FCIAddFile($hFCI, $pszSourceFile, $pszFileName, $pfnProgress, $pfnOpenInfo, $fExecute = False, $typeCompress = $tcompTYPE_LZX_EX)
    ConsoleWrite("- _FCIAddFile - $hFCI - " & $hFCI & @LF)
    ;$arDllCall = DllCall($h_CabiNetDLL, "BOOL:cdecl", "FCIAddFile", "ptr", $HFCI, "struct*", $pszSourceFile, "struct*", $pszFileName, "BOOL", $fExecute, _
    $arDllCall = DllCall($h_CabiNetDLL, "BOOL:cdecl", "FCIAddFile", "Handle", $hFCI, "str", $pszSourceFile, "str", $pszFileName, "BOOL", $fExecute, _
    "ptr", $PFNFCIGETNEXTCABINET, "ptr", $pfnProgress, "ptr", $pfnOpenInfo, "USHORT", $typeCompress)

    If @Error Or Not $arDllCall[0] Then
        ConsoleWrite("! ERROR _FCIAddFile -  $hFCI - " & $hFCI & " - " & $arDllCall[0] & @LF)
        ConsoleWrite("! ERROR1 _FCIAddFile - " & DllStructGetData($ERF, "fError") & " - " &  DllStructGetData($ERF, "erfOper") & @LF)
        Return SetError(-1, 0, False)
    EndIf
    ConsoleWrite("+ _FCIAddFile -  $hFCI - " & $hFCI & " - " & $arDllCall[0] & @LF)
    Return $arDllCall[0]
EndFunc


;; The FCICreate function creates an FCI context.
;;  Parameters
;;      perf [in, out]
;;          Pointer to an ERF structure that receives the error information.
;;      pfnfiledest [in]
;;          Pointer to an application-defined callback function to notify when a file is placed in the cabinet. The function should be declared using the FNFCIFILEPLACED macro.
;;      pfnalloc [in]
;;          Pointer to an application-defined callback function to allocate memory. The function should be declared using the FNFCIALLOC macro.
;;      pfnfree [in]
;;          Pointer to an application-defined callback function to free previously allocated memory. The function should be delcared using the FNFCIFREE macro.
;;      pfnopen [in]
;;          Pointer to an application-defined callback function to open a file. The function should be declared using the FNFCIOPEN macro.
;;      pfnread [in]
;;          Pointer to an application-defined callback function to read data from a file. The function should be declared using the FNFCIREAD macro.
;;      pfnwrite [in]
;;          Pointer to an application-defined callback function to write data to a file. The function should be declared using the FNFCIWRITE macro.
;;      pfnclose [in]
;;          Pointer to an application-defined callback function to close a file. The function should be declared using the FNFCICLOSE macro.
;;      pfnseek [in]
;;          Pointer to an application-defined callback function to move a file pointer to the specific location. The function should be declared using the FNFCISEEK macro.
;;      pfndelete [in]
;;          Pointer to an application-defined callback function to delete a file. The function should be declared using the FNFCIDELETE macro.
;;      pfnfcigtf [in]
;;          Pointer to an application-defined callback function to retrieve a temporary file name. The function should be declared using the FNFCIGETTEMPFILE macro.
;;      pccab [in]
;;          Pointer to a CCAB structure that contains the parameters for creating a cabinet.
;;      pv [in, optional]
;;          Pointer to an application-defined value that is passed to callback functions.
;;
;;  Return value
;;      If the function succeeds, it returns a non-NULL HFCI context pointer; otherwise, NULL.
;;      Extended error information is provided in the ERF structure.
;;
;;  Remarks
;;      FCI supports multiple simultaneous contexts. As a result it is possible to create or extract multiple cabinets at the same time within the same application.
;;        If the application is multithreaded, it is also possible to run a different context in each thread; however, an application cannot use the same context
;;        simultaneously in multiple threads. For example, FCIAddFile cannot be called from two different threads, using the same FCI context.
;;
;; Syntax
;;    HFCI FCICreate(
;;      _Inout_   PERF perf,
;;      _In_      PFNFCIFILEPLACED pfnfiledest,
;;      _In_      PFNFCIALLOC pfnalloc,
;;      _In_      PFNFCIFREE pfnfree,
;;      _In_      PFNFCIOPEN pfnopen,
;;      _In_      PFNFCIREAD pfnread,
;;      _In_      PFNFCIWRITE pfnwrite,
;;      _In_      PFNFCICLOSE pfnclose,
;;      _In_      PFNFCISEEK pfnseek,
;;      _In_      PFNFCIDELETE pfndelete,
;;      _In_      PFNFCIGETTEMPFILE pfnfcigtf,
;;      _In_      PCCAB pccab,
;;      _In_opt_  void FAR *pv
;;    );
Func _FCICreate($perf, $pfnfiledest, $pfnalloc, $pfnfree, $pfnopen, $pfnread, $pfnwrite, $pfnclose, $pfnseek, $pfndelete, $pfnfcigtf, $pccab, $pv = 0)
    ConsoleWrite("- _FCICreate - $pccab - " & $pccab & @LF)
    Local $arDllCall = DllCall($h_CabiNetDLL, "HWND:cdecl", "FCICreate", "ptr", $perf, "ptr", $pfnfiledest, "ptr", $pfnalloc, "ptr", $pfnfree, "ptr", $pfnopen, _
        "ptr", $pfnread, "ptr", $pfnwrite, "ptr", $pfnclose, "ptr", $pfnseek, "ptr", $pfndelete, "ptr", $pfnfcigtf, "ptr", $pccab, "ptr", $pv)
    If @Error Or Not $arDllCall[0] Then
        Return SetError(-1, @Error, Null)
        ConsoleWrite("! ERROR _FCICreate -  $perf - " & $perf & " - " & $arDllCall[0] & @LF)
    EndIf
    ;;_ArrayDisplay($arDllCall, DllStructGetData($ERF, "erfOper"))
    ConsoleWrite("+ _FCICreate -  $perf - " & $perf & " - " & $arDllCall[0] & @LF)
    Return SetError(0, 0, $arDllCall[0])
EndFunc


;; The FCIDestroy function deletes an open FCI context, freeing any memory and temporary files associated with the context.
;;  Parameters
;;      hfci [in]
;;          A valid FCI context handle returned by the FCICreate function.
;;
;;  Return value
;;      If the function succeeds, it returns TRUE; otherwise, FALSE.
;;      Extended error information is provided in the ERF structure used to create the FCI context.
;;
;; Syntax
;;    BOOL FCIDestroy(
;;      _In_  HFCI hfci
;;    );
Func _FCIDestroy($hFCI)
    ConsoleWrite("- _FCIDestroy - $hFCI - " & $hFCI & @LF)
    Local $arDllCall = DllCall($h_CabiNetDLL, "BOOL:cdecl", "FCIDestroy", "handle", $hFCI)
    If @Error Or Not $arDllCall[0] Then
        Return SetError(1, DllStructGetData($ERF, "erfOper"), False)
        ConsoleWrite("! ERROR FCIDestroy -  $hFCI - " & $hFCI & " - " & $arDllCall[0] & @LF)
    EndIf
    ConsoleWrite("+ _FCIDestroy -  $hFCI - " & $hFCI & " - " & $arDllCall[0] & @LF)
    Return $arDllCall[0]
EndFunc


;; The FCIFlushCabinet function completes the current cabinet.
;;  Parameters
;;      hfci [in]
;;          A valid FCI context handle returned by theFCICreate function.
;;      fGetNextCab [in]
;;          Specifies whether the function pointed to by the supplied GetNextCab parameter will be called.
;;            TRUE  => Call GetNextCab to get continuation info
;;            FALSE => Don't call GetNextCab unless this cabinet overflows.
;;      GetNextCab [in]
;;          Pointer to an application-defined callback function to obtain specifications on the next cabinet to create. The function should be declared using the FNFCIGETNEXTCABINET macro.
;;      pfnProgress [in]
;;          Pointer to an application-defined callback function to update the user. The function should be declared using the FNFCISTATUS macro.
;;
;;  Return value
;;      If the function succeeds, it returns TRUE, otherwise FALSE (error structure filled in).
;;      Extended error information is provided in the ERF structure used to create the FCI context.
;;
;;  Remarks
;;      The FCIFlushCabinet API forces the current cabinet under construction to be completed immediately and then written to disk. Further calls to FCIAddFile
;;        will result in files being added to another cabinet.
;;
;;      In the event the current cabinet has reached the application-specified media size limit, the pending data within an FCI's internal buffers will
;;        be placed into another cabinet.
;;
;;      The fGetNextCab flag determines whether the function pointed to by the GetNextCab parameter will be called. If fGetNextCab is set TRUE,
;;        GetNextCab is called to obtain continuation information. If FALSE, then GetNextCab is called only in the event the cabinet overflows.
;;
;;  Syntax
;;    BOOL FCIFlushCabinet(
;;      _In_  HFCI hfci,
;;      _In_  BOOL fGetNextCab,
;;      _In_  PFNFCIGETNEXTCABINET GetNextCab,
;;      _In_  PFNFCISTATUS pfnProgress
;;    );
Func _FCIFlushCabinet($hFCI, $fGetNextCab = False)
    ConsoleWrite("- _FCIFlushCabinet - $hFCI - " & $hFCI & @LF)
    Local $arDllCall = DllCall($h_CabiNetDLL, "BOOL:cdecl", "FCIFlushCabinet", "handle", $hFCI, "BOOL", $fGetNextCab, "ptr", $PFNFCIGETNEXTCABINET, "ptr", $PFNFCISTATUS)
    If @Error Or Not $arDllCall[0] Then
        Return SetError(1, DllStructGetData($ERF, "erfOper"), False)
        ConsoleWrite("! ERROR FCIFlushCabinet -  $hFCI - " & $hFCI & " - " & $arDllCall[0] & @LF)
    EndIf
    ConsoleWrite("+ _FCIFlushCabinet -  $hFCI - " & $hFCI & " - " & $arDllCall[0] & @LF)
    Return $arDllCall[0]
EndFunc


;; The FCIFlushFolder function forces the current folder under construction to be completed immediately.
;;  Parameters
;;      hfci [in]
;;          A valid FCI context handle returned by the FCICreate function.
;;      GetNextCab [in]
;;          Pointer to an application-defined callback function to obtain specifications on the next cabinet to create. The function should be declared using the FNFCIGETNEXTCABINET macro.
;;      pfnProgress [in]
;;          Pointer to an application-defined callback function to update the user. The function should be declared using the FNFCISTATUS macro.
;;
;;  Return value
;;      If the function succeeds, it returns TRUE; otherwise, FASLE.
;;      Extended error information is provided in the ERF structure used to create the FCI context.
;;
;;  Remarks
;;      The FCIFlushFolder API forces the folder currently under construction to be completed immediately; effectively resetting the compression history if a compression method is in use.
;;
;;      The callback function indicated by GetNextCab will be called if the cabinet overflows, which occurs if the pending data buffered inside an FCI causes the application-specified cabinet media size to be exceeded.
;;
;; Syntax
;;    BOOL FCIFlushFolder(
;;      _In_  HFCI hfci,
;;      _In_  PFNFCIGETNEXTCABINET GetNextCab,
;;      _In_  PFNFCISTATUS pfnProgress
;;    );
Func _FCIFlushFolder($hFCI, $fGetNextCab = False)
    ConsoleWrite("- _FCIFlushFolder - $hFCI - " & $hFCI & @LF)
    Local $arDllCall = DllCall($h_CabiNetDLL, "BOOL:cdecl", "FCIFlushFolder", "handle", $hFCI, "BOOL", $fGetNextCab, "ptr", $PFNFCIGETNEXTCABINET, "ptr", $PFNFCISTATUS)
    If @Error Or Not $arDllCall[0] Then
        ConsoleWrite("! ERROR FCIFlushFolder -  $hFCI - " & $hFCI & " - " & $arDllCall[0] & @LF)
        Return SetError(1, DllStructGetData($ERF, "erfOper"), False)
    EndIf
    ConsoleWrite("+ _FCIFlushFolder -  $hFCI - " & $hFCI & " - " & $arDllCall[0] & @LF)
    Return $arDllCall[0]
EndFunc


;; The FCIErrorToString
;;          An FCI error code. Possible values include:
;;          Value                        - Meaning
;;          FCIERR_NONE             0x00 - No Error.
;;          FCIERR_OPEN_SRC         0x01 - Failure opening the file to be stored in the cabinet.
;;          FCIERR_READ_SRC         0x02 - Failure reading the file to be stored in the cabinet.
;;          FCIERR_ALLOC_FAIL       0x03 - Out of memory in FCI.
;;          FCIERR_TEMP_FILE        0x04 - Could not create a temporary file.
;;          FCIERR_BAD_COMPR_TYPE   0x05 - Unknown compression type.
;;          FCIERR_CAB_FILE         0x06 - Could not create the cabinet file.
;;          FCIERR_USER_ABORT       0x07 - FCI aborted.
;;          FCIERR_MCI_FAIL         0x08 - Failure compressing data.
;;          FCIERR_CAB_FORMAT_LIMIT 0x09 - Data-size or file-count exceeded CAB format limits.
Func _FCIErrorToString($FCIERROR)
    Switch $FCIERROR
        Case $FCIERR_NONE
            Return "No error";
        Case $FCIERR_OPEN_SRC
            Return "Failure opening file to be stored in cabinet";
        Case $FCIERR_READ_SRC
            Return "Failure reading file to be stored in cabinet";
        Case $FCIERR_ALLOC_FAIL
            Return "Insufficient memory in FCI";
        Case $FCIERR_TEMP_FILE
            Return "Could not create a temporary file";
        Case $FCIERR_BAD_COMPR_TYPE
            Return "Unknown compression type";
        Case $FCIERR_CAB_FILE
            Return "Could not create cabinet file";
        Case $FCIERR_USER_ABORT
            Return "Client requested abort";
        Case $FCIERR_MCI_FAIL
            Return "Failure compressing data";
        Case $FCIERR_CAB_FORMAT_LIMIT
            Return "Data-size or file-count exceeded CAB format limits";
        Case Else
            Return "Unknown error";
    EndSwitch
EndFunc


#EndRegion ;FCI Functions


#Region ;FCI Macros - used by FCI
;;  The following macros are used by FCI:
;;      Macro               - Description
;;      FNFCIALLOC          - Used to allocate memory in an FCI context.
;;      FNFCICLOSE          - Used to close a file.
;;      FNFCIDELETE         - Used to delete a file.
;;      FNFCIFILEPLACED     - Used to notify when a file is placed in the cabinet.
;;      FNFCIFREE           - Used to free previously allocated memory in an FCI context.
;;      FNFCIGETNEXTCABINET - Used to request information for the next cabinet.
;;      FNFCIGETOPENINFO    - Used to open a file and retrieve file date, time, and attributes.
;;      FNFCIGETTEMPFILE    - Used to obtain a temporary file name.
;;      FNFCIOPEN           - Used to open a file in an FCI context.
;;      FNFCIREAD           - Used to read data from a file.
;;      FNFCISEEK           - Used to move a file pointer to a specified location.
;;      FNFCISTATUS         - Used to update the user.
;;      FNFCIWRITE          - Used to write data to a file.
;;      TCOMPfromLZXWindow  - Converts windows size into an LXZ TCOMP value for FCIAddFile.



;;  The FNFCIALLOC provides the declaration for the application-defined callback function to allocate memory within an FCI context.
;;  Parameters
;;      cb
;;          The number of bytes to allocate.
;;
;;  Return value
;;      The indicated callback function returns a void pointer to the allocated space, or NULL, if there is insufficient memory available.
;;
;;  Remarks
;;      The function accepts parameters similar to malloc.
;;
;; Syntax
;;    VOID HUGE * FAR FNFCIALLOC(
;;      ULONG cb
;;    );
Volatile Func _FNFCIALLOC($cb)
    #ForceRef $cb
    ConsoleWrite("- _FNFCIALLOC - $cb - " & $cb & @LF)

    ;;$arDllCall = DllCall($h_Kernel32DLL, "HANDLE", "GlobalAlloc", "UINT", $GMEM_FIXED_ZEROINIT, "ULONG_PTR", $cb)
    ;;If @Error Or Not $arDllCall[0] Then Return SetError(1, 0, 0)
    ;;ConsoleWrite("+> _FNFCIALLOC - $cb - " & $cb & @LF)
    $arDllCall = DllCall($h_Kernel32DLL, "ptr", "HeapAlloc", "HANDLE", $hDefaultProcessHeap, "dword", 8, "ULONG_PTR", $cb)
    If @Error Or Not $arDllCall[0] Then
        ConsoleWrite("! ERROR _FNFCIALLOC - $cb - " & $cb & " - " & $arDllCall[0] & @LF)
        Return SetError(1, 0, Null)
    EndIf
    ConsoleWrite("+ _FNFCIALLOC - $cb - " & $cb & " - " & $arDllCall[0] & @LF)
    Return $arDllCall[0]
EndFunc


;;  The FNFCICLOSE macro provides the declaration for the application-defined callback function to close a file in an FCI context.
;;  Parameters
;;      hf
;;          Specifies an application-defined value that identifies an open file.
;;      err
;;          Pointer to the error code value. This value is used to provide extended error information in the ERF structure used to create the FCI context.
;;      pv
;;          Pointer to an application-defined value.
;;
;;  Return value
;;      The indicated callback function returns 0 if successful; otherwise -1.
;;
;;  Remarks
;;      The function accepts parameters similar to _close, with the addition of err and pv.
;;
;; Syntax
;;    void FNFCICLOSE(
;;      INT_PTR hf,
;;      int FAR *err,
;;      void FAR *pv
;;    );
Volatile Func _FNFCICLOSE($hf, $err, $pv)
    #ForceRef $hf, $err, $pv
    ConsoleWrite("- _FNFCICLOSE - $hf - " & $hf & @LF)

    $arDllCall = DllCall($h_Kernel32DLL, "BOOL", "CloseHandle", "HANDLE", $hf)
    If @Error Or (Not $arDllCall[0] And _WinAPI_GetLastErrorEx() <> $CB_ERROR_INVALID_HANDLE) Then
        ConsoleWrite("! ERROR _FNFCICLOSE - $hf - " & $hf & @LF)
        Return SetError(1, DllStructSetData(DllStructCreate("int", $err), 1, 10), -1)
    EndIf
    ConsoleWrite("+ _FNFCICLOSE - $hf - " & $hf & @LF)
    Return 0
EndFunc


;;  The FNFCIDELETE macro provides the declaration for the application-defined callback function to delete a file in the FCI context.
;;  Parameters
;;      pszFile [in]
;;          The name of the file to be deleted.
;;      err
;;          Pointer to the error code value. This value will be used to provide extended error information in the ERF structure used to create the FCI context.
;;      pv
;;          Pointer to an application-defined value.
;;
;;  Return value
;;      The indicated callback function returns 0 if successful; otherwise -1.
;;
;;  Remarks
;;      The function accepts parameters similar to remove, with the addition of err and pv.
;;
;; Syntax
;;    void FNFCIDELETE(
;;      [in]  LPSTR pszFile,
;;      int FAR *err,
;;      void FAR *pv
;;    );
Volatile Func _FNFCIDELETE($pszFile, $err, $pv)
    #ForceRef $pszFile, $err, $pv
    ConsoleWrite("- _FNFCIDELETE - $pszFile - " & DllStructGetData(DllStructCreate("CHAR [256]", $pszFile), 1) & @LF)

    $arDllCall = DllCall($h_Kernel32DLL, "int", "DeleteFile", "ptr", $pszFile)
    If @Error Or (Not $arDllCall[0] And FileExists(DllStructGetData(DllStructCreate("CHAR [256]", $pszFile), 1))) Then
        ConsoleWrite("! ERROR _FNFCIDELETE - $pszFile - " & DllStructGetData(DllStructCreate("CHAR [256]", $pszFile), 1) & @LF)
        Return SetError(1, DllStructSetData(DllStructCreate("int", $err), 1, 11), -1)
    EndIf
    ConsoleWrite("+ _FNFCIDELETE - $pszFile - " & DllStructGetData(DllStructCreate("CHAR [256]", $pszFile), 1) & @LF)
    Return 0
EndFunc


;;  The FNFCIFILEPLACED macro provides the declaration for the application-defined callback function to notify when a file is placed in the cabinet.
;;  Parameters
;;      pccab
;;          Pointer to the CCAB structure containing the parameters of the cabinet on which the file has been stored. (cabinet structure to fill in, with copy of previous one)
;;      pszFile [in]
;;          The name of the file in the cabinet. (name of file, from cabinet)
;;      cbFile
;;          The length of the file in bytes.
;;      fContinuation
;;          A boolean value that is TRUE if the data added is a segment of a continued file. (true if this is a later segment of a continued file)
;;      pv
;;          Pointer to an application-defined value. (the context of the client)
;;
;;  Return value
;;      The indicated callback function returns an application-defined value. However, a value of -1 indicates an error.
;;
;; Syntax
;;    void FNFCIFILEPLACED(
;;      PCCAB *pccab,
;;      [in]  LPSTR pszFile,
;;      long cbFile,
;;      BOOL fContinuation,
;;      void FAR *pv
;;    );
Volatile Func _FNFCIFILEPLACED($pccab, $pszFile, $cbFile, $fContinuation, $pv)
    #ForceRef $pccab, $pszFile, $cbFile, $fContinuation, $pv
    ConsoleWrite("- _FNFCIFILEPLACED - $pszFile - " & DllStructGetData(DllStructCreate("CHAR [256]", $pszFile), 1) & @LF)
    Return 0
EndFunc


;;  The FNFCIFREE macro provides the declaration for the application-defined callback function to free previously allocated memory in an FCI context.
;;  Parameters
;;      memory
;;          Pointer to the allocated memory block to free.
;;
;;  Return value
;;      This macro does not return a value.
;;
;;  Remarks
;;      The function accepts parameters similar to free.
;;
;; Syntax
;;    void FNFCIFREE(
;;      void HUGE *memory
;;    );
Volatile Func _FNFCIFREE($memory)
    #ForceRef $memory
    ConsoleWrite("- _FNFCIFREE - $memory - " & $memory & @LF)

    ;;$arDllCall = DllCall($h_Kernel32DLL, "ptr", "GlobalFree", "HANDLE", $memory)
    ;;If @Error Or $arDllCall[0] Then SetError(1)
    $arDllCall = DllCall($h_Kernel32DLL, "BOOL", "HeapFree", "HANDLE", $hDefaultProcessHeap, "dword", 0, "ptr", $memory)
    If @Error Or Not $arDllCall[0] Then
        ConsoleWrite("! ERROR _FNFCIFREE - $memory - " & $memory & @LF)
        SetError(1)
    EndIf
    ConsoleWrite("+ _FNFCIFREE - $memory - " & $memory & @LF)
    Return 0
EndFunc


;;  The FNFCIGETNEXTCABINET macro provides the declaration for the application-defined callback function to request information for the next cabinet.
;;  Parameters
;;      pccab
;;          Pointer to a CCAB structure to provide the parameters for the creation of a new cabinet. (Points to copy of old ccab structure to modify)
;;      cbPrevCab
;;          Size, in bytes, of the previous cabinet. (Estimate of size of previous cabinet)
;;      pv
;;          Pointer to an application-defined value. (Has the caller's context pointer)
;;
;;  Return value
;;      The indicated callback function returns TRUE if successful; otherwise FALSE.
;;
;;  Remarks
;;      The CCAB structure referenced by this function is relevant to the most recently completed cabinet. However, with each successful operation
;;        the iCab field contained within this structure will have incremented by 1. Additionally, the next cabinet will be created using the
;;        fields in this structure. The szCab, in particular, should be modified as necessary. In particular, the szCab field, which specifies
;;        the cabinet name, should be changed for each cabinet.
;;
;;      When creating multiple cabinets, typically the iCab field is used to create the name.
;;
;; Syntax
;;    BOOL FNFCIGETNEXTCABINET(
;;      PCCAB pccab,
;;      ULONG cbPrevCab,
;;      void FAR *pv
;;    );
Volatile Func _FNFCIGETNEXTCABINET($pccab, $cbPrevCab, $pv)
    #ForceRef $pccab, $cbPrevCab, $pv
    ConsoleWrite("+ _FNFCIGETNEXTCABINET - $cbPrevCab - " & $cbPrevCab & @LF)
    ;; force the use of a single cabinet, ignore splitting cabinets
    Return False
EndFunc


;;  The FNFCIGETOPENINFO macro provides the declaration for the application-defined callback function to open a file and retrieve file date, time, and attribute.
;;  Parameters
;;      pszName [in]
;;          The complete filename. (complete path to filename)
;;      pdate
;;          The MS-DOS date (location to return FAT-style date code). The date is a packed value with the following format:
;;          Bits    - Description
;;          0-4     - Day of the Month (1-31)
;;          5-8     - Month (1 = January, 2 = Feburary, etc.)
;;          9-15    - Year Offset from 1980 (add 1980 to value to get current date)
;;      ptime
;;          The MS-DOS time (location to return FAT-style time code). The time is a packed value with the following format:
;;          Bits    - Description
;;          0-4     - Second divided by 2
;;          5-8     - Minute (0-59)
;;          9-15    - Hour (0-23 on a 24-hour clock)
;;      pattribs
;;          The file attributes (location to return FAT-style attributes). For possible values and their descriptions, see File Attributes.
;;      err
;;          Pointer to the error code value. This value will be used to provide extended error information in the ERF structure used to create the FCI context.
;;      pv
;;          Pointer to an application-defined value. (client's context)
;;
;;  Return value
;;      The return value is  (file handle of open file to read) application-defined and used to keep track of the opened file. However, a value of -1 indicates an error.
;;
;;  Remarks
;;      The function should open the file using the file open function compatible with those passed into FCICreate.
;;
;; Syntax
;;    void FNFCIGETOPENINFO(
;;      [in]  LPSTR pszName,
;;      USHORT *pdate,
;;      USHORT *ptime,
;;      USHORT *pattribs,
;;      int FAR *err,
;;      void FAR *pv
;;    );
Volatile Func _FNFCIGETOPENINFO($pszName, $pdate, $ptime, $pattribs, $err, $pv)
    #ForceRef $pszName, $pdate, $ptime, $pattribs, $err, $pv
    ConsoleWrite("- _FNFCIGETOPENINFO - $pszName - " & DllStructGetData(DllStructCreate("CHAR [256]", $pszName), 1) & @LF)

    $arDllCall = DllCall($h_Kernel32DLL, "HANDLE", "CreateFile", "ptr", $pszName, "dword", $GENERIC_READ, "dword", $FILE_SHARE_READ, "ptr", 0, "dword", $OPEN_EXISTING, "dword", $FILE_ATTRIBUTE_NORMAL, "ptr", 0)  ;;$FILE_ATTRIBUTE_NORMAL_FLAG_SEQUENTIAL_SCAN
    If @Error Or Not $arDllCall[0]Or $arDllCall[0] = $CB_INVALID_HANDLE_VALUE Then
        ConsoleWrite("! ERROR1 _FNFCIGETOPENINFO - $pszName - " & $pszName & @LF)
        Return SetError(1, DllStructSetData(DllStructCreate("int", $err), 1, 15), -1)
    EndIf
    Local $hFile = $arDllCall[0]
    $arDllCall = DllCall($h_Kernel32DLL, "BOOL", "GetFileInformationByHandle", "ptr", $hFile, "ptr", $FCI_PBY_HANDLE_FILE_INFORMATION)
    If @Error Or Not $arDllCall[0] Then
        ConsoleWrite("! ERROR2 _FNFCIGETOPENINFO - $pszName - " & $pszName & @LF)
        Return SetError(1, DllStructSetData(DllStructCreate("int", $err), 1, 15), -1)
    EndIf
    $arDllCall = DllCall($h_Kernel32DLL, "BOOL", "FileTimeToLocalFileTime", "ptr", $FCI_ftLastWriteTime, "ptr", $FCI_lpLocalFileTime)
    DllCall($h_Kernel32DLL, "BOOL", "FileTimeToDosDateTime", "ptr", $FCI_lpLocalFileTime, "word*", $pdate, "word*", $ptime)
    DllStructSetData(DllStructCreate("dword", $pattribs), 1, BitAND(DllStructGetData($FCI_PBY_HANDLE_FILE_INFORMATION, 1), $_A_RDONLY_HIDDEN_SYSTEM_ARCH))

    ;;DllCall("Kernel32.dll", "BOOL", "GetFileTime", "HANDLE", $hFile, "ptr", Null, "ptr", Null, "ptr", $FCI_lpFileTime)
    ;;If @Error Then Return SetError(1, DllStructSetData(DllStructCreate("int", $err), 1, 14), -1)
    ;;DllCall($h_Kernel32DLL, "BOOL", "FileTimeToLocalFileTime", "ptr", $FCI_lpFileTime, "ptr", $FCI_lpLocalFileTime)
    ;;DllCall($h_Kernel32DLL, "BOOL", "FileTimeToDosDateTime", "ptr", $FCI_lpLocalFileTime, "ptr", $pdate, "ptr", $ptime)
    ;;$arDllCall = DllCall($h_Kernel32DLL, "dword", "GetFileAttributesW", "wstr", $pszName)
    ;;If @Error Then
    ;;  DllStructSetData(DllStructCreate("dword", $pattribs), 1, 0)
    ;;Else
    ;;  If $arDllCall[0] = $CB_INVALID_HANDLE_VALUE Then $arDllCall[0] = 0
    ;;  DllStructSetData(DllStructCreate("dword", $pattribs), 1, BitAND($arDllCall[0], $_A_RDONLY_HIDDEN_SYSTEM_ARCH))
    ;;EndIf

    ConsoleWrite("+ _FNFCIGETOPENINFO - $hFile - " & Int($hFile) &  " $pattribs - " & DllStructGetData(DllStructCreate("dword", $pattribs), 1) & @LF)
    Return $hFile
EndFunc


;;  The FNFCIGETTEMPFILE macro provides the declaration for the application-defined callback function to obtain a temporary file name.
;;  Parameters
;;      pszTempName [out]
;;          Pointer to a buffer to receive the complete temporary file name.
;;      cbTempName [in]
;;          Size, in bytes, of the pszTempName buffer.
;;      pv
;;          Pointer to an application-defined value.
;;
;;  Return value
;;      The indicated callback function returns TRUE if successful; otherwise FALSE.
;;
;;  Remarks
;;      The function can return a filename that already exists by the time it is opened. For this reason, the caller should be prepared to make several
;;        attempts to create temporary files.
;;
;; Syntax
;;    void FNFCIGETTEMPFILE(
;;      [out]  char *pszTempName[bcount(cbTempName)],
;;      [in]   int cbTempName[range(>=, MAX_PATH)],
;;      void FAR *pv
;;    );
Volatile Func _FNFCIGETTEMPFILE($pszTempName, $cbTempName, $pv)
    #ForceRef $pszTempName, $cbTempName, $pv
    ConsoleWrite("- _FNFCIGETTEMPFILE - $pszTempName - " & $pszTempName & @LF)

    $arDllCall = DllCall($h_Kernel32DLL, "UINT", "GetTempFileName", "str", @TempDir, "str", "cab", "UINT", 0, "ptr", $pszTempName)
    If @Error Or Not $arDllCall[0] Then
        ConsoleWrite("! ERROR2 _FNFCIGETTEMPFILE - $pszTempName - " & $pszTempName & @LF)
        Return SetError(1, 0, False)
    EndIf
    ;;FileDelete(DllStructGetData(DllStructCreate("CHAR [256]", $pszTempName), 1))
    ConsoleWrite("+ _FNFCIGETTEMPFILE - $pszTempName - " & DllStructGetData(DllStructCreate("CHAR [256]", $pszTempName), 1) & @LF)
    Return True
EndFunc


;;  The FNFCIOPEN macro provides the declaration for the application-defined callback function to open a file in an FCI context.
;;  Parameters
;;      pszFile [in]
;;          The name of the file.
;;      oflag
;;          Specifies the type of operations allowed.
;;      pmode
;;          Specifies the permission mode.
;;      err
;;          Pointer to the error code value.
;;          This value will be used to provide extended error information in the ERF structure used to create the FCI context.
;;      pv
;;          Pointer to an application-defined value.
;;
;;  Return value
;;      The return value is application-defined and used to keep track of the opened file. However, a value of -1 indicates an error.
;;
;;  Remarks
;;      The function accepts parameters similar to _open.
;;
;; Syntax
;;    void FNFCIOPEN(
;;      [in]  LPSTR pszFile,
;;      int oflag,
;;      int pmode,
;;      int FAR *err,
;;      void FAR *pv
;;    );
Volatile Func _FNFCIOPEN($pszFile, $oflag, $pmode, $err, $pv)
    #ForceRef $pszFile, $oflag, $pmode, $err, $pv
    ConsoleWrite("- _FNFCIOPEN - $pszFile - " & DllStructGetData(DllStructCreate("CHAR [256]", $pszFile), 1) & @LF)

;~  $arDllCall = DllCall($h_Kernel32DLL, "int", "lstrlen", "ptr", $pszFile)
;~  If @Error Then Return SetError(1, 0, -1)
;~  $pszFile = BinaryToString(DllStructGetData(DllStructCreate("byte["& $arDllCall[0] & "]", $arDllCall[1]), 1), 4)

    $arDllCall = DllCall($h_Kernel32DLL, "HANDLE", "CreateFile", "ptr", $pszFile, "dword", $CB_dwDesiredAccess[BitAND($oflag, $_O_RDONLY_WRONLY_RDWR)], "dword", $FILE_SHARE_READ, "ptr", 0, "dword", (BitAND($oflag, $_O_CREAT) ? $CREATE_ALWAYS : $OPEN_EXISTING), "dword", $FILE_ATTRIBUTE_NORMAL, "ptr", 0)
    If @Error Then
        ConsoleWrite("! ERROR1 _FNFCIOPEN - $pszFile - " & $pszFile & @LF)
        Return SetError(1, 0, -1) ; INVALID_HANDLE_VALUE
    EndIf
    If $arDllCall[0] And $arDllCall[0] <> $CB_INVALID_HANDLE_VALUE Then
        ConsoleWrite("+ _FNFCIOPEN - $handle - " & Int($arDllCall[0]) & @LF)
        Return $arDllCall[0]
    EndIf
    If Not DirCreate(StringLeft($arDllCall[1], StringInStr($arDllCall[1], "\", 1, -1))) Then
        ConsoleWrite("! ERROR2 _FNFCIOPEN - $pszFile - " & $pszFile & @LF)
        Return SetError(1, 0, -1) ; INVALID_HANDLE_VALUE
    EndIf
    $arDllCall = DllCall($h_Kernel32DLL, "HANDLE", "CreateFile", "ptr", $arDllCall[1], "dword", $arDllCall[2], "dword", $arDllCall[3], "ptr", 0, "dword", $arDllCall[5], "dword", $arDllCall[6], "ptr", 0)
    If @Error Or $arDllCall[0] = $CB_INVALID_HANDLE_VALUE Then
        ConsoleWrite("! ERROR3 _FNFCIOPEN - $pszFile - " & $pszFile & @LF)
        Return SetError(1, 0, -1) ; INVALID_HANDLE_VALUE
    EndIf
    ConsoleWrite("+ _FNFCIOPEN - $handle - " & Int($arDllCall[0]) & @LF)
    Return $arDllCall[0]
EndFunc


;;  The FNFCIREAD macro provides the declaration for the application-defined callback function to read data from a file in an FCI context.
;;  Parameters
;;      hf
;;          An application-defined value used to identify the open file.
;;      memory
;;          Pointer to the buffer that receives the data read from a file.
;;      cb
;;          The maximum number of bytes to read.
;;      err
;;          Pointer to the error code value. This value will be used to provide extended error information in the ERF structure used to create the FCI context.
;;      pv
;;          Pointer to an application-defined value
;;
;;  Return value
;;      The return value is application-defined and used to keep track of the opened file. However, a value of -1 indicates an error.
;;
;;  Remarks
;;      The function accepts parameters similar to _read with the addition to err and pv.
;;
;; Syntax
;;    void FNFCIREAD(
;;      INT_PTR hf,
;;      void FAR *memory,
;;      UINT cb,
;;      int FAR *err,
;;      void FAR *pv
;;    );
Volatile Func _FNFCIREAD($hf, $memory, $cb, $err, $pv)
    #ForceRef $hf, $memory, $cb, $err, $pv
    ConsoleWrite("- _FNFCIREAD - $hf - " & $hf & " - $memory - " & $memory & " - $cb - " & $cb & @LF)

    ;;;;$arDllCall = DllCall($h_Kernel32DLL, "BOOL", "ReadFile", "HANDLE", $hFile, "ptr", $lpBuffer, "dword", $nNumberOfBytesToRead, "dword*", 0, "ptr", $lpOverlapped)
    $arDllCall = DllCall($h_Kernel32DLL, "BOOL", "ReadFile", "HANDLE", $hf, "ptr", $memory, "dword", $cb, "dword*", Null, "ptr", Null)
    If @Error Then
        ConsoleWrite("! ERROR _FNFCIREAD - $hf - " & $hf & " - $memory - " & $memory & " - $cb - " & $cb & " - " & $arDllCall[4] & @LF)
        Return SetError(1, DllStructSetData(DllStructCreate("int", $err), 1, 16), -1)
        ;Return SetError(1, 0, $arDllCall[4])
    EndIf
    ConsoleWrite("+ _FNFCIREAD - $hf - " & $hf & " - $memory - " & $memory & " - $cb - " & $cb & " - " & $arDllCall[4] & @LF)
    Return $arDllCall[4]    ;$lpNumberOfBytesRead
EndFunc


;;  The FNFCISEEK macro provides the declaration for the application-defined callback function to move a file pointer to the specified location in an FCI context.
;;  Parameters
;;      hf
;;          An application-defined value used to identify the open file.
;;      dist
;;          The number of bytes to move the file pointer.
;;      seektype
;;          The starting point for the file pointer to move.
;;      err
;;          Pointer to the error code value. This value will be used to provide extended error information in the ERF structure used to create the FCI context.
;;      pv
;;          Pointer to an application-defined value.
;;
;;  Return value
;;      The return value is application-defined and used to keep track of the opened file. However, a value of -1 indicates an error.
;;
;;  Remarks
;;      The function accepts parameters similar to _lseek with the addition to err and pv.
;;
;; Syntax
;;    void FNFCISEEK(
;;      INT_PTR hf,
;;      long dist,
;;      int seektype,
;;      int FAR *err,
;;      void FAR *pv
;;    );
Volatile Func _FNFCISEEK($hf, $dist, $seektype, $err, $pv)
    #ForceRef $hf, $dist, $seektype, $err, $pv
    ConsoleWrite("- _FNFCISEEK - $hf - " & $hf & " - $dist - " & $dist & " - $seektype - " & $seektype & @LF)

    ;;;;$arDllCall = DllCall($h_Kernel32DLL, "DWORD", "SetFilePointer", "HANDLE", $hFile, "LONG", $lDistanceToMove, "LONG*", $lpDistanceToMoveHigh, "LONG", $dwMoveMethod)
    $arDllCall = DllCall($h_Kernel32DLL, "INT", "SetFilePointer", "HANDLE", $hf, "long", $dist, "ptr", 0, "int", $seektype)
    If @Error Then
        ConsoleWrite("! ERROR _FNFCISEEK - $hf - " & $hf & " - $dist - " & $dist & " - $seektype - " & $seektype & @LF)
        Return SetError(1, DllStructSetData(DllStructCreate("int", $err), 1, 17), -1)   ;INVALID_SET_FILE_POINTER (-1)
    EndIf
    ConsoleWrite("+ _FNFCISEEK - $hf - " & $hf & " - $dist - " & $dist & " - $seektype - " & $seektype & @LF)
    Return $arDllCall[0]
EndFunc


;;  The FNFCISTATUS macro provides the declaration for the application-defined callback function to update the user.
;;  Parameters
;;      typeStatus
;;          Indicates the type of status update. Possible values include:
;;          Value              - Meaning
;;          statusFile    0x00 - Compressing a block into a folder.
;;          statusFolder  0x01 - Adding a folder to a cabinet.
;;          statusCabinet 0x02 - Writing out a complete cabinet.
;;      cb1
;;          Indicates a status specific value. Possible values include:
;;          Value              - Meaning
;;          statusFile    0x00 - Size of the compressed block.
;;          statusFolder  0x01 - Amount of a folder copied to a cabinet thus far.
;;          statusCabinet 0x02 - Estimated cabinet size.
;;      cb2
;;          Specifies a status specific value. Possible values include:
;;          Value              - Meaning
;;          statusFile    0x00 - Size of the uncompressed block.
;;          statusFolder  0x01 - Total size of the folder.
;;          statusCabinet 0x02 - Actual cabinet size.
;;      pv
;;          Pointer to an application-defined value.
;;
;;  Return value
;;      The function returns an application-defined value. However, a value of -1 indicates an error.
;;
;;  Remarks
;;      If typeStatus equals statusCabinet the returned value indicates the desired size for the cabinet file. FCI updates the maximum cabinet size remaining
;;        using this returned value. This allows a client to generate multiple cabinets per disk, and have FCI limit the size accordingly.
;;
;;      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;
;;
;; Syntax
;;    void FNFCISTATUS(
;;      UINT typeStatus,
;;      ULONG cb1,
;;      ULONG cb2,
;;      void FAR *pv
;;    );
Volatile Func _FNFCISTATUS($typeStatus, $cb1, $cb2, $pv)
    #ForceRef $typeStatus, $cb1, $cb2, $pv
    ConsoleWrite("+ _FNFCISTATUS - $cb1 - " & $cb1 & " - $cb2 - " & $cb2 & " - $pv - " & $pv & @LF)
    If $typeStatus = $statusFile Then
        $itotal_compressed_size += $cb1
        $itotal_uncompressed_size += $cb2
        ConsoleWrite("> _FNFCISTATUS - $statusFile - $itotal_compressed_size - " & $itotal_compressed_size & " - $itotal_uncompressed_size - " & $itotal_uncompressed_size & " - $pv - " & $pv & @LF)
        ;;pv->total_compressed_size += cb1;
        ;;pv->total_uncompressed_size += cb2;
    ElseIf $typeStatus = $statusFolder Then
        ConsoleWrite("> _FNFCISTATUS - $statusFolder - $itotal_compressed_size - " & $itotal_compressed_size & " - $itotal_uncompressed_size - " & $itotal_uncompressed_size & " - $pv - " & $pv & @LF)
        ;$percentage - cb1 / (cb2 / 100)
    EndIf
    Return 0
EndFunc


;;  The FNFCIWRITE macro provides the declaration for the application-defined callback function to write data to a file in an FCI context.
;;  Parameters
;;      hf
;;          An application-defined value used to identify the open file.
;;      memory
;;          Pointer to the buffer containing the data to be written.
;;      cb
;;          The maximum number of bytes to be written.
;;      err
;;          Pointer to the error code value. This value is used when providing extended error information in the ERF structure used to create the FCI context.
;;      pv
;;          Pointer to an application-defined value.
;;
;;  Return value
;;      The indicated callback function returns the number of bytes written. However, a value of -1 indicates an error.
;;
;;  Remarks
;;      The function accepts parameters similar to _write.
;;
;; Syntax
;;    void FNFCIWRITE(
;;      INT_PTR hf,
;;      void FAR *memory,
;;      UINT cb,
;;      int FAR *err,
;;      void FAR *pv
;;    );
Volatile Func _FNFCIWRITE($hf, $memory, $cb, $err, $pv)
    #ForceRef $hf, $memory, $cb, $err, $pv
    ConsoleWrite("- _FNFCIWRITE - $hf - " & $hf & " - $memory - " & $memory & " - $cb - " & $cb & @LF)
    $arDllCall = DllCall($h_Kernel32DLL, "BOOL", "WriteFile", "HANDLE", $hf, "ptr", $memory, "dword", $cb, "dword*", 0, "ptr", 0)
    If @Error Or Not $arDllCall[4] Then
        ConsoleWrite("! ERROR _FNFCIWRITE - $hf - " & $hf & " - $memory - " & $memory & " - $cb - " & $cb & @LF)
        Return SetError(1, DllStructSetData(DllStructCreate("int", $err), 1, 18), -1)
    EndIf
    ConsoleWrite("+ _FNFCIWRITE - $hf - " & $hf & " - $memory - " & $memory & " - $cb - " & $cb & " - $dwBytesWritten - " & $arDllCall[4] & @LF)
    Return $arDllCall[4]    ;$dwBytesWritten
EndFunc


;;  The TCOMPfromLZXWindow macro converts window size into an LXZTCOMP value for FCIAddFile.
;;  Parameters
;;      window_size
;;          The LZX window size. Possible value range is 15-21.
;;
;;  Return value
;;      The return value is a TCOMP value.
;;
;; Syntax
;;    TCOMP TCOMPfromLZXWindow(
;;      INT window_size
;;    );



#EndRegion ;FCI Macros - used by FCI



Func _WinAPI_GetLastErrorEx()
    $GetLastError = DllCall($h_Kernel32Dll, "long", "GetLastError")
    Return $GetLastError[0]
EndFunc


Global $hFCI, $itotal_compressed_size, $itotal_uncompressed_size

DllStructSetData($CCAB, "cb", $MAX_CAB_SIZE)
DllStructSetData($CCAB, "cbFolderThresh", $CB_FOLDER_THRESHOLD)
DllStructSetData($CCAB, "cbReserveCFHeader", 0)
DllStructSetData($CCAB, "cbReserveCFFolder", 0)
DllStructSetData($CCAB, "cbReserveCFData", 0)
DllStructSetData($CCAB, "iCab", 1)
DllStructSetData($CCAB, "iDisk", 0)
DllStructSetData($CCAB, "setID;", 12345)
DllStructSetData($CCAB, "szCab", "\\?\test11.cab")
DllStructSetData($CCAB, "szCabPath", "\\?\C:\Users\DXRW4E\Desktop\")

;~ ConsoleWrite($PFNFCIALLOC & @LF)
;~ ConsoleWrite($PFNFCICLOSE & @LF)
;~ ConsoleWrite($PFNFCIDELETE & @LF)
;~ ConsoleWrite($PFNFCIFILEPLACED & @LF)
;~ ConsoleWrite($PFNFCIFREE & @LF)
;~ ConsoleWrite($PFNFCIGETNEXTCABINET & @LF)
;~ ConsoleWrite($PFNFCIGETOPENINFO & @LF)
;~ ConsoleWrite($PFNFCIGETTEMPFILE & @LF)
;~ ConsoleWrite($PFNFCIOPEN & @LF)
;~ ConsoleWrite($PFNFCIREAD & @LF)
;~ ConsoleWrite($PFNFCISEEK & @LF)
;~ ConsoleWrite($PFNFCISTATUS & @LF)
;~ ConsoleWrite($PFNFCIWRITE & @LF)
;~ ConsoleWrite($PERF & @LF)
;~ ConsoleWrite(DllStructGetData($CCAB, "szCab") & @LF)
;~ ConsoleWrite(DllStructGetData($CCAB, "szCabPath") & @LF)


$hFCI = _FCICreate($PERF, $PFNFCIFILEPLACED, $PFNFCIALLOC, $PFNFCIFREE, $PFNFCIOPEN, $PFNFCIREAD, $PFNFCIWRITE, $PFNFCICLOSE, $PFNFCISEEK, $PFNFCIDELETE, $PFNFCIGETTEMPFILE, $PCCAB, $PCB_PV)
If @Error Then
    ConsoleWrite("FCICreate ERROR - " & @Error & @LF)
Else
    ConsoleWrite($hFCI & @LF)
EndIf
ConsoleWrite(@CRLF & @LF)
;;MsgBox(0, 1, 1)

_FCIAddFile($hFCI, "C:\Users\DXRW4E\Desktop\DismApi.dll", "DismApi.dll", $PFNFCISTATUS, $PFNFCIGETOPENINFO)
ConsoleWrite("@Error - " & @Error & @LF & @LF)
;;MsgBox(0, 1, 2)

_FCIFlushFolder($hFCI)
ConsoleWrite("@Error - " & @Error & @LF & @LF)
;;MsgBox(0, 1, 3)

_FCIFlushCabinet($hFCI)
ConsoleWrite("@Error - " & @Error & @LF & @LF)
;;MsgBox(0, 1, 4)

_FCIDestroy($hFCI)
If @Error Then
    ConsoleWrite("FCIDestroy ERROR - " & @Error & @LF)
Else
    ConsoleWrite($hFCI & @LF)
EndIf
> _FNFCISTATUS - $statusFile - $itotal_compressed_size - 132574 - $itotal_uncompressed_size - 622592 - $pv - 0x00000000
- _FNFCIREAD - $hf - 512 - $memory - 0x00DC05A8 - $cb - 32768
+ _FNFCIREAD - $hf - 512 - $memory - 0x00DC05A8 - $cb - 32768 - 4608
- _FNFCIREAD - $hf - 512 - $memory - 0x00DC17A8 - $cb - 28160
+ _FNFCIREAD - $hf - 512 - $memory - 0x00DC17A8 - $cb - 28160 - 0
- _FNFCICLOSE - $hf - 512
+ _FNFCICLOSE - $hf - 512
- _FNFCIWRITE - $hf - 484 - $memory - 0x006BED30 - $cb - 16
+ _FNFCIWRITE - $hf - 484 - $memory - 0x006BED30 - $cb - 16 - $dwBytesWritten - 16
- _FNFCIWRITE - $hf - 484 - $memory - 0x00CFBEE0 - $cb - 12
+ _FNFCIWRITE - $hf - 484 - $memory - 0x00CFBEE0 - $cb - 12 - $dwBytesWritten - 12
!>00:00:46 AutoIt3.exe ended.rc:-1073740791

I do not understand after done correctly with the _FNFCIWRITE, what's called or what happens hmmmmmmm

if do not use the _FCIAddFile after all and ok, successfully creates the empty cab

 

- _FCICreate - $pccab - 0x011B4920
- _FNFCIALLOC - $cb - 20
+ _FNFCIALLOC - $cb - 20 - 0x01074C50
- _FNFCIALLOC - $cb - 616
+ _FNFCIALLOC - $cb - 616 - 0x011C9B10
- _FNFCIGETTEMPFILE - $pszTempName - 0x011C9B48
+ _FNFCIGETTEMPFILE - $pszTempName - C:UsersDXRW4EAppDataLocalTempcabBAAF.tmp
- _FNFCIOPEN - $pszFile - C:UsersDXRW4EAppDataLocalTempcabBAAF.tmp
+ _FNFCIOPEN - $handle - 492
- _FNFCIGETTEMPFILE - $pszTempName - 0x011C9C50
+ _FNFCIGETTEMPFILE - $pszTempName - C:UsersDXRW4EAppDataLocalTempcabBAB0.tmp
- _FNFCIOPEN - $pszFile - C:UsersDXRW4EAppDataLocalTempcabBAB0.tmp
+ _FNFCIOPEN - $handle - 488
- _FNFCIALLOC - $cb - 4584
+ _FNFCIALLOC - $cb - 4584 - 0x011CA970
- _FNFCIGETTEMPFILE - $pszTempName - 0x011CA9AC
+ _FNFCIGETTEMPFILE - $pszTempName - C:UsersDXRW4EAppDataLocalTempcabBAB1.tmp
- _FNFCIOPEN - $pszFile - C:UsersDXRW4EAppDataLocalTempcabBAB1.tmp
+ _FNFCIOPEN - $handle - 484
- _FNFCIGETTEMPFILE - $pszTempName - 0x011CAAB4
+ _FNFCIGETTEMPFILE - $pszTempName - C:UsersDXRW4EAppDataLocalTempcabBAB2.tmp
- _FNFCIOPEN - $pszFile - C:UsersDXRW4EAppDataLocalTempcabBAB2.tmp
+ _FNFCIOPEN - $handle - 508
- _FNFCIGETTEMPFILE - $pszTempName - 0x011CABBC
+ _FNFCIGETTEMPFILE - $pszTempName - C:UsersDXRW4EAppDataLocalTempcabBAB3.tmp
- _FNFCIOPEN - $pszFile - C:UsersDXRW4EAppDataLocalTempcabBAB3.tmp
+ _FNFCIOPEN - $handle - 512
+ _FCICreate -  $perf - 0x0119FFA8 - 0x01074C50
0x01074C50


- _FCIFlushFolder - $hFCI - 0x01074C50
+ _FCIFlushFolder -  $hFCI - 0x01074C50 - 1
@Error - 0

- _FCIFlushCabinet - $hFCI - 0x01074C50
- _FNFCIOPEN - $pszFile - C:UsersDXRW4EDesktoptest11.cab
+ _FNFCIOPEN - $handle - 516
- _FNFCIALLOC - $cb - 8
+ _FNFCIALLOC - $cb - 8 - 0x011B1A60
- _FNFCIWRITE - $hf - 516 - $memory - 0x011CB304 - $cb - 36
+ _FNFCIWRITE - $hf - 516 - $memory - 0x011CB304 - $cb - 36 - $dwBytesWritten - 36
- _FNFCISEEK - $hf - 512 - $dist - 0 - $seektype - 0
+ _FNFCISEEK - $hf - 512 - $dist - 0 - $seektype - 0
- _FNFCIREAD - $hf - 512 - $memory - 0x011B1A60 - $cb - 8
+ _FNFCIREAD - $hf - 512 - $memory - 0x011B1A60 - $cb - 8 - 0
- _FNFCIALLOC - $cb - 32768
+ _FNFCIALLOC - $cb - 32768 - 0x011ECA80
- _FNFCISEEK - $hf - 508 - $dist - 0 - $seektype - 0
+ _FNFCISEEK - $hf - 508 - $dist - 0 - $seektype - 0
- _FNFCIREAD - $hf - 508 - $memory - 0x011ECA80 - $cb - 32768
+ _FNFCIREAD - $hf - 508 - $memory - 0x011ECA80 - $cb - 32768 - 0
- _FNFCIFREE - $memory - 0x011ECA80
+ _FNFCIFREE - $memory - 0x011ECA80
- _FNFCIALLOC - $cb - 32768
+ _FNFCIALLOC - $cb - 32768 - 0x011ECA80
- _FNFCISEEK - $hf - 484 - $dist - 0 - $seektype - 0
+ _FNFCISEEK - $hf - 484 - $dist - 0 - $seektype - 0
- _FNFCIREAD - $hf - 484 - $memory - 0x011ECA80 - $cb - 32768
+ _FNFCIREAD - $hf - 484 - $memory - 0x011ECA80 - $cb - 32768 - 0
- _FNFCIFREE - $memory - 0x011ECA80
+ _FNFCIFREE - $memory - 0x011ECA80
- _FNFCISEEK - $hf - 516 - $dist - 0 - $seektype - 2
+ _FNFCISEEK - $hf - 516 - $dist - 0 - $seektype - 2
- _FNFCISEEK - $hf - 516 - $dist - 0 - $seektype - 0
+ _FNFCISEEK - $hf - 516 - $dist - 0 - $seektype - 0
- _FNFCIWRITE - $hf - 516 - $memory - 0x011CB304 - $cb - 4
+ _FNFCIWRITE - $hf - 516 - $memory - 0x011CB304 - $cb - 4 - $dwBytesWritten - 4
- _FNFCICLOSE - $hf - 516
+ _FNFCICLOSE - $hf - 516
- _FNFCICLOSE - $hf - 484
+ _FNFCICLOSE - $hf - 484
- _FNFCIDELETE - $pszFile - C:UsersDXRW4EAppDataLocalTempcabBAB1.tmp
+ _FNFCIDELETE - $pszFile - C:UsersDXRW4EAppDataLocalTempcabBAB1.tmp
- _FNFCICLOSE - $hf - 508
+ _FNFCICLOSE - $hf - 508
- _FNFCIDELETE - $pszFile - C:UsersDXRW4EAppDataLocalTempcabBAB2.tmp
+ _FNFCIDELETE - $pszFile - C:UsersDXRW4EAppDataLocalTempcabBAB2.tmp
- _FNFCICLOSE - $hf - 512
+ _FNFCICLOSE - $hf - 512
- _FNFCIDELETE - $pszFile - C:UsersDXRW4EAppDataLocalTempcabBAB3.tmp
+ _FNFCIDELETE - $pszFile - C:UsersDXRW4EAppDataLocalTempcabBAB3.tmp
- _FNFCIGETTEMPFILE - $pszTempName - 0x011CA9AC
+ _FNFCIGETTEMPFILE - $pszTempName - C:UsersDXRW4EAppDataLocalTempcabBAC4.tmp
- _FNFCIOPEN - $pszFile - C:UsersDXRW4EAppDataLocalTempcabBAC4.tmp
+ _FNFCIOPEN - $handle - 512
- _FNFCIGETTEMPFILE - $pszTempName - 0x011CAAB4
+ _FNFCIGETTEMPFILE - $pszTempName - C:UsersDXRW4EAppDataLocalTempcabBAC5.tmp
- _FNFCIOPEN - $pszFile - C:UsersDXRW4EAppDataLocalTempcabBAC5.tmp
+ _FNFCIOPEN - $handle - 516
- _FNFCIGETTEMPFILE - $pszTempName - 0x011CABBC
+ _FNFCIGETTEMPFILE - $pszTempName - C:UsersDXRW4EAppDataLocalTempcabBAC6.tmp
- _FNFCIOPEN - $pszFile - C:UsersDXRW4EAppDataLocalTempcabBAC6.tmp
+ _FNFCIOPEN - $handle - 508
+ _FNFCISTATUS - $cb1 - 0 - $cb2 - 36 - $pv - 0x00000000
- _FNFCIFREE - $memory - 0x011B1A60
+ _FNFCIFREE - $memory - 0x011B1A60
+ _FCIFlushCabinet -  $hFCI - 0x01074C50 - 1
@Error - 0

- _FCIDestroy - $hFCI - 0x01074C50
- _FNFCICLOSE - $hf - 492
+ _FNFCICLOSE - $hf - 492
- _FNFCIDELETE - $pszFile - C:UsersDXRW4EAppDataLocalTempcabBAAF.tmp
+ _FNFCIDELETE - $pszFile - C:UsersDXRW4EAppDataLocalTempcabBAAF.tmp
- _FNFCICLOSE - $hf - 488
+ _FNFCICLOSE - $hf - 488
- _FNFCIDELETE - $pszFile - C:UsersDXRW4EAppDataLocalTempcabBAB0.tmp
+ _FNFCIDELETE - $pszFile - C:UsersDXRW4EAppDataLocalTempcabBAB0.tmp
- _FNFCIFREE - $memory - 0x011C9B10
+ _FNFCIFREE - $memory - 0x011C9B10
- _FNFCICLOSE - $hf - 512
+ _FNFCICLOSE - $hf - 512
- _FNFCIDELETE - $pszFile - C:UsersDXRW4EAppDataLocalTempcabBAC4.tmp
+ _FNFCIDELETE - $pszFile - C:UsersDXRW4EAppDataLocalTempcabBAC4.tmp
- _FNFCICLOSE - $hf - 516
+ _FNFCICLOSE - $hf - 516
- _FNFCIDELETE - $pszFile - C:UsersDXRW4EAppDataLocalTempcabBAC5.tmp
+ _FNFCIDELETE - $pszFile - C:UsersDXRW4EAppDataLocalTempcabBAC5.tmp
- _FNFCICLOSE - $hf - 508
+ _FNFCICLOSE - $hf - 508
- _FNFCIDELETE - $pszFile - C:UsersDXRW4EAppDataLocalTempcabBAC6.tmp
+ _FNFCIDELETE - $pszFile - C:UsersDXRW4EAppDataLocalTempcabBAC6.tmp
- _FNFCIFREE - $memory - 0x011CA970
+ _FNFCIFREE - $memory - 0x011CA970
- _FNFCIFREE - $memory - 0x01074C50
+ _FNFCIFREE - $memory - 0x01074C50
+ _FCIDestroy -  $hFCI - 0x01074C50 - 1
0x01074C50
+>00:05:06 AutoIt3.exe ended.rc:0
>Exit code: 0    Time: 0.540

 

Thank you

Edited by DXRW4E

apps-odrive.pngdrive_app_badge.png box-logo.png new_logo.png MEGA_Logo.png

Share this post


Link to post
Share on other sites



#2 ·  Posted (edited)

Ok, it seems a Bug which affects Windows 8.1 hmm ??, because checking now in VMware Workstation with Windows XP SP3 (also in Windows7 x32) I see that all is Ok

 

>"C:ProgrammiAutoIt3SciTEAutoIt3WrapperAutoIt3Wrapper.exe" /run /beta /ErrorStdOut /in "C:Documents and SettingsOnePieceDesktopCabinet API.au3" /UserParams    
+>03:36:19 Starting AutoIt3Wrapper v.2.1.3.0 SciTE v.3.3.6.0 ;  Keyboard:00000409  OS:WIN_XP/Service Pack 3  CPU:X64 OS:X86    Environment(Language:0410  Keyboard:00000409  OS:WIN_XP/Service Pack 3  CPU:X64 OS:X86)
>Running AU3Check (3.3.9.25)  from:C:ProgrammiAutoIt3Beta
+>03:36:20 AU3Check ended.rc:0
>Running:(3.3.9.25):C:ProgrammiAutoIt3Betaautoit3.exe "C:Documents and SettingsOnePieceDesktopCabinet API.au3"    
--> Press Ctrl+Alt+F5 to Restart or Ctrl+Break to Stop

all ends with success ect ect ect
+>03:36:28 AutoIt3.exe ended.rc:0
>Exit code: 0    Time: 8.799

 

Ciao.

Edited by DXRW4E

apps-odrive.pngdrive_app_badge.png box-logo.png new_logo.png MEGA_Logo.png

Share this post


Link to post
Share on other sites

#4 ·  Posted (edited)

Hi jpm, Thank you, I do not know if that's the problem which causes the Bug in Autoit (all Version), however it seems that the Bug only affects the Windows 8.x (x32 & x64)

Ciao.

Edited by DXRW4E

apps-odrive.pngdrive_app_badge.png box-logo.png new_logo.png MEGA_Logo.png

Share this post


Link to post
Share on other sites

I solved like this, using the CabiNet.dll (v6.1.7601.17514) in Windows 8, everything seems OK

;#RequireAdmin

#include <array.au3>

Global $hFCI, $itotal_compressed_size, $itotal_uncompressed_size

#Region ;Global Variables and Constants
Global Static $arDllCall, $sCabiNetDLL = "\CabiNet.dll"
Global Const $h_Kernel32DLL = DllOpen("Kernel32.dll")
If $h_Kernel32DLL = -1 Then Exit
If StringRegExp(FileGetVersion(@SystemDir & $sCabiNetDLL), "^[6-9]\.[2-9]") Then
    $sCabiNetDLL = "\CabiNet6.1.dll"
    If Not FileExists(@SystemDir & $sCabiNetDLL) Then
        If @OSArch = "X86" Then
            _CabinetDllx86(True, @SystemDir & "\CabiNet6.1.dll")
        Else
            _CabinetDllx86(True, @WindowsDir & "\SysWOW64\CabiNet6.1.dll")
            If Not @AutoItX64 Then DllCall($h_Kernel32DLL, "int", "Wow64DisableWow64FsRedirection", "int", 0)
            _CabinetDllx64(True, @WindowsDir & "\System32\CabiNet6.1.dll")
            If Not @AutoItX64 Then DllCall($h_Kernel32DLL, "int", "Wow64RevertWow64FsRedirection", "int", 0)
        EndIf
    EndIf
EndIf
Global Const $h_CabiNetDLL = DllOpen(@SystemDir & $sCabiNetDLL)
If $h_CabiNetDLL = -1 Then Exit
Global Const $CB_ERROR_INVALID_HANDLE = 6
Global Const $CB_INVALID_HANDLE_VALUE = Ptr(-1)

Global $hDefaultProcessHeap = DllCall($h_Kernel32DLL, "HANDLE", "GetProcessHeap")
If Not @Error And $hDefaultProcessHeap[0] Then $hDefaultProcessHeap = $hDefaultProcessHeap[0]
Global Const $GMEM_FIXED_ZEROINIT = 0x0040  ;Combines GMEM_FIXED and GMEM_ZEROINIT.

Global Const $CP_UTF8                  = 65001
Global Const $WC_ERR_INVALID_CHARS     = 0x00000080  ;; error for invalid chars
Global Const $dwConversionFlags        = StringRegExp(@OSVersion, "WIN_(?>2003|XP|XPe|2000)$") ? 0 : $WC_ERR_INVALID_CHARS

Global Static $FDI_PV = DllStructCreate("int")
Global Static $PFDI_PV = DllStructGetPtr($FDI_PV)
Global Static $FCI_PV = DllStructCreate("int")
Global Static $PFCI_PV = DllStructGetPtr($FCI_PV)
Global Const $PCB_PV = 0    ;or 128 - $_A_NAME_IS_UTF  = 0x80   ;;  /* szName[] contains UTF */

Global $FNFCIALLOC           = DllCallbackRegister("_FNFCIALLOC", "ptr:cdecl", "ULONG")
Global $FNFCICLOSE           = DllCallbackRegister("_FNFCICLOSE", "int:cdecl", "INT_PTR;ptr;ptr")   ;"HANDLE;ptr;ptr"
Global $FNFCIDELETE          = DllCallbackRegister("_FNFCIDELETE", "int:cdecl", "ptr;ptr;ptr")
Global $FNFCIFILEPLACED      = DllCallbackRegister("_FNFCIFILEPLACED", "int:cdecl", "ptr;ptr;long;BOOL;ptr")
Global $FNFCIFREE            = DllCallbackRegister("_FNFCIFREE", "none:cdecl", "HANDLE")
Global $FNFCIGETNEXTCABINET  = DllCallbackRegister("_FNFCIGETNEXTCABINET", "BOOL:cdecl", "ptr;ULONG;ptr")
Global $FNFCIGETOPENINFO     = DllCallbackRegister("_FNFCIGETOPENINFO", "INT_PTR:cdecl", "ptr;ptr;ptr;ptr;ptr;ptr") ;"ptr;USHORT;USHORT;USHORT;ptr;ptr"
Global $FNFCIGETTEMPFILE     = DllCallbackRegister("_FNFCIGETTEMPFILE", "BOOL:cdecl", "ptr;int;ptr")
Global $FNFCIOPEN            = DllCallbackRegister("_FNFCIOPEN", "INT_PTR:cdecl", "ptr;int;int;ptr;ptr")
Global $FNFCIREAD            = DllCallbackRegister("_FNFCIREAD", "UINT:cdecl", "INT_PTR;ptr;UINT;ptr;ptr")
Global $FNFCISEEK            = DllCallbackRegister("_FNFCISEEK", "long:cdecl", "INT_PTR;long;int;ptr;ptr")
Global $FNFCISTATUS          = DllCallbackRegister("_FNFCISTATUS", "long:cdecl", "UINT;ULONG;ULONG;ptr")
Global $FNFCIWRITE           = DllCallbackRegister("_FNFCIWRITE", "UINT:cdecl", "INT_PTR;ptr;UINT;ptr;ptr")
;Global $TCOMPfromLZXWindow   = DllCallbackRegister("_FNFCICLOSE", "USHORT:cdecl", "INT")

Global $PFNFCIALLOC          = DllCallbackGetPtr($FNFCIALLOC)
Global $PFNFCICLOSE          = DllCallbackGetPtr($FNFCICLOSE)
Global $PFNFCIDELETE         = DllCallbackGetPtr($FNFCIDELETE)
Global $PFNFCIFILEPLACED     = DllCallbackGetPtr($FNFCIFILEPLACED)
Global $PFNFCIFREE           = DllCallbackGetPtr($FNFCIFREE)
Global $PFNFCIGETNEXTCABINET = DllCallbackGetPtr($FNFCIGETNEXTCABINET)
Global $PFNFCIGETOPENINFO    = DllCallbackGetPtr($FNFCIGETOPENINFO)
Global $PFNFCIGETTEMPFILE    = DllCallbackGetPtr($FNFCIGETTEMPFILE)
Global $PFNFCIOPEN           = DllCallbackGetPtr($FNFCIOPEN)
Global $PFNFCIREAD           = DllCallbackGetPtr($FNFCIREAD)
Global $PFNFCISEEK           = DllCallbackGetPtr($FNFCISEEK)
Global $PFNFCISTATUS         = DllCallbackGetPtr($FNFCISTATUS)
Global $PFNFCIWRITE          = DllCallbackGetPtr($FNFCIWRITE)
;Global $PTCOMPfromLZXWindow  = DllCallbackGetPtr($FNFCICLOSE)


Global Const $GENERIC_READ                     = 0x80000000 ;; $SDDL_GENERIC_READ = "GR"
Global Const $GENERIC_WRITE                    = 0x40000000 ;; $SDDL_GENERIC_WRITE = "GW"
Global Const $GENERIC_EXECUTE                  = 0x20000000 ;; $SDDL_GENERIC_EXECUTE = "GX"
Global Const $GENERIC_ALL                      = 0x10000000 ;; $SDDL_GENERIC_ALL = "GA"
Global Const $GENERIC_READ_WRITE               = BitOR($GENERIC_READ, $GENERIC_WRITE)
Global Const $CB_dwDesiredAccess[4]            = [$GENERIC_READ, $GENERIC_WRITE, $GENERIC_READ_WRITE, $GENERIC_READ_WRITE]

;;Global Const $CREATE_NEW = 1
Global Const $CREATE_ALWAYS = 2
Global Const $OPEN_EXISTING = 3
;;Global Const $OPEN_ALWAYS = 4
;;Global Const $TRUNCATE_EXISTING = 5

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; Attributes of file; may be used in any combination:
Global Const $_A_RDONLY       = 0x01    ;;  /* file is read-only */
Global Const $_A_HIDDEN       = 0x02    ;;  /* file is hidden */
Global Const $_A_SYSTEM       = 0x04    ;;  /* file is a system file */
Global Const $_A_ARCH         = 0x20    ;;  /* file modified since last backup */
Global Const $_A_RDONLY_HIDDEN_SYSTEM_ARCH = BitOR($_A_RDONLY, $_A_SYSTEM, $_A_HIDDEN + $_A_ARCH)

;;/*
;; * FAT file attribute flag used by FCI/FDI to indicate that
;; * the file should be executed after extraction
;; */
Global Const $_A_EXEC         = 0x40    ;;  /* run after extraction */
;;/*
;; * FAT file attribute flag used by FCI/FDI to indicate that
;; * the filename in the CAB is a UTF string
;; */
Global Const $_A_NAME_IS_UTF  = 0x80    ;;  /* szName[] contains UTF */
;; All other attribute bit values are reserved.
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

;;;; from msvcrt/fcntl.h */
;;/* Specifiy one of these flags to define the access mode. */
Global Const $_O_RDONLY       = 0
Global Const $_O_WRONLY       = 1
Global Const $_O_RDWR         = 2
Global Const $_O_RDONLY_WRONLY_RDWR = 3

;;/* Mask for access mode bits in the _open flags. */
Global Const $_O_ACCMODE      = 0x0003  ;BitOR($_O_RDONLY, $_O_WRONLY, $_O_RDWR)

Global Const $_O_APPEND       = 0x0008  ;;/* Writes will add to the end of the file. */

Global Const $_O_RANDOM       = 0x0010
Global Const $_O_SEQUENTIAL   = 0x0020
Global Const $_O_TEMPORARY    = 0x0040  ;;/* Make the file dissappear after closing.  * WARNING: Even if not created by _open! */
Global Const $_O_NOINHERIT    = 0x0080

Global Const $_O_CREAT        = 0x0100  ;;/* Create the file if it does not exist. */
Global Const $_O_TRUNC        = 0x0200  ;;/* Truncate the file if it does exist. */
Global Const $_O_EXCL         = 0x0400  ;;/* Open only if the file does not exist. */

Global Const $_O_SHORT_LIVED  = 0x1000

;;/* NOTE: Text is the default even if the given _O_TEXT bit is not on. */
Global Const $_O_TEXT         = 0x4000  ;;/* CR-LF in file becomes LF in memory. */
Global Const $_O_BINARY       = 0x8000  ;;/* Input and output is not translated. */
Global Const $_O_RAW          = $_O_BINARY

Global Const $FILE_SHARE_READ   = 0x01
;;Global Const $FILE_SHARE_WRITE  = 0x02
;;Global Const $FILE_SHARE_DELETE = 0x04

Global Const $FILE_FLAG_SEQUENTIAL_SCAN          = 0x08000000
Global Const $FILE_ATTRIBUTE_ARCHIVE             = 0x00000020
Global Const $FILE_ATTRIBUTE_NORMAL              = 0x00000080
Global Const $FILE_ATTRIBUTE_NORMAL_FLAG_SEQUENTIAL_SCAN = BitOR($FILE_FLAG_SEQUENTIAL_SCAN, $FILE_ATTRIBUTE_NORMAL)

Global Const $MAX_CAB_SIZE        = 0x7FFFFFFF  ;; Total-bytes (uncompressed) in a CAB-folder
Global Const $CB_MAX_CHUNK        = 32768
Global Const $CB_MAX_DISK         = 0x7ffffff
Global Const $CB_MAX_FILENAME     = 256
Global Const $CB_MAX_CABINET_NAME = 256
Global Const $CB_MAX_CAB_PATH     = 256
Global Const $CB_MAX_DISK_NAME    = 256
Global Const $CB_MAX_FILE_COUNT   = 0xFFFF
Global Const $CB_FOLDER_THRESHOLD = 0x7FFFFFFF; // maximum compression
Global Const $CB_MAX_SIZE_UNCMPSD = 0x7FFF8000  ;; Total-bytes (uncompressed) in a CAB-folder 0x7FFF0000

Global Const $tcompMASK_TYPE          = 0x000F  ;; Mask for compression type
Global Const $tcompTYPE_NONE          = 0x0000  ;; No compression
Global Const $tcompTYPE_MSZIP         = 0x0001  ;; MSZIP
Global Const $tcompTYPE_QUANTUM       = 0x0002  ;; Quantum
Global Const $tcompTYPE_LZX           = 0x0003  ;; LZX
Global Const $tcompBAD                = 0x000F  ;; Unspecified compression type

Global Const $tcompMASK_LZX_WINDOW    = 0x1F00  ;; Mask for LZX Compression Memory
Global Const $tcompLZX_WINDOW_LO      = 0x0F00  ;; Lowest LZX Memory (15)
Global Const $tcompLZX_WINDOW_HI      = 0x1500  ;; Highest LZX Memory (21)
Global Const $tcompSHIFT_LZX_WINDOW   = 8       ;; Amount to shift over to get int

Global Const $tcompMASK_QUANTUM_LEVEL  = 0x00F0  ;; Mask for Quantum Compression Level
Global Const $tcompQUANTUM_LEVEL_LO    = 0x0010  ;; Lowest Quantum Level (1)
Global Const $tcompQUANTUM_LEVEL_HI    = 0x0070  ;; Highest Quantum Level (7)
Global Const $tcompSHIFT_QUANTUM_LEVEL = 4       ;; Amount to shift over to get int

Global Const $tcompMASK_QUANTUM_MEM   = 0x1F00  ;; Mask for Quantum Compression Memory
Global Const $tcompQUANTUM_MEM_LO     = 0x0A00  ;; Lowest Quantum Memory (10)
Global Const $tcompQUANTUM_MEM_HI     = 0x1500  ;; Highest Quantum Memory (21)
Global Const $tcompSHIFT_QUANTUM_MEM  = 8       ;; Amount to shift over to get int

Global Const $tcompMASK_RESERVED      = 0xE000  ;; Reserved bits (high 3 bits)

Global Const $tcompTYPE_LZX_EX        = BitOR($tcompTYPE_LZX, $tcompLZX_WINDOW_HI)

;;/***    FCIERROR - Error codes returned in erf.erfOper field
;; *
;; */
Const Enum _ ;FCIERROR
    $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
    $FCIERR_CAB_FORMAT_LIMIT      ;; Data-size or file-count exceeded CAB format limits.
                                  ;; i.e. Total-bytes (uncompressed) in a CAB-folder exceeded 0x7FFF8000 (~ 2GB)
                                  ;; or, CAB size (compressed) exceeded 0x7FFFFFFF
                                  ;; or, File-count in CAB exceeded 0xFFFF
;;;; The following values are returned for FCI:
;;Global Const $FCIERR_NONE             = 0x00 ;; No Error.
;;Global Const $FCIERR_OPEN_SRC         = 0x01 ;; Failure opening the file to be stored in the cabinet.
;;Global Const $FCIERR_READ_SRC         = 0x02 ;; Failure reading the file to be stored in the cabinet.
;;Global Const $FCIERR_ALLOC_FAIL       = 0x03 ;; Out of memory in FCI.
;;Global Const $FCIERR_TEMP_FILE        = 0x04 ;; Could not create a temporary file.
;;Global Const $FCIERR_BAD_COMPR_TYPE   = 0x05 ;; Unknown compression type.
;;Global Const $FCIERR_CAB_FILE         = 0x06 ;; Could not create the cabinet file.
;;Global Const $FCIERR_USER_ABORT       = 0x07 ;; FCI aborted.
;;Global Const $FCIERR_MCI_FAIL         = 0x08 ;; Failure compressing data.
;;Global Const $FCIERR_CAB_FORMAT_LIMIT = 0x09 ;; Data-size or file-count exceeded CAB format limits.
                                               ;; i.e. Total-bytes (uncompressed) in a CAB-folder exceeded 0x7FFF8000 (~ 2GB)
                                               ;; or, CAB size (compressed) exceeded 0x7FFFFFFF
                                               ;; or, File-count in CAB exceeded 0xFFFF

Global Const $statusFile      = 0   ;; Add File to Folder callback
Global Const $statusFolder    = 1   ;; Add Folder to Cabinet callback
Global Const $statusCabinet   = 2   ;; Write out a completed cabinet callback

; *******************************************************************************************************************************
; Time Structures
; *******************************************************************************************************************************
; ===============================================================================================================================
; #STRUCTURE# ===================================================================================================================
; Name...........: $tagFILETIME
; Description ...: Contains the number of 100-nanosecond intervals since January 1, 1601
; Fields ........: Lo - The low order part of the file time
;                  Hi - The high order part of the file time
; Author ........: Paul Campbell (PaulIA)
; Remarks .......:
; ===============================================================================================================================
Global Const $CB_tagFILETIME = "struct;dword Lo;dword Hi;endstruct"
;;Global Static $FDI_FileTime = DllStructCreate($CB_tagFILETIME)
;;Global Static $FDI_lpFileTime = DllStructGetPtr($FDI_FileTime)
;;Global Static $FDI_LocalFileTime = DllStructCreate($CB_tagFILETIME)
;;Global Static $FDI_lpLocalFileTime = DllStructGetPtr($FDI_LocalFileTime)
Global Static $FCI_FileTime = DllStructCreate($CB_tagFILETIME)
Global Static $FCI_lpFileTime = DllStructGetPtr($FCI_FileTime)
Global Static $FCI_LocalFileTime = DllStructCreate($CB_tagFILETIME)
Global Static $FCI_lpLocalFileTime = DllStructGetPtr($FCI_LocalFileTime)
Global Static $FCI_BY_HANDLE_FILE_INFORMATION = DllStructCreate("dword;STRUCT;dword Lo;dword Hi;ENDSTRUCT;STRUCT;dword Lo;dword Hi;ENDSTRUCT;STRUCT;dword Lo;dword Hi;ENDSTRUCT;dword;dword;dword;dword;dword;dword")
Global Static $FCI_PBY_HANDLE_FILE_INFORMATION = DllStructGetPtr($FCI_BY_HANDLE_FILE_INFORMATION)
Global Static $FCI_ftLastWriteTime = DllStructGetPtr($FCI_BY_HANDLE_FILE_INFORMATION, 6)

#EndRegion ;Global Variables and Constants


#Region ;Cabinet API Structures
;;  The CCAB structure contains cabinet information.
;;      typedef struct _CCAB {
;;        ULONG  cb;
;;        ULONG  cbFolderThresh;
;;        UINT   cbReserveCFHeader;
;;        UINT   cbReserveCFFolder;
;;        UINT   cbReserveCFData;
;;        int    iCab;
;;        int    iDisk;
;;        USHORT setID;
;;        char   szDisk[CB_MAX_DISK_NAME];
;;        char   szCab[CB_MAX_CABINET_NAME];
;;        char   szCabPath[CB_MAX_CAB_PATH];
;;      } CCAB, *PCCAB;
;;
;;  Members
;;      cb
;;          The maximum size, in bytes, of a cabinet created by FCI.
;;      cbFolderThresh
;;          The maximum size, in bytes, that a folder will contain before a new folder is created.
;;      cbReserveCFHeader
;;          The size, in bytes, of the CFHeader reserve area. Possible value range is 0-60,000.
;;      cbReserveCFFolder
;;          The size, in bytes, of the CFFolder reserve area. Possible value range is 0-255.
;;      cbReserveCFData
;;          The size, in bytes, of the CFData reserve area. Possible value range is 0-255.
;;      iCab
;;          The number of created cabinets.
;;      iDisk
;;          The maximum size, in bytes, of a cabinet created by FCI.
;;      setID
;;          A value that represents the association between a collection of linked cabinet files.
;;      szDisk
;;          The name of the disk on which the cabinet is placed.
;;      szCab
;;          The name of the cabinet.
;;      szCabPath
;;          The full path that indicates where to create the cabinet.
;;
;; /***    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.
;; */
Global Const $tds_CCAB = "" & _      ; The CCAB structure contains cabinet information.
    "ULONG  cb;" & _                 ; size available for cabinet on this media
    "ULONG  cbFolderThresh;" & _     ; Thresshold for forcing a new Folder
    "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
    "USHORT setID;" & _              ; Cabinet set ID
    "char   szDisk[256];" & _        ; current disk name
    "char   szCab[256];" & _         ; current cabinet name
    "char   szCabPath[256]"          ; path for creating cabinet
Global Static $CCAB = DllStructCreate($tds_CCAB)
Global Static $PCCAB = DllStructGetPtr($CCAB)


;;  The ERF structure contains error information from FCI/FDI. The caller should not modify this structure.
;;      typedef struct {
;;        int  erfOper;
;;        int  erfType;
;;        BOOL fError;
;;      } ERF FAR *PERF;
;;
;;  Members
;;      erfOper
;;          An FCI/FDI error code.
;;          The following values are returned for FCI:
;;              Value                        - Meaning
;;              FCIERR_NONE             0x00 - No Error.
;;              FCIERR_OPEN_SRC         0x01 - Failure opening the file to be stored in the cabinet.
;;              FCIERR_READ_SRC         0x02 - Failure reading the file to be stored in the cabinet.
;;              FCIERR_ALLOC_FAIL       0x03 - Out of memory in FCI.
;;              FCIERR_TEMP_FILE        0x04 - Could not create a temporary file.
;;              FCIERR_BAD_COMPR_TYPE   0x05 - Unknown compression type.
;;              FCIERR_CAB_FILE         0x06 - Could not create the cabinet file.
;;              FCIERR_USER_ABORT       0x07 - FCI aborted.
;;              FCIERR_MCI_FAIL         0x08 - Failure compressing data.
;;              FCIERR_CAB_FORMAT_LIMIT 0x09 - Data-size or file-count exceeded CAB format limits.
;;          The following values are returned for FDI:
;;              Value                                 - Meaning
;;              FDIERROR_NONE                    0x00 - No error.
;;              FDIERROR_CABINET_NOT_FOUND       0x01 - The cabinet file was not found.
;;              FDIERROR_NOT_A_CABINET           0x02 - The cabinet file does not have the correct format.
;;              FDIERROR_UNKNOWN_CABINET_VERSION 0x03 - The cabinet file has an unknown version number.
;;              FDIERROR_CORRUPT_CABINET         0x04 - The cabinet file is corrupt.
;;              FDIERROR_ALLOC_FAIL              0x05 - Insufficient memory.
;;              FDIERROR_BAD_COMPR_TYPE          0x06 - Unknown compression type used in the cabinet folder.
;;              FDIERROR_MDI_FAIL                0x07 - Failure decompressing data from the cabinet file.
;;              FDIERROR_TARGET_FILE             0x08 - Failure writing to the target file.
;;              FDIERROR_RESERVE_MISMATCH        0x09 - The cabinets within a set do not have the same RESERVE sizes.
;;              FDIERROR_WRONG_CABINET           0x0A - The cabinet returned by fdintNEXT_CABINET is incorrect.
;;              FDIERROR_USER_ABORT              0x0B - FDI aborted.
;;      erfType
;;          An optional error value filled in by FCI/FDI. For FCI, this is usually the C runtime errno value.
;;      fError
;;          A flag that indicates an error. If TRUE, an error is present.
;;
;; /***    ERF - Error structure
;; *
;; *  This structure returns error information from FCI/FDI.  The caller should
;; *  not modify this structure.
;; */
Global Const $tds_ERF = "" & _ ; The ERF structure contains error information from FCI/FDI. The caller should not modify this structure.
    "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
Global Static $ERF  = DllStructCreate($tds_ERF)
Global Static $PERF = DllStructGetPtr($ERF)

#EndRegion ;Cabinet API Structures


#Region ;FCI Functions
;;  The FCI (File Compression Interface) library provides the ability to create cabinets (also known as "CAB files"). Additionally,
;;    the library provides compression to reduce the size of the file data stored in cabinets.

;; The FCIAddFile adds a file to the cabinet under construction. (Add a disk file to a folder/cabinet)
;;  Parameters
;;      hfci [in]
;;          A valid FCI context handle returned by the FCICreate function.
;;      pszSourceFile [in]
;;          The name of the file to add; this value should include path information. (Name of file to add to folder)
;;      pszFileName [in]
;;          The name under which to store the file in the cabinet. (Name to store into folder/cabinet)
;;      fExecute [in]
;;          If set TRUE, the file will be executed when extracted. (Flag indicating execute on extract)
;;      GetNextCab [in]
;;          Pointer to an application-defined callback function to obtain specifications on the next cabinet to create. The function should be declared using the FNFCIGETNEXTCABINET macro.
;;      pfnProgress [in]
;;          Pointer to an application-defined callback function to update the progress information available to the user. The function should be declared using the FNFCISTATUS macro.
;;      pfnOpenInfo [in]
;;          Pointer to an application-defined callback function to open a file and retrieve the file date, time, and attributes. The function should be declared using the FNFCIGETOPENINFO macro.
;;      typeCompress [in]
;;          The compression type to use.
;;          Note  To indicate LZX compression, use the TCOMPfromLZXWindow macro.
;;          Value                  -  Meaning
;;          tcompTYPE_NONE  0x0000 - No compression.
;;          tcompTYPE_MSZIP 0x0001 - Microsoft ZIP compression.
;;
;;  Return value
;;      If the function succeeds, it returns TRUE; otherwise, FALSE.
;;      Extended error information is provided in the ERF structure used to create the FCI context.
;;
;;  Remarks
;;      When set, the _A_EXEC attribute is added to the file entry in the CAB. This mechanism is used in some Microsoft self-extracting executables,
;;        and could be used for this purpose in any custom extraction application.
;;      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.
;;
;; Syntax
;;    BOOL FCIAddFile(
;;      _In_  HFCI hfci,
;;      _In_  LPSTR pszSourceFile,
;;      _In_  LPSTR pszFileName,
;;      _In_  BOOL fExecute,
;;      _In_  PFNFCIGETNEXTCABINET GetNextCab,
;;      _In_  PFNFCISTATUS pfnProgress,
;;      _In_  PFNFCIGETOPENINFO pfnOpenInfo,
;;      _In_  TCOMP typeCompress
;;    );
Func _FCIAddFile($hFCI, $pszSourceFile, $pszFileName, $pfnProgress, $pfnOpenInfo, $fExecute = False, $typeCompress = $tcompTYPE_LZX_EX)
    ConsoleWrite("- _FCIAddFile - $hFCI - " & $hFCI & @LF)
    ;$arDllCall = DllCall($h_CabiNetDLL, "BOOL:cdecl", "FCIAddFile", "ptr", $HFCI, "struct*", $pszSourceFile, "struct*", $pszFileName, "BOOL", $fExecute, _
    $arDllCall = DllCall($h_CabiNetDLL, "BOOL:cdecl", "FCIAddFile", "Handle", $hFCI, "str", $pszSourceFile, "str", $pszFileName, "BOOL", $fExecute, _
    "ptr", $PFNFCIGETNEXTCABINET, "ptr", $pfnProgress, "ptr", $pfnOpenInfo, "USHORT", $typeCompress)

    If @Error Or Not $arDllCall[0] Then
        ConsoleWrite("! ERROR _FCIAddFile -  $hFCI - " & $hFCI & " - " & $arDllCall[0] & @LF)
        ConsoleWrite("! ERROR1 _FCIAddFile - " & DllStructGetData($ERF, "fError") & " - " &  DllStructGetData($ERF, "erfOper") & @LF)
        Return SetError(-1, 0, False)
    EndIf
    ConsoleWrite("+ _FCIAddFile -  $hFCI - " & $hFCI & " - " & $arDllCall[0] & @LF)
    Return $arDllCall[0]
EndFunc


;; The FCICreate function creates an FCI context.
;;  Parameters
;;      perf [in, out]
;;          Pointer to an ERF structure that receives the error information.
;;      pfnfiledest [in]
;;          Pointer to an application-defined callback function to notify when a file is placed in the cabinet. The function should be declared using the FNFCIFILEPLACED macro.
;;      pfnalloc [in]
;;          Pointer to an application-defined callback function to allocate memory. The function should be declared using the FNFCIALLOC macro.
;;      pfnfree [in]
;;          Pointer to an application-defined callback function to free previously allocated memory. The function should be delcared using the FNFCIFREE macro.
;;      pfnopen [in]
;;          Pointer to an application-defined callback function to open a file. The function should be declared using the FNFCIOPEN macro.
;;      pfnread [in]
;;          Pointer to an application-defined callback function to read data from a file. The function should be declared using the FNFCIREAD macro.
;;      pfnwrite [in]
;;          Pointer to an application-defined callback function to write data to a file. The function should be declared using the FNFCIWRITE macro.
;;      pfnclose [in]
;;          Pointer to an application-defined callback function to close a file. The function should be declared using the FNFCICLOSE macro.
;;      pfnseek [in]
;;          Pointer to an application-defined callback function to move a file pointer to the specific location. The function should be declared using the FNFCISEEK macro.
;;      pfndelete [in]
;;          Pointer to an application-defined callback function to delete a file. The function should be declared using the FNFCIDELETE macro.
;;      pfnfcigtf [in]
;;          Pointer to an application-defined callback function to retrieve a temporary file name. The function should be declared using the FNFCIGETTEMPFILE macro.
;;      pccab [in]
;;          Pointer to a CCAB structure that contains the parameters for creating a cabinet.
;;      pv [in, optional]
;;          Pointer to an application-defined value that is passed to callback functions.
;;
;;  Return value
;;      If the function succeeds, it returns a non-NULL HFCI context pointer; otherwise, NULL.
;;      Extended error information is provided in the ERF structure.
;;
;;  Remarks
;;      FCI supports multiple simultaneous contexts. As a result it is possible to create or extract multiple cabinets at the same time within the same application.
;;        If the application is multithreaded, it is also possible to run a different context in each thread; however, an application cannot use the same context
;;        simultaneously in multiple threads. For example, FCIAddFile cannot be called from two different threads, using the same FCI context.
;;
;; Syntax
;;    HFCI FCICreate(
;;      _Inout_   PERF perf,
;;      _In_      PFNFCIFILEPLACED pfnfiledest,
;;      _In_      PFNFCIALLOC pfnalloc,
;;      _In_      PFNFCIFREE pfnfree,
;;      _In_      PFNFCIOPEN pfnopen,
;;      _In_      PFNFCIREAD pfnread,
;;      _In_      PFNFCIWRITE pfnwrite,
;;      _In_      PFNFCICLOSE pfnclose,
;;      _In_      PFNFCISEEK pfnseek,
;;      _In_      PFNFCIDELETE pfndelete,
;;      _In_      PFNFCIGETTEMPFILE pfnfcigtf,
;;      _In_      PCCAB pccab,
;;      _In_opt_  void FAR *pv
;;    );
Func _FCICreate($perf, $pfnfiledest, $pfnalloc, $pfnfree, $pfnopen, $pfnread, $pfnwrite, $pfnclose, $pfnseek, $pfndelete, $pfnfcigtf, $pccab, $pv = 0)
    ConsoleWrite("- _FCICreate - $pccab - " & $pccab & @LF)
    Local $arDllCall = DllCall($h_CabiNetDLL, "HWND:cdecl", "FCICreate", "ptr", $perf, "ptr", $pfnfiledest, "ptr", $pfnalloc, "ptr", $pfnfree, "ptr", $pfnopen, _
        "ptr", $pfnread, "ptr", $pfnwrite, "ptr", $pfnclose, "ptr", $pfnseek, "ptr", $pfndelete, "ptr", $pfnfcigtf, "ptr", $pccab, "ptr", $pv)
    If @Error Or Not $arDllCall[0] Then
        Return SetError(-1, @Error, Null)
        ConsoleWrite("! ERROR _FCICreate -  $perf - " & $perf & " - " & $arDllCall[0] & @LF)
    EndIf
    ;;_ArrayDisplay($arDllCall, DllStructGetData($ERF, "erfOper"))
    ConsoleWrite("+ _FCICreate -  $perf - " & $perf & " - " & $arDllCall[0] & @LF)
    Return SetError(0, 0, $arDllCall[0])
EndFunc


;; The FCIDestroy function deletes an open FCI context, freeing any memory and temporary files associated with the context.
;;  Parameters
;;      hfci [in]
;;          A valid FCI context handle returned by the FCICreate function.
;;
;;  Return value
;;      If the function succeeds, it returns TRUE; otherwise, FALSE.
;;      Extended error information is provided in the ERF structure used to create the FCI context.
;;
;; Syntax
;;    BOOL FCIDestroy(
;;      _In_  HFCI hfci
;;    );
Func _FCIDestroy($hFCI)
    ConsoleWrite("- _FCIDestroy - $hFCI - " & $hFCI & @LF)
    Local $arDllCall = DllCall($h_CabiNetDLL, "BOOL:cdecl", "FCIDestroy", "handle", $hFCI)
    If @Error Or Not $arDllCall[0] Then
        Return SetError(1, DllStructGetData($ERF, "erfOper"), False)
        ConsoleWrite("! ERROR FCIDestroy -  $hFCI - " & $hFCI & " - " & $arDllCall[0] & @LF)
    EndIf
    ConsoleWrite("+ _FCIDestroy -  $hFCI - " & $hFCI & " - " & $arDllCall[0] & @LF)
    Return $arDllCall[0]
EndFunc


;; The FCIFlushCabinet function completes the current cabinet.
;;  Parameters
;;      hfci [in]
;;          A valid FCI context handle returned by theFCICreate function.
;;      fGetNextCab [in]
;;          Specifies whether the function pointed to by the supplied GetNextCab parameter will be called.
;;            TRUE  => Call GetNextCab to get continuation info
;;            FALSE => Don't call GetNextCab unless this cabinet overflows.
;;      GetNextCab [in]
;;          Pointer to an application-defined callback function to obtain specifications on the next cabinet to create. The function should be declared using the FNFCIGETNEXTCABINET macro.
;;      pfnProgress [in]
;;          Pointer to an application-defined callback function to update the user. The function should be declared using the FNFCISTATUS macro.
;;
;;  Return value
;;      If the function succeeds, it returns TRUE, otherwise FALSE (error structure filled in).
;;      Extended error information is provided in the ERF structure used to create the FCI context.
;;
;;  Remarks
;;      The FCIFlushCabinet API forces the current cabinet under construction to be completed immediately and then written to disk. Further calls to FCIAddFile
;;        will result in files being added to another cabinet.
;;
;;      In the event the current cabinet has reached the application-specified media size limit, the pending data within an FCI's internal buffers will
;;        be placed into another cabinet.
;;
;;      The fGetNextCab flag determines whether the function pointed to by the GetNextCab parameter will be called. If fGetNextCab is set TRUE,
;;        GetNextCab is called to obtain continuation information. If FALSE, then GetNextCab is called only in the event the cabinet overflows.
;;
;;  Syntax
;;    BOOL FCIFlushCabinet(
;;      _In_  HFCI hfci,
;;      _In_  BOOL fGetNextCab,
;;      _In_  PFNFCIGETNEXTCABINET GetNextCab,
;;      _In_  PFNFCISTATUS pfnProgress
;;    );
Func _FCIFlushCabinet($hFCI, $fGetNextCab = False)
    ConsoleWrite("- _FCIFlushCabinet - $hFCI - " & $hFCI & @LF)
    Local $arDllCall = DllCall($h_CabiNetDLL, "BOOL:cdecl", "FCIFlushCabinet", "handle", $hFCI, "BOOL", $fGetNextCab, "ptr", $PFNFCIGETNEXTCABINET, "ptr", $PFNFCISTATUS)
    If @Error Or Not $arDllCall[0] Then
        Return SetError(1, DllStructGetData($ERF, "erfOper"), False)
        ConsoleWrite("! ERROR FCIFlushCabinet -  $hFCI - " & $hFCI & " - " & $arDllCall[0] & @LF)
    EndIf
    ConsoleWrite("+ _FCIFlushCabinet -  $hFCI - " & $hFCI & " - " & $arDllCall[0] & @LF)
    Return $arDllCall[0]
EndFunc


;; The FCIFlushFolder function forces the current folder under construction to be completed immediately.
;;  Parameters
;;      hfci [in]
;;          A valid FCI context handle returned by the FCICreate function.
;;      GetNextCab [in]
;;          Pointer to an application-defined callback function to obtain specifications on the next cabinet to create. The function should be declared using the FNFCIGETNEXTCABINET macro.
;;      pfnProgress [in]
;;          Pointer to an application-defined callback function to update the user. The function should be declared using the FNFCISTATUS macro.
;;
;;  Return value
;;      If the function succeeds, it returns TRUE; otherwise, FASLE.
;;      Extended error information is provided in the ERF structure used to create the FCI context.
;;
;;  Remarks
;;      The FCIFlushFolder API forces the folder currently under construction to be completed immediately; effectively resetting the compression history if a compression method is in use.
;;
;;      The callback function indicated by GetNextCab will be called if the cabinet overflows, which occurs if the pending data buffered inside an FCI causes the application-specified cabinet media size to be exceeded.
;;
;; Syntax
;;    BOOL FCIFlushFolder(
;;      _In_  HFCI hfci,
;;      _In_  PFNFCIGETNEXTCABINET GetNextCab,
;;      _In_  PFNFCISTATUS pfnProgress
;;    );
Func _FCIFlushFolder($hFCI, $fGetNextCab = False)
    ConsoleWrite("- _FCIFlushFolder - $hFCI - " & $hFCI & @LF)
    Local $arDllCall = DllCall($h_CabiNetDLL, "BOOL:cdecl", "FCIFlushFolder", "handle", $hFCI, "BOOL", $fGetNextCab, "ptr", $PFNFCIGETNEXTCABINET, "ptr", $PFNFCISTATUS)
    If @Error Or Not $arDllCall[0] Then
        ConsoleWrite("! ERROR FCIFlushFolder -  $hFCI - " & $hFCI & " - " & $arDllCall[0] & @LF)
        Return SetError(1, DllStructGetData($ERF, "erfOper"), False)
    EndIf
    ConsoleWrite("+ _FCIFlushFolder -  $hFCI - " & $hFCI & " - " & $arDllCall[0] & @LF)
    Return $arDllCall[0]
EndFunc


;; The FCIErrorToString
;;          An FCI error code. Possible values include:
;;          Value                        - Meaning
;;          FCIERR_NONE             0x00 - No Error.
;;          FCIERR_OPEN_SRC         0x01 - Failure opening the file to be stored in the cabinet.
;;          FCIERR_READ_SRC         0x02 - Failure reading the file to be stored in the cabinet.
;;          FCIERR_ALLOC_FAIL       0x03 - Out of memory in FCI.
;;          FCIERR_TEMP_FILE        0x04 - Could not create a temporary file.
;;          FCIERR_BAD_COMPR_TYPE   0x05 - Unknown compression type.
;;          FCIERR_CAB_FILE         0x06 - Could not create the cabinet file.
;;          FCIERR_USER_ABORT       0x07 - FCI aborted.
;;          FCIERR_MCI_FAIL         0x08 - Failure compressing data.
;;          FCIERR_CAB_FORMAT_LIMIT 0x09 - Data-size or file-count exceeded CAB format limits.
Func _FCIErrorToString($FCIERROR)
    Switch $FCIERROR
        Case $FCIERR_NONE
            Return "No error";
        Case $FCIERR_OPEN_SRC
            Return "Failure opening file to be stored in cabinet";
        Case $FCIERR_READ_SRC
            Return "Failure reading file to be stored in cabinet";
        Case $FCIERR_ALLOC_FAIL
            Return "Insufficient memory in FCI";
        Case $FCIERR_TEMP_FILE
            Return "Could not create a temporary file";
        Case $FCIERR_BAD_COMPR_TYPE
            Return "Unknown compression type";
        Case $FCIERR_CAB_FILE
            Return "Could not create cabinet file";
        Case $FCIERR_USER_ABORT
            Return "Client requested abort";
        Case $FCIERR_MCI_FAIL
            Return "Failure compressing data";
        Case $FCIERR_CAB_FORMAT_LIMIT
            Return "Data-size or file-count exceeded CAB format limits";
        Case Else
            Return "Unknown error";
    EndSwitch
EndFunc


#EndRegion ;FCI Functions


#Region ;FCI Macros - used by FCI
;;  The following macros are used by FCI:
;;      Macro               - Description
;;      FNFCIALLOC          - Used to allocate memory in an FCI context.
;;      FNFCICLOSE          - Used to close a file.
;;      FNFCIDELETE         - Used to delete a file.
;;      FNFCIFILEPLACED     - Used to notify when a file is placed in the cabinet.
;;      FNFCIFREE           - Used to free previously allocated memory in an FCI context.
;;      FNFCIGETNEXTCABINET - Used to request information for the next cabinet.
;;      FNFCIGETOPENINFO    - Used to open a file and retrieve file date, time, and attributes.
;;      FNFCIGETTEMPFILE    - Used to obtain a temporary file name.
;;      FNFCIOPEN           - Used to open a file in an FCI context.
;;      FNFCIREAD           - Used to read data from a file.
;;      FNFCISEEK           - Used to move a file pointer to a specified location.
;;      FNFCISTATUS         - Used to update the user.
;;      FNFCIWRITE          - Used to write data to a file.
;;      TCOMPfromLZXWindow  - Converts windows size into an LXZ TCOMP value for FCIAddFile.



;;  The FNFCIALLOC provides the declaration for the application-defined callback function to allocate memory within an FCI context.
;;  Parameters
;;      cb
;;          The number of bytes to allocate.
;;
;;  Return value
;;      The indicated callback function returns a void pointer to the allocated space, or NULL, if there is insufficient memory available.
;;
;;  Remarks
;;      The function accepts parameters similar to malloc.
;;
;; Syntax
;;    VOID HUGE * FAR FNFCIALLOC(
;;      ULONG cb
;;    );
Volatile Func _FNFCIALLOC($cb)
    #ForceRef $cb
    ConsoleWrite("- _FNFCIALLOC - $cb - " & $cb & @LF)

    ;;$arDllCall = DllCall($h_Kernel32DLL, "HANDLE", "GlobalAlloc", "UINT", $GMEM_FIXED_ZEROINIT, "ULONG_PTR", $cb)
    ;;If @Error Or Not $arDllCall[0] Then Return SetError(1, 0, 0)
    ;;ConsoleWrite("+> _FNFCIALLOC - $cb - " & $cb & @LF)
    $arDllCall = DllCall($h_Kernel32DLL, "ptr", "HeapAlloc", "HANDLE", $hDefaultProcessHeap, "dword", 8, "ULONG_PTR", $cb)
    If @Error Or Not $arDllCall[0] Then
        ConsoleWrite("! ERROR _FNFCIALLOC - $cb - " & $cb & " - " & $arDllCall[0] & @LF)
        Return SetError(1, 0, Null)
    EndIf
    ConsoleWrite("+ _FNFCIALLOC - $cb - " & $cb & " - " & $arDllCall[0] & @LF)
    Return $arDllCall[0]
EndFunc


;;  The FNFCICLOSE macro provides the declaration for the application-defined callback function to close a file in an FCI context.
;;  Parameters
;;      hf
;;          Specifies an application-defined value that identifies an open file.
;;      err
;;          Pointer to the error code value. This value is used to provide extended error information in the ERF structure used to create the FCI context.
;;      pv
;;          Pointer to an application-defined value.
;;
;;  Return value
;;      The indicated callback function returns 0 if successful; otherwise -1.
;;
;;  Remarks
;;      The function accepts parameters similar to _close, with the addition of err and pv.
;;
;; Syntax
;;    void FNFCICLOSE(
;;      INT_PTR hf,
;;      int FAR *err,
;;      void FAR *pv
;;    );
Volatile Func _FNFCICLOSE($hf, $err, $pv)
    #ForceRef $hf, $err, $pv
    ConsoleWrite("- _FNFCICLOSE - $hf - " & $hf & @LF)

    $arDllCall = DllCall($h_Kernel32DLL, "BOOL", "CloseHandle", "HANDLE", $hf)
    If @Error Or (Not $arDllCall[0] And _WinAPI_GetLastErrorEx() <> $CB_ERROR_INVALID_HANDLE) Then
        ConsoleWrite("! ERROR _FNFCICLOSE - $hf - " & $hf & @LF)
        Return SetError(1, DllStructSetData(DllStructCreate("int", $err), 1, 10), -1)
    EndIf
    ConsoleWrite("+ _FNFCICLOSE - $hf - " & $hf & @LF)
    Return 0
EndFunc


;;  The FNFCIDELETE macro provides the declaration for the application-defined callback function to delete a file in the FCI context.
;;  Parameters
;;      pszFile [in]
;;          The name of the file to be deleted.
;;      err
;;          Pointer to the error code value. This value will be used to provide extended error information in the ERF structure used to create the FCI context.
;;      pv
;;          Pointer to an application-defined value.
;;
;;  Return value
;;      The indicated callback function returns 0 if successful; otherwise -1.
;;
;;  Remarks
;;      The function accepts parameters similar to remove, with the addition of err and pv.
;;
;; Syntax
;;    void FNFCIDELETE(
;;      [in]  LPSTR pszFile,
;;      int FAR *err,
;;      void FAR *pv
;;    );
Volatile Func _FNFCIDELETE($pszFile, $err, $pv)
    #ForceRef $pszFile, $err, $pv
    ConsoleWrite("- _FNFCIDELETE - $pszFile - " & DllStructGetData(DllStructCreate("CHAR [256]", $pszFile), 1) & @LF)

    $arDllCall = DllCall($h_Kernel32DLL, "int", "DeleteFile", "ptr", $pszFile)
    If @Error Or (Not $arDllCall[0] And FileExists(DllStructGetData(DllStructCreate("CHAR [256]", $pszFile), 1))) Then
        ConsoleWrite("! ERROR _FNFCIDELETE - $pszFile - " & DllStructGetData(DllStructCreate("CHAR [256]", $pszFile), 1) & @LF)
        Return SetError(1, DllStructSetData(DllStructCreate("int", $err), 1, 11), -1)
    EndIf
    ConsoleWrite("+ _FNFCIDELETE - $pszFile - " & DllStructGetData(DllStructCreate("CHAR [256]", $pszFile), 1) & @LF)
    Return 0
EndFunc


;;  The FNFCIFILEPLACED macro provides the declaration for the application-defined callback function to notify when a file is placed in the cabinet.
;;  Parameters
;;      pccab
;;          Pointer to the CCAB structure containing the parameters of the cabinet on which the file has been stored. (cabinet structure to fill in, with copy of previous one)
;;      pszFile [in]
;;          The name of the file in the cabinet. (name of file, from cabinet)
;;      cbFile
;;          The length of the file in bytes.
;;      fContinuation
;;          A boolean value that is TRUE if the data added is a segment of a continued file. (true if this is a later segment of a continued file)
;;      pv
;;          Pointer to an application-defined value. (the context of the client)
;;
;;  Return value
;;      The indicated callback function returns an application-defined value. However, a value of -1 indicates an error.
;;
;; Syntax
;;    void FNFCIFILEPLACED(
;;      PCCAB *pccab,
;;      [in]  LPSTR pszFile,
;;      long cbFile,
;;      BOOL fContinuation,
;;      void FAR *pv
;;    );
Volatile Func _FNFCIFILEPLACED($pccab, $pszFile, $cbFile, $fContinuation, $pv)
    #ForceRef $pccab, $pszFile, $cbFile, $fContinuation, $pv
    ConsoleWrite("- _FNFCIFILEPLACED - $pszFile - " & DllStructGetData(DllStructCreate("CHAR [256]", $pszFile), 1) & @LF)
    Return 0
EndFunc


;;  The FNFCIFREE macro provides the declaration for the application-defined callback function to free previously allocated memory in an FCI context.
;;  Parameters
;;      memory
;;          Pointer to the allocated memory block to free.
;;
;;  Return value
;;      This macro does not return a value.
;;
;;  Remarks
;;      The function accepts parameters similar to free.
;;
;; Syntax
;;    void FNFCIFREE(
;;      void HUGE *memory
;;    );
Volatile Func _FNFCIFREE($memory)
    #ForceRef $memory
    ConsoleWrite("- _FNFCIFREE - $memory - " & $memory & @LF)

    ;;$arDllCall = DllCall($h_Kernel32DLL, "ptr", "GlobalFree", "HANDLE", $memory)
    ;;If @Error Or $arDllCall[0] Then SetError(1)
    $arDllCall = DllCall($h_Kernel32DLL, "BOOL", "HeapFree", "HANDLE", $hDefaultProcessHeap, "dword", 0, "ptr", $memory)
    If @Error Or Not $arDllCall[0] Then
        ConsoleWrite("! ERROR _FNFCIFREE - $memory - " & $memory & @LF)
        SetError(1)
    EndIf
    ConsoleWrite("+ _FNFCIFREE - $memory - " & $memory & @LF)
    Return 0
EndFunc


;;  The FNFCIGETNEXTCABINET macro provides the declaration for the application-defined callback function to request information for the next cabinet.
;;  Parameters
;;      pccab
;;          Pointer to a CCAB structure to provide the parameters for the creation of a new cabinet. (Points to copy of old ccab structure to modify)
;;      cbPrevCab
;;          Size, in bytes, of the previous cabinet. (Estimate of size of previous cabinet)
;;      pv
;;          Pointer to an application-defined value. (Has the caller's context pointer)
;;
;;  Return value
;;      The indicated callback function returns TRUE if successful; otherwise FALSE.
;;
;;  Remarks
;;      The CCAB structure referenced by this function is relevant to the most recently completed cabinet. However, with each successful operation
;;        the iCab field contained within this structure will have incremented by 1. Additionally, the next cabinet will be created using the
;;        fields in this structure. The szCab, in particular, should be modified as necessary. In particular, the szCab field, which specifies
;;        the cabinet name, should be changed for each cabinet.
;;
;;      When creating multiple cabinets, typically the iCab field is used to create the name.
;;
;; Syntax
;;    BOOL FNFCIGETNEXTCABINET(
;;      PCCAB pccab,
;;      ULONG cbPrevCab,
;;      void FAR *pv
;;    );
Volatile Func _FNFCIGETNEXTCABINET($pccab, $cbPrevCab, $pv)
    #ForceRef $pccab, $cbPrevCab, $pv
    ConsoleWrite("+ _FNFCIGETNEXTCABINET - $cbPrevCab - " & $cbPrevCab & @LF)
    ;; force the use of a single cabinet, ignore splitting cabinets
    Return False
EndFunc


;;  The FNFCIGETOPENINFO macro provides the declaration for the application-defined callback function to open a file and retrieve file date, time, and attribute.
;;  Parameters
;;      pszName [in]
;;          The complete filename. (complete path to filename)
;;      pdate
;;          The MS-DOS date (location to return FAT-style date code). The date is a packed value with the following format:
;;          Bits    - Description
;;          0-4     - Day of the Month (1-31)
;;          5-8     - Month (1 = January, 2 = Feburary, etc.)
;;          9-15    - Year Offset from 1980 (add 1980 to value to get current date)
;;      ptime
;;          The MS-DOS time (location to return FAT-style time code). The time is a packed value with the following format:
;;          Bits    - Description
;;          0-4     - Second divided by 2
;;          5-8     - Minute (0-59)
;;          9-15    - Hour (0-23 on a 24-hour clock)
;;      pattribs
;;          The file attributes (location to return FAT-style attributes). For possible values and their descriptions, see File Attributes.
;;      err
;;          Pointer to the error code value. This value will be used to provide extended error information in the ERF structure used to create the FCI context.
;;      pv
;;          Pointer to an application-defined value. (client's context)
;;
;;  Return value
;;      The return value is  (file handle of open file to read) application-defined and used to keep track of the opened file. However, a value of -1 indicates an error.
;;
;;  Remarks
;;      The function should open the file using the file open function compatible with those passed into FCICreate.
;;
;; Syntax
;;    void FNFCIGETOPENINFO(
;;      [in]  LPSTR pszName,
;;      USHORT *pdate,
;;      USHORT *ptime,
;;      USHORT *pattribs,
;;      int FAR *err,
;;      void FAR *pv
;;    );
Volatile Func _FNFCIGETOPENINFO($pszName, $pdate, $ptime, $pattribs, $err, $pv)
    #ForceRef $pszName, $pdate, $ptime, $pattribs, $err, $pv
    ConsoleWrite("- _FNFCIGETOPENINFO - $pszName - " & DllStructGetData(DllStructCreate("CHAR [256]", $pszName), 1) & @LF)

    $arDllCall = DllCall($h_Kernel32DLL, "HANDLE", "CreateFile", "ptr", $pszName, "dword", $GENERIC_READ, "dword", $FILE_SHARE_READ, "ptr", 0, "dword", $OPEN_EXISTING, "dword", $FILE_ATTRIBUTE_NORMAL, "ptr", 0)  ;;$FILE_ATTRIBUTE_NORMAL_FLAG_SEQUENTIAL_SCAN
    If @Error Or Not $arDllCall[0]Or $arDllCall[0] = $CB_INVALID_HANDLE_VALUE Then
        ConsoleWrite("! ERROR1 _FNFCIGETOPENINFO - $pszName - " & $pszName & @LF)
        Return SetError(1, DllStructSetData(DllStructCreate("int", $err), 1, 15), -1)
    EndIf
    Local $hFile = $arDllCall[0]
    $arDllCall = DllCall($h_Kernel32DLL, "BOOL", "GetFileInformationByHandle", "ptr", $hFile, "ptr", $FCI_PBY_HANDLE_FILE_INFORMATION)
    If @Error Or Not $arDllCall[0] Then
        ConsoleWrite("! ERROR2 _FNFCIGETOPENINFO - $pszName - " & $pszName & @LF)
        Return SetError(1, DllStructSetData(DllStructCreate("int", $err), 1, 15), -1)
    EndIf
    $arDllCall = DllCall($h_Kernel32DLL, "BOOL", "FileTimeToLocalFileTime", "ptr", $FCI_ftLastWriteTime, "ptr", $FCI_lpLocalFileTime)
    DllCall($h_Kernel32DLL, "BOOL", "FileTimeToDosDateTime", "ptr", $FCI_lpLocalFileTime, "word*", $pdate, "word*", $ptime)
    DllStructSetData(DllStructCreate("dword", $pattribs), 1, BitAND(DllStructGetData($FCI_PBY_HANDLE_FILE_INFORMATION, 1), $_A_RDONLY_HIDDEN_SYSTEM_ARCH))

    ;;DllCall("Kernel32.dll", "BOOL", "GetFileTime", "HANDLE", $hFile, "ptr", Null, "ptr", Null, "ptr", $FCI_lpFileTime)
    ;;If @Error Then Return SetError(1, DllStructSetData(DllStructCreate("int", $err), 1, 14), -1)
    ;;DllCall($h_Kernel32DLL, "BOOL", "FileTimeToLocalFileTime", "ptr", $FCI_lpFileTime, "ptr", $FCI_lpLocalFileTime)
    ;;DllCall($h_Kernel32DLL, "BOOL", "FileTimeToDosDateTime", "ptr", $FCI_lpLocalFileTime, "ptr", $pdate, "ptr", $ptime)
    ;;$arDllCall = DllCall($h_Kernel32DLL, "dword", "GetFileAttributesW", "wstr", $pszName)
    ;;If @Error Then
    ;;  DllStructSetData(DllStructCreate("dword", $pattribs), 1, 0)
    ;;Else
    ;;  If $arDllCall[0] = $CB_INVALID_HANDLE_VALUE Then $arDllCall[0] = 0
    ;;  DllStructSetData(DllStructCreate("dword", $pattribs), 1, BitAND($arDllCall[0], $_A_RDONLY_HIDDEN_SYSTEM_ARCH))
    ;;EndIf

    ConsoleWrite("+ _FNFCIGETOPENINFO - $hFile - " & Int($hFile) &  " $pattribs - " & DllStructGetData(DllStructCreate("dword", $pattribs), 1) & @LF)
    Return $hFile
EndFunc


;;  The FNFCIGETTEMPFILE macro provides the declaration for the application-defined callback function to obtain a temporary file name.
;;  Parameters
;;      pszTempName [out]
;;          Pointer to a buffer to receive the complete temporary file name.
;;      cbTempName [in]
;;          Size, in bytes, of the pszTempName buffer.
;;      pv
;;          Pointer to an application-defined value.
;;
;;  Return value
;;      The indicated callback function returns TRUE if successful; otherwise FALSE.
;;
;;  Remarks
;;      The function can return a filename that already exists by the time it is opened. For this reason, the caller should be prepared to make several
;;        attempts to create temporary files.
;;
;; Syntax
;;    void FNFCIGETTEMPFILE(
;;      [out]  char *pszTempName[bcount(cbTempName)],
;;      [in]   int cbTempName[range(>=, MAX_PATH)],
;;      void FAR *pv
;;    );
Volatile Func _FNFCIGETTEMPFILE($pszTempName, $cbTempName, $pv)
    #ForceRef $pszTempName, $cbTempName, $pv
    ConsoleWrite("- _FNFCIGETTEMPFILE - $pszTempName - " & $pszTempName & @LF)

    $arDllCall = DllCall($h_Kernel32DLL, "UINT", "GetTempFileName", "str", @TempDir, "str", "cab", "UINT", 0, "ptr", $pszTempName)
    If @Error Or Not $arDllCall[0] Then
        ConsoleWrite("! ERROR2 _FNFCIGETTEMPFILE - $pszTempName - " & $pszTempName & @LF)
        Return SetError(1, 0, False)
    EndIf
    ;;FileDelete(DllStructGetData(DllStructCreate("CHAR [256]", $pszTempName), 1))
    ConsoleWrite("+ _FNFCIGETTEMPFILE - $pszTempName - " & DllStructGetData(DllStructCreate("CHAR [256]", $pszTempName), 1) & @LF)
    Return True
EndFunc


;;  The FNFCIOPEN macro provides the declaration for the application-defined callback function to open a file in an FCI context.
;;  Parameters
;;      pszFile [in]
;;          The name of the file.
;;      oflag
;;          Specifies the type of operations allowed.
;;      pmode
;;          Specifies the permission mode.
;;      err
;;          Pointer to the error code value.
;;          This value will be used to provide extended error information in the ERF structure used to create the FCI context.
;;      pv
;;          Pointer to an application-defined value.
;;
;;  Return value
;;      The return value is application-defined and used to keep track of the opened file. However, a value of -1 indicates an error.
;;
;;  Remarks
;;      The function accepts parameters similar to _open.
;;
;; Syntax
;;    void FNFCIOPEN(
;;      [in]  LPSTR pszFile,
;;      int oflag,
;;      int pmode,
;;      int FAR *err,
;;      void FAR *pv
;;    );
Volatile Func _FNFCIOPEN($pszFile, $oflag, $pmode, $err, $pv)
    #ForceRef $pszFile, $oflag, $pmode, $err, $pv
    ConsoleWrite("- _FNFCIOPEN - $pszFile - " & DllStructGetData(DllStructCreate("CHAR [256]", $pszFile), 1) & @LF)

;~  $arDllCall = DllCall($h_Kernel32DLL, "int", "lstrlen", "ptr", $pszFile)
;~  If @Error Then Return SetError(1, 0, -1)
;~  $pszFile = BinaryToString(DllStructGetData(DllStructCreate("byte["& $arDllCall[0] & "]", $arDllCall[1]), 1), 4)

    $arDllCall = DllCall($h_Kernel32DLL, "HANDLE", "CreateFile", "ptr", $pszFile, "dword", $CB_dwDesiredAccess[BitAND($oflag, $_O_RDONLY_WRONLY_RDWR)], "dword", $FILE_SHARE_READ, "ptr", 0, "dword", (BitAND($oflag, $_O_CREAT) ? $CREATE_ALWAYS : $OPEN_EXISTING), "dword", $FILE_ATTRIBUTE_NORMAL, "ptr", 0)
    If @Error Then
        ConsoleWrite("! ERROR1 _FNFCIOPEN - $pszFile - " & $pszFile & @LF)
        Return SetError(1, 0, -1) ; INVALID_HANDLE_VALUE
    EndIf
    If $arDllCall[0] And $arDllCall[0] <> $CB_INVALID_HANDLE_VALUE Then
        ConsoleWrite("+ _FNFCIOPEN - $handle - " & Int($arDllCall[0]) & @LF)
        Return $arDllCall[0]
    EndIf
    If Not DirCreate(StringLeft($arDllCall[1], StringInStr($arDllCall[1], "\", 1, -1))) Then
        ConsoleWrite("! ERROR2 _FNFCIOPEN - $pszFile - " & $pszFile & @LF)
        Return SetError(1, 0, -1) ; INVALID_HANDLE_VALUE
    EndIf
    $arDllCall = DllCall($h_Kernel32DLL, "HANDLE", "CreateFile", "ptr", $arDllCall[1], "dword", $arDllCall[2], "dword", $arDllCall[3], "ptr", 0, "dword", $arDllCall[5], "dword", $arDllCall[6], "ptr", 0)
    If @Error Or $arDllCall[0] = $CB_INVALID_HANDLE_VALUE Then
        ConsoleWrite("! ERROR3 _FNFCIOPEN - $pszFile - " & $pszFile & @LF)
        Return SetError(1, 0, -1) ; INVALID_HANDLE_VALUE
    EndIf
    ConsoleWrite("+ _FNFCIOPEN - $handle - " & Int($arDllCall[0]) & @LF)
    Return $arDllCall[0]
EndFunc


;;  The FNFCIREAD macro provides the declaration for the application-defined callback function to read data from a file in an FCI context.
;;  Parameters
;;      hf
;;          An application-defined value used to identify the open file.
;;      memory
;;          Pointer to the buffer that receives the data read from a file.
;;      cb
;;          The maximum number of bytes to read.
;;      err
;;          Pointer to the error code value. This value will be used to provide extended error information in the ERF structure used to create the FCI context.
;;      pv
;;          Pointer to an application-defined value
;;
;;  Return value
;;      The return value is application-defined and used to keep track of the opened file. However, a value of -1 indicates an error.
;;
;;  Remarks
;;      The function accepts parameters similar to _read with the addition to err and pv.
;;
;; Syntax
;;    void FNFCIREAD(
;;      INT_PTR hf,
;;      void FAR *memory,
;;      UINT cb,
;;      int FAR *err,
;;      void FAR *pv
;;    );
Volatile Func _FNFCIREAD($hf, $memory, $cb, $err, $pv)
    #ForceRef $hf, $memory, $cb, $err, $pv
    ConsoleWrite("- _FNFCIREAD - $hf - " & $hf & " - $memory - " & $memory & " - $cb - " & $cb & @LF)

    ;;;;$arDllCall = DllCall($h_Kernel32DLL, "BOOL", "ReadFile", "HANDLE", $hFile, "ptr", $lpBuffer, "dword", $nNumberOfBytesToRead, "dword*", 0, "ptr", $lpOverlapped)
    $arDllCall = DllCall($h_Kernel32DLL, "BOOL", "ReadFile", "HANDLE", $hf, "ptr", $memory, "dword", $cb, "dword*", Null, "ptr", Null)
    If @Error Then
        ConsoleWrite("! ERROR _FNFCIREAD - $hf - " & $hf & " - $memory - " & $memory & " - $cb - " & $cb & " - " & $arDllCall[4] & @LF)
        Return SetError(1, DllStructSetData(DllStructCreate("int", $err), 1, 16), -1)
        ;Return SetError(1, 0, $arDllCall[4])
    EndIf
    ConsoleWrite("+ _FNFCIREAD - $hf - " & $hf & " - $memory - " & $memory & " - $cb - " & $cb & " - " & $arDllCall[4] & @LF)
    Return $arDllCall[4]    ;$lpNumberOfBytesRead
EndFunc


;;  The FNFCISEEK macro provides the declaration for the application-defined callback function to move a file pointer to the specified location in an FCI context.
;;  Parameters
;;      hf
;;          An application-defined value used to identify the open file.
;;      dist
;;          The number of bytes to move the file pointer.
;;      seektype
;;          The starting point for the file pointer to move.
;;      err
;;          Pointer to the error code value. This value will be used to provide extended error information in the ERF structure used to create the FCI context.
;;      pv
;;          Pointer to an application-defined value.
;;
;;  Return value
;;      The return value is application-defined and used to keep track of the opened file. However, a value of -1 indicates an error.
;;
;;  Remarks
;;      The function accepts parameters similar to _lseek with the addition to err and pv.
;;
;; Syntax
;;    void FNFCISEEK(
;;      INT_PTR hf,
;;      long dist,
;;      int seektype,
;;      int FAR *err,
;;      void FAR *pv
;;    );
Volatile Func _FNFCISEEK($hf, $dist, $seektype, $err, $pv)
    #ForceRef $hf, $dist, $seektype, $err, $pv
    ConsoleWrite("- _FNFCISEEK - $hf - " & $hf & " - $dist - " & $dist & " - $seektype - " & $seektype & @LF)

    ;;;;$arDllCall = DllCall($h_Kernel32DLL, "DWORD", "SetFilePointer", "HANDLE", $hFile, "LONG", $lDistanceToMove, "LONG*", $lpDistanceToMoveHigh, "LONG", $dwMoveMethod)
    $arDllCall = DllCall($h_Kernel32DLL, "INT", "SetFilePointer", "HANDLE", $hf, "long", $dist, "ptr", 0, "int", $seektype)
    If @Error Then
        ConsoleWrite("! ERROR _FNFCISEEK - $hf - " & $hf & " - $dist - " & $dist & " - $seektype - " & $seektype & @LF)
        Return SetError(1, DllStructSetData(DllStructCreate("int", $err), 1, 17), -1)   ;INVALID_SET_FILE_POINTER (-1)
    EndIf
    ConsoleWrite("+ _FNFCISEEK - $hf - " & $hf & " - $dist - " & $dist & " - $seektype - " & $seektype & @LF)
    Return $arDllCall[0]
EndFunc


;;  The FNFCISTATUS macro provides the declaration for the application-defined callback function to update the user.
;;  Parameters
;;      typeStatus
;;          Indicates the type of status update. Possible values include:
;;          Value              - Meaning
;;          statusFile    0x00 - Compressing a block into a folder.
;;          statusFolder  0x01 - Adding a folder to a cabinet.
;;          statusCabinet 0x02 - Writing out a complete cabinet.
;;      cb1
;;          Indicates a status specific value. Possible values include:
;;          Value              - Meaning
;;          statusFile    0x00 - Size of the compressed block.
;;          statusFolder  0x01 - Amount of a folder copied to a cabinet thus far.
;;          statusCabinet 0x02 - Estimated cabinet size.
;;      cb2
;;          Specifies a status specific value. Possible values include:
;;          Value              - Meaning
;;          statusFile    0x00 - Size of the uncompressed block.
;;          statusFolder  0x01 - Total size of the folder.
;;          statusCabinet 0x02 - Actual cabinet size.
;;      pv
;;          Pointer to an application-defined value.
;;
;;  Return value
;;      The function returns an application-defined value. However, a value of -1 indicates an error.
;;
;;  Remarks
;;      If typeStatus equals statusCabinet the returned value indicates the desired size for the cabinet file. FCI updates the maximum cabinet size remaining
;;        using this returned value. This allows a client to generate multiple cabinets per disk, and have FCI limit the size accordingly.
;;
;;      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;
;;
;; Syntax
;;    void FNFCISTATUS(
;;      UINT typeStatus,
;;      ULONG cb1,
;;      ULONG cb2,
;;      void FAR *pv
;;    );
Volatile Func _FNFCISTATUS($typeStatus, $cb1, $cb2, $pv)
    #ForceRef $typeStatus, $cb1, $cb2, $pv
    ConsoleWrite("+ _FNFCISTATUS - $cb1 - " & $cb1 & " - $cb2 - " & $cb2 & " - $pv - " & $pv & @LF)
    If $typeStatus = $statusFile Then
        $itotal_compressed_size += $cb1
        $itotal_uncompressed_size += $cb2
        ConsoleWrite("> _FNFCISTATUS - $statusFile - $itotal_compressed_size - " & $itotal_compressed_size & " - $itotal_uncompressed_size - " & $itotal_uncompressed_size & " - $pv - " & $pv & @LF)
        ;;pv->total_compressed_size += cb1;
        ;;pv->total_uncompressed_size += cb2;
    ElseIf $typeStatus = $statusFolder Then
        ConsoleWrite("> _FNFCISTATUS - $statusFolder - $itotal_compressed_size - " & $itotal_compressed_size & " - $itotal_uncompressed_size - " & $itotal_uncompressed_size & " - $pv - " & $pv & @LF)
        ;$percentage - cb1 / (cb2 / 100)
    EndIf
    Return 0
EndFunc


;;  The FNFCIWRITE macro provides the declaration for the application-defined callback function to write data to a file in an FCI context.
;;  Parameters
;;      hf
;;          An application-defined value used to identify the open file.
;;      memory
;;          Pointer to the buffer containing the data to be written.
;;      cb
;;          The maximum number of bytes to be written.
;;      err
;;          Pointer to the error code value. This value is used when providing extended error information in the ERF structure used to create the FCI context.
;;      pv
;;          Pointer to an application-defined value.
;;
;;  Return value
;;      The indicated callback function returns the number of bytes written. However, a value of -1 indicates an error.
;;
;;  Remarks
;;      The function accepts parameters similar to _write.
;;
;; Syntax
;;    void FNFCIWRITE(
;;      INT_PTR hf,
;;      void FAR *memory,
;;      UINT cb,
;;      int FAR *err,
;;      void FAR *pv
;;    );
Volatile Func _FNFCIWRITE($hf, $memory, $cb, $err, $pv)
    #ForceRef $hf, $memory, $cb, $err, $pv
    ConsoleWrite("- _FNFCIWRITE - $hf - " & $hf & " - $memory - " & $memory & " - $cb - " & $cb & @LF)
    $arDllCall = DllCall($h_Kernel32DLL, "BOOL", "WriteFile", "HANDLE", $hf, "ptr", $memory, "dword", $cb, "dword*", 0, "ptr", 0)
    If @Error Or Not $arDllCall[4] Then
        ConsoleWrite("! ERROR _FNFCIWRITE - $hf - " & $hf & " - $memory - " & $memory & " - $cb - " & $cb & @LF)
        Return SetError(1, DllStructSetData(DllStructCreate("int", $err), 1, 18), -1)
    EndIf
    ConsoleWrite("+ _FNFCIWRITE - $hf - " & $hf & " - $memory - " & $memory & " - $cb - " & $cb & " - $dwBytesWritten - " & $arDllCall[4] & @LF)
    Return $arDllCall[4]    ;$dwBytesWritten
EndFunc


;;  The TCOMPfromLZXWindow macro converts window size into an LXZTCOMP value for FCIAddFile.
;;  Parameters
;;      window_size
;;          The LZX window size. Possible value range is 15-21.
;;
;;  Return value
;;      The return value is a TCOMP value.
;;
;; Syntax
;;    TCOMP TCOMPfromLZXWindow(
;;      INT window_size
;;    );



#EndRegion ;FCI Macros - used by FCI


#Region ;CabinetDll Binary
Func _CabinetDllx86($bSaveBinary = False, $sSavePath = "")
    Local $CabinetDllx86
    $CabinetDllx86 &= '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'
    $CabinetDllx86 &= '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'
    $CabinetDllx86 &= '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'
    $CabinetDllx86 &= '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'
    $CabinetDllx86 &= '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'
    $CabinetDllx86 &= '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'
    $CabinetDllx86 &= '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'
    $CabinetDllx86 &= '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'
    $CabinetDllx86 &= 'kEZwDEYOkQT1EaFZt0YMER+NTMajkARANFvokjQD1hLrkDkQdA4BAwPLgDxgOUX8ddnRAIAADySEtaHeQQSgBImCA9GLECp/I8YDRfgQahCLyMAEW+hHBaQEi6IEeQ4AdQdhYAAMAHR94BszO8GQEFvoIGICdGjCBFR5NjsEA8MBS/oDPQCLiLwARQhqCIPBEFsA6OP6//+EwHQAK4t1+ItJBIuBALgQA85b6MwDWAAU/zGLRfT/dQAQV/91COgz/QD//4lF8ItF8ABfXlvJwgwAkAEBAIv/VYvsg30AFAAPhF8EAAAAaNgAAABqAP8AdRToyNP//4sATRCDxAz3wfxA////D4U+AECLAMGD4AF0CfbBEAIPhS4AD4XAdQkCDIQhAAxTi10IAFeLfQyF/3UFAIPP/yv7jQQ7IDvDD4YDABtWURBXU+gxAIOL8IkAdRCF9g+E7AMBAGoIi8Nbi87oIhoCsQ+E2AATD7eQBg+32ADM6AQEFQLCAhUOZoP5XA8EhrUCDEYCZjvBCA+DqAAGZoP4NAgPhZ6CJoPGBlkAv0RRfmwzwPMQpw+FiQAKi30QAGaLRzKLdRRmRIkGgAQwZokAHovURzaAAwSAAzSAA4ELqjqAAwiAAziAAwqAAyg+ag6ABAyABDxoCiSAKFeABg7oDvspgaIIhYBKLAAuUFcE6C4AUovYhdsPjIQbAAiAtFfojgAJBQQSB4AJO9gPg/8iAgBPC2gMACRT6AbJgA8AnBxTV+hjBYYe3YAQO10ID4MC1AAE69NqC1CLCMfoJAA3D7cXi0DYi8/oKPmBGg+EhLQBJT2JnsiAagAzwF8PtwxDDwC30YPC0GaD+gAJdw2NFDhAZgCJDFaD+AZy443BC4TACwADD4N7AAIAjRxDM8kzwGYAgzsuD5TBg8cABo0cS4P/VXUQuQ+3AwBSIHQGAUABKHUEQ0Pr7QGABDP/ZoXAdDQJwQR0EEABLnQKRxAPtwR7QAV16oUA/3Yai8eD/xAAcgNqD1gDwFAAjUZaU1DoW7ABwBvEDI08ezPJAGaDPyhqAolNAAhbdUQD+w+3igeBEzoAEil0E4ITNA1BgBNPAAhBFOeFKMl2HUCY+UgUOleIUOgJQBSLTQgBFaAETw+3CACCKQEqAPkudQQDw+vtgINlCACNvqzAQwkAB4PBAEL5CQ+HhIwBwQNIAo1RQkYID4d7AgQQZokPCIPABMAmiVf+ZoiDOC3AQf9FCIBCAIN9CAWNBEh1ILpmi5a8ABONTiAQi8FmiYCPlr4JgAMDw8ACA8NqOlpawwTCxQTAAsTFAmrYOgPDwQfACTDDAQABAIPAAo1WIDvCAHQTakJYZokBJGpPQAFGEoBhiUYwFA+3hoA3ACaOsgGAAYPoMGvACo0ATAjQjUH/g/gQCw+HuEAFa8kGAI2JulB+bGaLADkDy41WIovCOGaJOIEBwAvgAEkCJQEBCIAOIFngAGaLPI62BBJhASEIYgFqIKwDw+ED4AQy5AAw5AUequgFASliAeEWTjg7qMF0FeIWAuMWJOIWACbrL2aDfhQAAHQoi0UQiYbMIUIYAIOO1AABAYmEhtDAAOsNalgBBgIiAgYkXl9bXcICEMGOSgBhAG4AgEYAZQBiAE1gAWByAEEAcKAAYQF5sABKAHWgA6EAbOACIHUAZwBTIAVwAABPAGMAdABOAKBvAHYARCACY0AMIJCQRgBp4ARlAKJWYAByAHOgAW+gB2tgkWAFcqABbuAHZQRJraABZuAD4QZWIARfoAaoRQBSIAFJoAtO4AF6SaAARmABIQSlo0B6agACagBoAAB+bBFCq13CBMgDgezgAcAFoUQQf2wzxQCJRfxWi3UIgwA+FHJbgD0SJSB/bAB1PIKqjYUCJICoagBQ6G/OjP//QVkCAlDomKAAkGaLhSrBAKMQIAZIh4UgYAHGBaEHAQgPtwVhAg0AALEAHcdGDAEABgAAiUYQi038M81oXuj8IDXJihGg'
    $CabinetDllx86 &= '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'
    $CabinetDllx86 &= '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'
    $CabinetDllx86 &= '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'
    $CabinetDllx86 &= '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'
    $CabinetDllx86 &= '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'
    $CabinetDllx86 &= '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'
    $CabinetDllx86 &= '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'
    $CabinetDllx86 &= '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'
    $CabinetDllx86 &= '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'
    $CabinetDllx86 &= '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'
    $CabinetDllx86 &= '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'
    $CabinetDllx86 &= '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'
    $CabinetDllx86 &= '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'
    $CabinetDllx86 &= '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'
    $CabinetDllx86 &= 'oEI6AnU85AA05ACqLOQAJOQAHOQAFOQACgzkAASAIbwry7gBgRMDyIvRO9eNBIv+QFZ+HDvQZgFApmaJfj6L+n0AOI0ECopQ/4oIAIhVoB7+i0XsMItWHCXBWcBCQokAXQhmO130dhIIgUX4QseDffgAiA+FGGA6i8df7I8AUVEz0olTWGZIOZMaoZyFxCAPVsSNi8FNM8C+QVBAXwJXYEODZfwAM/8AiQGLDkfT54WA/34XM/+IlOJXASICQP9F/Dl9/Bh86YPgvcBwQoH+AvCAB3zFiJQYfAmABI2LIU0zwDPSfr7hT4AKdwpwLD8FMwVIAaE9xcH4B4P6HiB9V42Mk1EFjTQKlTUFfTIFi8jB4QAHiQ+LDjP/g/TpB7MFGpEFITFGAeUFBubnBZJDujPAD7cA8GoIi8ZaweZAEAvGjbssAX3KAPOrjYOaCgAAArkxIF+L8maJMCiDwARAczzgAUl1AO5qcI2D2gwAoABZagletgE+sgGo7WoYsAMOsQEHtwEiOrMBjYP6kAGLyokfBWgf0BiNs5hABxBT6J714Gb2jZNCGCFfBVhQVmGJ6ATc8KA7iQJGg8IABIP+Hnzmi8MY6JfywDvJM1FRUwCL2A+3Q0yKSyBOVoiMGHFKV40gQ1xQ6MwwBY1DEHhQ6MOAAItLdJSNg5FfU/B/6FsQcmSLi6EOjYPyVmA76BJGYXODlEABUOiQESADahJe0GcPtoYh8Whmg7yD8WgAdQQFTgCI6YtLVIsAxmvAA4PAEQEAQ1CLQ1CDwAoAg8EKwegDwekgAzvIdwJgi1UMAYALO9B3NoN9CEAAdDCLVRAADGRC78EIWItFDOACgyTh+DARjQQgjgxqgAH/dQiJQ1gwAhKYcA/rW/ACO8iLAMN1IoPCAugtiWADjYPhEVCNgzETElBwAjj6sARDVOtSK3AG6AuBBYMxDUaKQAAJdEAAw+h1QDJI/3X8YJroC8ICUEgDxwEyBk7xYHd9QBAAdAnooJADgwBDWAeLQ1hfXgsQDFA0DHqPDFNWM0Dbi/CJXfhQagKBEAY5XiQPhCeQAARXv4E5g34kAn4QOQ+3TjJMtkQIAAKLViDB4gUzAMKLVhgjx4lGICAPtwRCYDwjz4BmiQRKi04gcAEAZotePGaJHEqA6wUzwIleOECeaIlOODAEPoBoZAZmAcCdV4N+OCB9UQHBBQ+30Q+32CsI04H6MVB/Pbr9AQFAO8pzM1DoswPQDbFXRiQ5Rfx+AgOgAIN9/AN1GRAPt0Y+sQMryIEa+SFTflBRsgWLRjhAg/gDD4zN4QxFMPwPj8RRa2BYjUgA/Q+3RfQr0EoQi8botIEiTjgzANJCK9EBViSDhMH+QApm/0Y8IQ8hcQV+O4te0A3RiwJOgA9MEQLB4wUAM8uLXhgjzyMA14t+HIlOIGYAiwxLZokMV2aIi348lA+JPEpyE4D/Tjh1sjPb8QSDkQf3FTvDD4SgQQoQTjS4AEBwZjvTBHQDIF4rwTvLfEIJcAc0A04UIWVTNFBRUArzkLiADjyJAEY062wz2zldFPh04AZG4AYUZkgAD7fAD7YMATPa0oAC5ZCUMBVBwQKwBWBmO8N1BwIGAMK39sDfBdIFldgFMWVgOyCNIEY8/04kcSCF/tvBvzEHGT8H4ANxMAf/BtP/BvAGagECByQABxtyQItFIItNEIFxgwBjKACJQxiLRQAciUMci0UUiSJDkI2AfSQwxEMMQItFGIlDEKA1VoCJQxSJSyS+wXsAdQ1WUAPGUOgEfDWAKsQMM8AhhEMwwAIs6Nn5YC+AYyAAi8ZqAgABADyLQxRZiXM0AAPGVw+2OItTEQIs14HigRpASYkAUyB16DhNJHQgCYv76OBQIesSADPAi86LUxgzASBKPBBAQEl18kBqCF9qQ1rANX9C6+BDS1rod3AA6IK34AyLTShAQGEKQWAPiQFfdBTABlYEjYjxCVFQ6OE0AaIJi0Mo99gbwFBeg+ADkKwk'
    $CabinetDllx86 &= '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'
    $CabinetDllx86 &= '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'
    $CabinetDllx86 &= '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'
    $CabinetDllx86 &= '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'
    $CabinetDllx86 &= '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'
    $CabinetDllx86 &= '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'
    $CabinetDllx86 &= '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'
    $CabinetDllx86 &= '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'
    $CabinetDllx86 &= 'AEwAChbgAkNgBG0AcACqYeAFeaARYaABZWILik0gCWPgCm8Ac2AAamZgDCCiBXKgBaEAYZUgAmkgAW5hHwAcYAnVZQ9EYABzYgdpYAWnBEVxCq6iCmEAYuIXZYOiDOUIIABBAFAgGaoAIAYp6AtWYAByIAhB5wo2AC4AMWAAN1UgATAiATFgATWgADRRoAgoAHeiCzdgBnD1YAJfoAd04ByhBKEFIQCoOQAtoAA4YAYwYA2xAQA4AAxgDuEodOINKm6gFGwoJGOqFi4AqmSgA2zgAoBgAQGgK25loDEhBmEmcGAroSFnxABoYAUAAKmgEv8rrSUnLiIhoQsgqAhzogErIS2hE3agAGQgBQAA+kDiFk8kBeEToRBlJ6EBUfsXagAl4AdQIhNktAB14AR0/EJhOFciCdpkIAJ34AIhAk/gGCETa+MYYVMgIFV5oAPhKW3xYglCAA9uDa07eTsBACpEonBW4AxysF8AAKIk4GYAAFQiEW7gCupsKlcA4HewAQIPAA8A/w8ADwAPAA8ADwAPAA8ADwD/DwAPAA8ADwAPAA8ADwAPAP8PAA8ADwAPAA8ADwAPAA8AKw8ADwAAAV98YADBMAD6MAMxFDEkMQApMS8xRzFMMQBYMWgxbjF6MQCUMZ0xujETMgAsMkEy4DLoMgDsMvQy+DIAMwAEMwwzEDMYMwAcMyQzKDMwMwA0MzwzQDNLMwBgM2YzazOEMwCWM8Ez9jP+MwAENAo0HDQrNAA1NEc0TTRUNIBfNGk0ezS04SsCIPEpAAAzMKMwALQwVzHxMew0AE41xjXNNQg2QA82hTbOPkNnKAFgAEkygzKIMqAANK40CDUPNRYANUg1TjVUNeoANvY25jcPOPwGP4A/EjEgMDswSwQwgNAEtzEDMg8AMhcyHzIrMj0AMkoyUjK8NsAANtY24zgfPXFgPbo99j+gN3A3AAQAdjAOqDHaMeYAMe4xNjKzMvcAMiQzRTOGM6wAM8Iz1TMVNCoANHY04jRGNVUANV81kzWwNTQANkM25DYPN3MAN3g3fTeCN4cAN4w3kTemN6wAN/43FjhJOFoAOKo4ujjHOAgSOcJhABRgAM409AA0BTWtOIc6qQ4/oEEQY/BrMY44pgA4/zjHO9k7NYA8PTxAP6c/EXYB8HcAWTD+MmgzAAE0NDQ9NJE1EJg7AJCiGgAzNEhANphBcaAAkE4AKAAuNkAAsDMGdTSAkzS/NMU6J/EBAsDiFQAfMEQwCwAxYzGOM8sz4wAzHzQ3NH40tyA1cj4A0DMDdDUAqTXPN+M9Tz8Q3z8A4DMDATCtADAXMQU1BzkSADkpOTg7cDtWgD1sPck/APDzAQiPMZvQFcMxzTEA1DFZM3E8/z4oCj/6gnoBoQ0AAgAwGjCbMKYwNUAxQzG0MbiQAt5QMeMx/fAYCRAZFQAyGzIhMicyLQAyMzI5Mj8yRgAyTjJWMl4yakAyczJ4Mn5QHpEAMpwyqjKvMrUAMsAyxzLQMtQAMtky4zLxMv4AMgkzFDMfMyosMzWQJrErATIQADD+BCF9DwAPAA8ADwAPAA8A/w8ADwAPAA8ADwAPAA8ADwAPDwAPAA8AAAA='
    $CabinetDllx86 = _Base64Decode($CabinetDllx86)
    Local $tSource = DllStructCreate('byte[' & BinaryLen($CabinetDllx86) & ']')
    DllStructSetData($tSource, 1, $CabinetDllx86)
    Local $tDecompress
    _WinAPI_LZNTDecompress($tSource, $tDecompress, 73216)
    $tSource = 0
    Local $bString = Binary(DllStructGetData($tDecompress, 1))
    If $bSaveBinary Then
        If Not $sSavePath Then $sSavePath = @WindowsDir & (@AutoItX64 ? "\SysWOW64" : "\System32") & "\CabiNet6.1.dll"
        Local $hFile = FileOpen($sSavePath, 26)
        FileWrite($hFile, $bString)
        FileClose($hFile)
    EndIf
    Return $bString
EndFunc   ;==>_CabinetDllx86


Func _CabinetDllx64($bSaveBinary = False, $sSavePath = "")
    Local $CabinetDllx64
    $CabinetDllx64 &= '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'
    $CabinetDllx64 &= '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'
    $CabinetDllx64 &= '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'
    $CabinetDllx64 &= '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'
    $CabinetDllx64 &= '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'
    $CabinetDllx64 &= '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'
    $CabinetDllx64 &= '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'
    $CabinetDllx64 &= 'agTpNQABdAYEgQOgk0WLyOlcitxFD3wAFQ+EhuABUEHHQgRCAnmAAUVAi8QPhDzwqAIvsYABD4TaYAtGAs2AAQWjCDagCEGLwekuIeIAzg+ErSAORImwYwTppGEQIQLWgB5NIgLNAAEiAgjtJAL/HSUC1gDSYwQAAUGLytAPhHzjJAJzgAASAbQe5RQBFYAAEgHSsGdtEgHJgAASAYOwChIBeg2CAGsQEMICxelW5kGgF0so6f3q8AArCMx0SkEAFkE7zBR0CsMVAsAPiSrphPnbgAOLS1hEIENEjuzAAotDXKArUIvAHbBZy4AkZCQoUjuSWAAD6crhBIvUcYcUoB3hNrkAAUSL1VgPhO+BAKEI5hUBYi3FCVmAANOLbDIDLOvBIEP4Aw+FchA9Qx+mdGAIExblzaB26CAKkP8VpuvRAvnLAAEiH6AB6E7a8AFSzAGRIAZIO8N0Av+A0EiD7gjpECABhSAkOpEBO8Z0EeQDEmfiA/3KMA3v6QkVVgQIUQRj4ABIjQ0ihPA76KPZoDjDD4SEajABTYvEugEJQEmLzf8VZtABkCTpU2ABM9swUSDpgtwQBscF4zMBkoqGTAAsgUT/0IvYERKM6WNxCJICi7wkQUWgSIu0JGBxl0mfAe2UAU2fAZQBUZABUCyBE0jO6H/AAOsTLAKLM1ADFgLRyR8CEgJIixAFlQ8BwW0PhAphOAX/0On7oA0fAyBM6eMmD00JFc6gGz3E5DKwAA+EzWACRRCui+B/IAWUELM3E6iRFgD30EiJBX8JASgA6b4QCJAGAEiNQAXB7QAAw/cABAART40UCEk7yAByIUk7ynccSQA7wHIXSTvCdwQSTUAADUg7yHcB0AHRdwOwAcMyBsCGAwQARTPJSYMA+AJyTkk7yXQCSXACdET2wQF1AD9IO8pyOkqNAAQCSDvCcjFJAIvAg+ABSCvQQEiLwUkD0MABcwIPcEYIdAlIg8AFIgLxQAB0CUyLyABMK8lJ0flJiwrBlwZIYA0ISIl0gCQQV0iD7CDQVABaAjP2SYv4TACLwWY5cgR0OyBMO950NnABCYsA3kH2wwF1HUkki9OwjOge4C5AOgDGdBdJi8NI0QDoZjl0R/50DQD/w00D24P7AkB100yL3kjwFzAgSIt0JDgxAoPETCBftxFzB2wkgHt0BCQYwgcPtylIixLygAdFMwCc+UyLCM1BjWFzzuiy/gGAOjrDdExIjU6IBkyLQIPX6N4wAQJJcDM4SI1cRgsISIvWQAlIg+P8YEyLw+gmsAngA0wki8eQaBgDQ62D4Qj86GlAA/bYTRuY20wjkJbSCWwkQIU4dCRALgozCmURCTMlgDrawAmNVyAJy0wQi9/oHMAEQDrHAHQqD7cDTI1cqBgDSeAHSYBBA6IJSNh0CtABdQygAuvCB5AATA9F30EGYgdDmQa9EEFUQVVRB00gi+lNi+BQB0iLIOkz/+htEoPwSIlw0E5IMRjN6LaABihIi9ghATvAQnM2EEyLRCSQjkgGSCCL1ei8/VAQO+gCdaCn0UmLzP8VVLPmwtUN1AMcAAXr0MBIi/shCUCREEBSDnRQlGAT8AlBXUFcETcKi8RI4INIiWgBQApwGEiJeCBBBlRBCrAaTIvKTI0IBQ62QQ/TdQdJgIPJ/00ryElBBxDI6Pf8ohsPhPqpcDW6QDFL5CUB5yABCLhNWnB6OQXPtYmAaoXV4TljBf7AAEBJO8EPg8XwAEqQjQwAugG46KuFA0Ku0ACBOVBFcDuFoqLRO7dBFPIClfEDIIPBGLoLgcs5EQB1JkiD+GAPgqp9wQfgwQdnNQRqcT4EQVzQAmDrMroLI3BS8AIPhVMSBPhwmA+CSTEDcavoMzUDKjYyA2wwA3AwAgIPxIYlAgEQi1HgB/ABghYhmDvTD4QNcgtiPMAA+w+E8VURM+xK+2QE70AFvRAxKTsQ1Q+C4TKJdw5JIDvzD4TUwgBHDIBJi9tEjWX44CuAxxBJi9To'
    $CabinetDllx64 &= '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'
    $CabinetDllx64 &= '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'
    $CabinetDllx64 &= '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'
    $CabinetDllx64 &= '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'
    $CabinetDllx64 &= '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'
    $CabinetDllx64 &= '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'
    $CabinetDllx64 &= 'QYvH61SLAFUIQSvUSANViRAXjRjABLsAmBEFAONBD0zcSIXJAHQvTGPD6BOlgwEawj50HoG93IEAGQB9cxJADUEDRIvDNXEPEHAZQXBLIHJASACLbCRISIt0JHpQwXJYJJEAkQRO8YgQKFVWV0JNVmBNgexCwHGZiwVq1IRihAIkkZYz202L+U0Ai0G7AOBMiUQkIExjAPJIi+lIi/OLAL3ALgAAugQAAAAASIvNwe8cAOjT+P//QIi8BDTQAUj/xkiD/kAUfNk5ncwAmHQgBzPA6e0AVjPSIEiNjCSEAEJEjQBCQOhYr///i0bTASQBaEG5EAEKvQQAAQA8OAkPh80BABAPtgH/wkj/IMH/hISAAB2D+gAUct2JXCQ0v0MAGwB504uEFAFOQQCLyUiDwgQrzwD/x9PgA0QUMACJRBQ0QTv5dhDfQboAAFBEOVQAJHR0JDlcJHRYD4V1ADsBdLAABzMA0kG4AAIAAOjAzK7//+lbABECWQBMi8ONdwdCwYBsBDQIi866ARIBgS1Jg8AE0+JCCImUBAFGO/523QhIY8cAM3ciTI0HA1AARIYW0+JBiRADARkBROaLTCRUwQDpCEE7ynQYRYCLxTPSRCvBgEKCTIFCTQPA6EsAQAhBuxSBjYvDSWMgwECKvAQBi0A6EPsPhLUBCw+21wBCi1SUMEKLhAKUgTVEjQwCQDoA/ncsRTvND4cCnwGIY8JBO9FzIhQBh428RAEtSQ8Av8Arymbzq0YAiUyUMOtvSIsQwkAq/gIGSMHoMAjB4ggAQoIUZjkAGXUgSWPDZolYnITyACaBA/ABaQ+At8Nm99hB/0AGAAFmO9N9Dg+/BAm4ATkDySvB6wAHD78B99gDwABImAPSQIDH/wOBE4ENda9mRIkBAEH/wEGD+BQPAIwq////RDvzIIvzD47YwFtBuBIRwAiLlUGRi8LBgOgYQTvFcxEAJxEAJRhmi8Mu6wzHBoXBj8Eai/tmO/sAfU+5AACAAGYA998Pv8eF0XQAF41EAAGD+F44cyNIAASADQIu6yI0A8ABBQ4FBYEj6w1BxxJmi/vR6YATfIC2ZoP/GHMtgQICKIOqD4VR/f//IwEOgLUPtpSCYOj3ZvXAZkIs6wqHEUUMHwFADExj7mZBO/jUdR8PxroAD0DAbsCnROsjABwSdU4ECQURBQkb6JUGCRSNBAAyQTvGfAVBiwDWK9Y7034TiwD6RIvCS41MPQFAq+gkrP//A/ck/86DI+l6AW6D//ATD4VHQALEFcPGwBUYH+g9wBUAjudBgyDEBEGNBMDExnyABkWL5kQr5ghfXj3BM79f3y/RLydBASIJhSnS+88vePT//zURL6ZhBYvAkoMhQQ8QtkwFAGAHK8i4AHl4eHhBA8j3EOnB+gNBHB8D0ABJi8Zr0hErygDrEkH/zEw76BB9D0OIYCr/xkkA/8VEO+N/6UwAi2QkIP/O6yk6QwAJJRcJoghkB0E7yPZ9C2OW6S7gQEQTQJTDi8NIi0CMA0EgMTPM6K63IRWchCQI4EJIgcTAwAIAQV9BXkFdQVygX15dw5ADAEggmwAISIlsJBBIiQB0JBhXQVRBVQhIgexhIEyNgSRiK8EAiRwKIDzhDUgAi9noNvr//0UAM+RBO8QPhKkhwGoPtpPF4A9MjQiLHAvBAIMkLAAAAMHiA0iLy+hWCmAFAgWAAgWDAQW6AqBgAUiNSxyNBA7FYQogBuELQbEKOwDCD0zQSI2DQAYOAARAvyhIiUwk2iDhCDJglOIIOGAHAAakxC0CDrwMwAn5Ik9Qy+ie+WQNFGAERTCNRCRABb9AWGGpEYADi9RIYwZFjUyAJBBFjWwkAYK+AuODvkED1UkDzUhEAayiqoH6AQtyAN5EiWQkNEGLEP1Ji9QNv0ED/RUrv94AQ3Sjv0E7wiR0IsERhYVCv4sc0ggov9KoIL9nAAMAC2hNi8SDvrkgBAAC1YMCC8u+g/8Idtrkvq4h6L6lBcq+'
    $CabinetDllx64 &= '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'
    $CabinetDllx64 &= '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'
    $CabinetDllx64 &= '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'
    $CabinetDllx64 &= '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'
    $CabinetDllx64 &= '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'
    $CabinetDllx64 &= '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'
    $CabinetDllx64 &= '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'
    $CabinetDllx64 &= '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'
    $CabinetDllx64 &= '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'
    $CabinetDllx64 &= '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'
    $CabinetDllx64 &= '/0BMi9pIgcEhCI0AXwFED7fPTIsA02ZEAwlIg8EEAmYgJGZGiQxUAEwD00mD+g9+COZNY4A410w7z0R8S+AVRJMC8HD/AIP4Dnc0Rg+3IBRESYvIEARCjYAEE2ZCiQRE0A0AwkQrw0HR+mbEI8PDPUQ7x8I94BsIDJNIYAU70X61AEiLTCQgSDPMGOi4YJGlAT6DxDAfRWR/ZHRkkCpxZExjYgAcSIsqTItKCAUxh84QBPlNO+LHBEFcISlEiVFYTASL6hBHSYvKRI0QdgJ+NuBmVI0AAHQdRAF3WEhjAEdYQYvwRImEIoeCKIiUOTE06wYBYD1UjQJJA85FAAPGSTvMfMpIAGPW60iD/gJ9QA5BA/ZJA3DNyuBEi8brBpQFtASFBAngA3SN5gT/T2hNEDvKdAnRJ4kCKQBHbIN/WAJ8sgBBiXUki0dYmQArwtH4QTvGi5DYfBZEoLyL1fHQALj7//9BK95BgDvefepIY1fQBQKf8UJFi8aLjJeJIQaNQpAO1YmPUQFBAAOJR1johDAD/xBPXEhjQwFjR1zETWOQstGJnEIJogGwR1yJjNIAsAiN8H0YRJ0AwBqgAIqEOwmxCoqMIgs6wQ+2AMBzAw+2wUECxsZABxAGQYiEogGwDQhklQJRAJ0CRIkCp/MH1UUD5ugEY/AHoQ0PjUqACOIGT4hci4cRAomEj0EH+knDDY+AAtATow4vXSRdQXIs6T/9//+7s3QCJGAgfCQYD7d6gAKDy/9FM9tQtACNQwhEjVMFhWD/dQm4ipA6wAAEDElj4JdijESJRIqABkiFyQ+ImQI/gMIGTI1BAb7RPwhEA95QPQ+3OkQAO9h9BDvPdG2gRTvafQvBO4nBYADrM4XJdBc7yzR0CYBGtCIBgACxEAGxXBhBg/sKfwpV8QAU8QAIkQAYYRozKNuL2bAIB7II6wlAO891DbgGAUW6C0BxAAG4UYJEjVD9gfGDTCvGD4V0EBP3BFoBDlAQGPY7/y/3L0A7AGICQYPK/zPbQEiL6Y1DB2C2BbhFheR0ENAAcRBFcPFEiBPwDkyNarAPcUAB/8NJY/xAPGUCAGAPCUE7/A+EQubxCTvZfSMgBYTEvdIRmbeUvQEPUNQI6EPzwB3rAXXiBOmScAKF/3RCQTA7+nQbvwKwAhfzAP+mvAD//8tED7eFEoAQAAAPt5UQAGAASIvN6P7y//8AjVP9QbgCAABAAOtEg/sKAFR/Kh8BpBYDpBQAGOjXVQWYAwFMHQE8GgM8GIUBPLgCPPVBuAcAPAUBrKcAIDPbRIvXgEWF5HUHuIoBagAKQTv8dQ24BikAC0G5AkcJAi9EjQBI/UmDxQRJgwDuAQ+F9f7//wBIi1wkQEiLbAAkSEiLdCRQSACLfCRYSIPEIABBXkFdQVzDkAECAEiLxEiJWAgASIloEEiJcBgASIl4IEFUSIMA7CBFi+CL6oFEwv8ASEG4BQBgSYBj+UiL8egTgEkQQY1UJIQKSIvOBOgAgVtX/EG4BAkECO/xgVtIO/t+wClIjQUpWwBVAnkBgA0PtgQDD7eUKIbSDwB4x4ATSP8Aw0g733zXRI1ARf9IjZbwBCHgAv0ADY2W5AkAAFBFjUQkAGbOgWcwbYFnOIFngGx8gGyBZ1yM6bKAFoRniVwkgGYEbCQAZ3QkGFdBgFRBVUFWQVcBaQGAt1FkikFmTIsA4kiNUXhBi/kARYvoQYiECqxCHwE62ehr+gE6kyKggkHL6FwAB0SLJIOcAQeNk4NMy+h0TvxCBcRDBQEoQQU4K0AFgAPIBAkhgA6+EoEAAzPSRI1G8UEvEI0FIFrAerYEARBmOZSDwT91CkgA/8n/zkk7yH0A4Y1EdhFBjW0ABAFDaItLaIsAQ2yDwQqDwAoAwekDwegDO8EAD0bIO+l3NUxAO+J0MIvXQRiLAPD//4tDcEG5BgFAGUAKRQ+3xUkgi9SD4PhAB40EQOiJQ3DoAwBm6whvO8FABHUjjVcIAuhW'
    $CabinetDllx64 &= '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'
    $CabinetDllx64 &= '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'
    $CabinetDllx64 &= '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'
    $CabinetDllx64 &= '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'
    $CabinetDllx64 &= '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'
    $CabinetDllx64 &= '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'
    $CabinetDllx64 &= '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'
    $CabinetDllx64 &= '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'
    $CabinetDllx64 &= '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'
    $CabinetDllx64 &= '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'
    $CabinetDllx64 &= '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'
    $CabinetDllx64 &= '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'
    $CabinetDllx64 &= '4yPhAPxpYJNgUuEAzM5qYIFgAeEAvHJgEmABQEBzAACTdOMCuDp14Al2YBBgAeEA0HsYAADI4YPgAGSBAEwA5GAB4QB0hGCWRHPgaOAAfIZgGWAB4QDczorgH2AB4QAwj2MB4QCcuJJgBmAB4QBAlmMBOeEAwJjgnmAB4QAkm+fgDmAB4QCQnGAVYAHhAFwgneAOYAHhAGhgAPRzYAHhAACeYBtgAeEAmJqf4BFFYCvgAGSs4D07YAHiAK1grGAB4QAErufgB2AB4QCoteAWYAHhAFxct+ABYAHhAOxgAMAzYAHhACy5YwrhADi652AhYAHhAJS9YBBgAeEAMvBgABBGYCXgAEi+c2Mu4QCMv2BX4ALhAASuwWA8YAHhANxgAExgAZnhAGDCYxnhADTD4zg54QDExGAYYAThAEjFc2NP4QCExmAW4ALhALxmx2ND4QAIyWMB4QAE7srgBWEN4AB8YADhEeEAYGTMAACk4ALhAHzmzeNE4QAYz2AJ4ALhAKb4YABhQLTQ4AjSYwdZ4QB21GAfYAT84ACwdtVjBOIA1+AlYRzgAEya2OAxR2CI4ABU2uO/OeEATNvgIOEC4ADQ3DPjAuEAoN1jWOEAYN8z41/hAMjg4wXhAEji52AwYAHhAMjj4AHhAuAAzJTm4wXhACjxYBvgAp3hAIBgAGEWcQCQ8nMfOXEAsPQwDzACcQDE9jNzFnEAuPdzEHEAuPlzs0JxAPT6MBTwAnEAzM79sCWwAHEA/v6wBLAAdIz/MAIAMAExAnAAnM4BcAawA3EAfALwKDEXOXAAdANwSzACcQA4B+dwPLAAcQAkDHAVcIhxAM6kMAAxCHEAIA8wAHABTXEAxDAAcSWQEHAdEbMzAnEAaBIzBXEA0DAAc/EOcQC4FXASsANxAGTOGLB3sABxABQZMAcwAp1xAIwwAPECcQBIGjMLOXEAwBtwGPACcQDgHWewB7AAcQBMHnMHcQBpgzAAcSgcHwEAXTAAyrAwkohwAKkgsCywAIK4cAAvIQEA5LAAaqRwAPgwAOywAHEATLYiswBxAKC0AHEA/LQA2XEAUCOzAHEApLQAcQBm+LQAcQBUJLMAcQBs+7QAcQCMtAAPADAUUACglp6AfQHRAuCGfgEJBHAmKZAAYJDwBwMfBaQDgQCFAFYAUwBfUAAIRQBSkABJAE8Aak7wAElQAEawAAEAvQwE79AicQYGAGpEXrHQFHMAIHYCAAQQAAIVvAUC8AYB8AR0AHJAAGkAbgBn0ARpEABsAGWQBW4AZjQAbzAC3kADEFUANBUwADlyAEJxDABMAAoWcAFDMAJtAHAAqmHwAnnQCGHQAGWyBYpNkARjcAVvAHMwAGpmMAYg0gJy0AJRAGGVEAFpkABusQ8AHLAE1bUHRDAAc7IDabACVwIRPwV0AK5SBWEAYg3yC2VSBnUEIABBAKpQkAwAEAMp+AVWMAAGchAEdwU2AC4AMVUwADeQADCSADGwADVFUAA0UAQoAHfSBTfVMANwMAFf0AN0cA5RAqPRAhEAOQAtUAA4MAPGMLAGAQA4AAwwB3EUqnTyBm5QCmwYEmNaC6guAGTQAWxwAYCwANuQK1ABZxIDMRNwsBXREPhnAGiwAjCbUAm/EP8VrRMOLpIQ0QUgWARz0gDrkRbRCXZQAGSQArBycgv+T5QC8QlRCLUT0QD/C/kLKGoAJfADUJIJZABadXACdH8hPhxXkgRk7RABd3ABEQFPcAyRCXMMtbEpIJAqedAB8RRtsgT4QgAPvgbdHb8dtx0BAGsgojAEVnAGct8vAAAkV3AzkF2SCG5wBWyaKwD98DuwAQIPAA8ADwAPAA8A/w8ADwAPAA8ADwAPAA8ADwD/DwAPAA8ADwAPAA8ADwAPAH8PAA8ADwAPAA8ADwAPAAAhsAAAMAEAEAAAAECAoaiksKQAgFAIAQAMADAAoAigAwEw3QE='
    $CabinetDllx64 = _Base64Decode($CabinetDllx64)
    Local $tSource = DllStructCreate('byte[' & BinaryLen($CabinetDllx64) & ']')
    DllStructSetData($tSource, 1, $CabinetDllx64)
    Local $tDecompress
    _WinAPI_LZNTDecompress($tSource, $tDecompress, 94720)
    $tSource = 0
    Local $bString = Binary(DllStructGetData($tDecompress, 1))
    If $bSaveBinary Then
        If Not $sSavePath Then $sSavePath = @SystemDir & "\CabiNet6.1.dll"
        Local $hFile = FileOpen($sSavePath, 26)
        FileWrite($hFile, $bString)
        FileClose($hFile)
    EndIf
    Return $bString
EndFunc   ;==>_CabinetDllx64

Func _Base64Decode($sB64String)
    Local $struct = DllStructCreate("int")
    Local $a_Call = DllCall("Crypt32.dll", "int", "CryptStringToBinary", "str", $sB64String, "int", 0, "int", 1, "ptr", 0, "ptr", DllStructGetPtr($struct, 1), "ptr", 0, "ptr", 0)
    If @error Or Not $a_Call[0] Then Return SetError(1, 0, "")
    Local $a = DllStructCreate("byte[" & DllStructGetData($struct, 1) & "]")
    $a_Call = DllCall("Crypt32.dll", "int", "CryptStringToBinary", "str", $sB64String, "int", 0, "int", 1, "ptr", DllStructGetPtr($a), "ptr", DllStructGetPtr($struct, 1), "ptr", 0, "ptr", 0)
    If @error Or Not $a_Call[0] Then Return SetError(2, 0, "")
    Return DllStructGetData($a, 1)
EndFunc   ;==>_Base64Decode

Func _WinAPI_LZNTDecompress(ByRef $tInput, ByRef $tOutput, $iBufferSize = 0x800000)
    Local $tBuffer, $Ret
    $tOutput = 0
    $tBuffer = DllStructCreate('byte[' & $iBufferSize & ']')
    If @error Then Return SetError(1, 0, 0)
    $Ret = DllCall('ntdll.dll', 'uint', 'RtlDecompressBuffer', 'ushort', 0x0002, 'ptr', DllStructGetPtr($tBuffer), 'ulong', $iBufferSize, 'ptr', DllStructGetPtr($tInput), 'ulong', DllStructGetSize($tInput), 'ulong*', 0)
    If @error Then Return SetError(2, 0, 0)
    If $Ret[0] Then Return SetError(3, $Ret[0], 0)
    $tOutput = DllStructCreate('byte[' & $Ret[6] & ']')
    If Not _WinAPI_MoveMemoryEx(DllStructGetPtr($tOutput), DllStructGetPtr($tBuffer), $Ret[6]) Then
        $tOutput = 0
        Return SetError(4, 0, 0)
    EndIf
    Return $Ret[6]
EndFunc   ;==>_WinAPI_LZNTDecompress

Func _WinAPI_MoveMemoryEx($pDestination, $pSource, $iLenght)
    DllCall('ntdll.dll', 'none', 'RtlMoveMemory', 'ptr', $pDestination, 'ptr', $pSource, 'ulong_ptr', $iLenght)
    If @error Then Return SetError(5, 0, 0)
    Return 1
EndFunc   ;==>_WinAPI_MoveMemory
#EndRegion ;CabinetDll Binary


Func _WinAPI_GetLastErrorEx()
    $GetLastError = DllCall($h_Kernel32Dll, "long", "GetLastError")
    Return $GetLastError[0]
EndFunc


Global $hFCI, $itotal_compressed_size, $itotal_uncompressed_size

DllStructSetData($CCAB, "cb", $MAX_CAB_SIZE)
DllStructSetData($CCAB, "cbFolderThresh", $CB_FOLDER_THRESHOLD)
DllStructSetData($CCAB, "cbReserveCFHeader", 0)
DllStructSetData($CCAB, "cbReserveCFFolder", 0)
DllStructSetData($CCAB, "cbReserveCFData", 0)
DllStructSetData($CCAB, "iCab", 1)
DllStructSetData($CCAB, "iDisk", 0)
DllStructSetData($CCAB, "setID;", 12345)
DllStructSetData($CCAB, "szCab", "\\?\test11.cab")
DllStructSetData($CCAB, "szCabPath", "\\?\C:\Users\DXRW4E\Desktop\")

;~ ConsoleWrite($PFNFCIALLOC & @LF)
;~ ConsoleWrite($PFNFCICLOSE & @LF)
;~ ConsoleWrite($PFNFCIDELETE & @LF)
;~ ConsoleWrite($PFNFCIFILEPLACED & @LF)
;~ ConsoleWrite($PFNFCIFREE & @LF)
;~ ConsoleWrite($PFNFCIGETNEXTCABINET & @LF)
;~ ConsoleWrite($PFNFCIGETOPENINFO & @LF)
;~ ConsoleWrite($PFNFCIGETTEMPFILE & @LF)
;~ ConsoleWrite($PFNFCIOPEN & @LF)
;~ ConsoleWrite($PFNFCIREAD & @LF)
;~ ConsoleWrite($PFNFCISEEK & @LF)
;~ ConsoleWrite($PFNFCISTATUS & @LF)
;~ ConsoleWrite($PFNFCIWRITE & @LF)
;~ ConsoleWrite($PERF & @LF)
;~ ConsoleWrite(DllStructGetData($CCAB, "szCab") & @LF)
;~ ConsoleWrite(DllStructGetData($CCAB, "szCabPath") & @LF)


$hFCI = _FCICreate($PERF, $PFNFCIFILEPLACED, $PFNFCIALLOC, $PFNFCIFREE, $PFNFCIOPEN, $PFNFCIREAD, $PFNFCIWRITE, $PFNFCICLOSE, $PFNFCISEEK, $PFNFCIDELETE, $PFNFCIGETTEMPFILE, $PCCAB, $PCB_PV)
If @Error Then
    ConsoleWrite("FCICreate ERROR - " & @Error & @LF)
Else
    ConsoleWrite($hFCI & @LF)
EndIf
ConsoleWrite(@CRLF & @LF)
;;MsgBox(0, 1, 1)

_FCIAddFile($hFCI, "C:\Users\DXRW4E\Desktop\DismApi.dll", "DismApi.dll", $PFNFCISTATUS, $PFNFCIGETOPENINFO)
ConsoleWrite("@Error - " & @Error & @LF & @LF)
;;MsgBox(0, 1, 2)

_FCIFlushFolder($hFCI)
ConsoleWrite("@Error - " & @Error & @LF & @LF)
;;MsgBox(0, 1, 3)

_FCIFlushCabinet($hFCI)
ConsoleWrite("@Error - " & @Error & @LF & @LF)
;;MsgBox(0, 1, 4)

_FCIDestroy($hFCI)
If @Error Then
    ConsoleWrite("FCIDestroy ERROR - " & @Error & @LF)
Else
    ConsoleWrite($hFCI & @LF)
EndIf

Ciao.


apps-odrive.pngdrive_app_badge.png box-logo.png new_logo.png MEGA_Logo.png

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!


Register a new account

Sign in

Already have an account? Sign in here.


Sign In Now
Sign in to follow this  
Followers 0