DXRW4E Posted December 20, 2013 Share Posted December 20, 2013 (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 expandcollapse popup;#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 December 20, 2013 by DXRW4E Link to comment Share on other sites More sharing options...
DXRW4E Posted December 21, 2013 Author Share Posted December 21, 2013 (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 December 21, 2013 by DXRW4E Link to comment Share on other sites More sharing options...
jpm Posted December 21, 2013 Share Posted December 21, 2013 can be related with this KB http://support.microsoft.com/kb/156932 Link to comment Share on other sites More sharing options...
DXRW4E Posted December 21, 2013 Author Share Posted December 21, 2013 (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 December 21, 2013 by DXRW4E Link to comment Share on other sites More sharing options...
DXRW4E Posted January 1, 2014 Author Share Posted January 1, 2014 I solved like this, using the CabiNet.dll (v6.1.7601.17514) in Windows 8, everything seems OK expandcollapse popup;#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 &= 'YxKCDwFGMA9Yt4awMAJg7WYwXAgISGaJ8wBW6PLyMbGRD4Sw8G0SxngGOA+E0sMAwQOwFY1FyggQFSciD3QaQQIAOIBmO0gGD4XegAL3MshxCCDq9owacAdh7nBuADPbK8NXD4RhIaB1SA+F8YFzhpRHcRLzBVAF/3ZAktT/gHY8/3Y06CRxA5LEAbSFW5GFRQxiBwyJCDfP2w6BPk2xvABESUMPhTgSAAAAi0YIjUgMOSBNEA+HLQBwUP8AdRT/dRD/dQwA/3YM6LDz//8ghcAPhRcAZP91QhgBSBAAAAABSAQhACReXcOQAQCL/wBVi+yLVQyLAgBTVot1CItOIEBXiUYcO8EApBMBAMJ+HDPbO/t2ACSLRiwrww+FAiEAJjkedRU5XgAcdhCLxugm/AD//zvDdOzpRgEAGGYrfhyLTQwAD7fHiQEzwF8AXltdwggAD7YAEcHiCAvCQQ9AtgkLwetUCHRNAggAcQyLxsHoAgBXi30QhcB+KApTAC5IACoZweMIVAvTAwgQBQgYAAgzAPqFwH/aW4PmAAMzwE50q050AJ9OdAgzx19eCF3CDIA1AcHgEEBB64u4//8ARwGEhqwAeFbokQICewCEyOv//42GtAGACYlHBItGdIkgB42GtQGBBgiNBIa2ABKJRwxmiwBGfmaJRxhmi6yGgAAUAAUaAAWCAwWAHItGOIlHEIARAnyABiJmi058uAL9gDSL0GYjymYgO8gPhDYAsTmeQpwAF3VbD7cAETsgRmoPg0yACldqAAL/VRhZiYaMAQAOWYP4/w+EJkEACzvDD4RAgANWLOgEAKWBUiKAUmY5Ap4BXQ+FM////whW6CSE2+fq//+E6QKADzPAZokCN8Dr1TPA6SBABIdVAYJxagFqAP+2iAFACP9WHIvYg8RIDIP7QBzTCsAxiyVCDldAEN4HgQNGcIiNvrxBAomG2oABAcA4V2oFiR+JhkLMQAP/ViRZQyvBGcAOD7fDDAMfZoXAAHQKiz87+w+FIowABzPAQMJ8BABAg/9jD4TuAAoPALZLASlN+NNtAPyD7xA5ffgPRIL7gFmDegSANs4BwQe3BH3sLn5sACNF/ItLBI0cAMEPtjuD/xB3gL6LRezpu/KANQAAAAEAAwAHAAAPAB8APwB/AAD/AP8B/wP/BwD/D/8f/z//fwlOPo2GwTKNjrcDgcBzSASNjrgEAQIgCI2OuQUBAgyLkE44iUjAcE5wgEAESB4AAnJQM9tTSI2+5EI2SCCHPNqCCEBzXigPheIAAi+HN0ccARzARLLBU4PgAA8z/yvHdBhICA+FYwAf/3Y06GzFBsB6QW7WxUfPD2qgEI1GdFAFaxCBakD4EA+FagwAhWhFQD8Ag6xQ6BVDgYSeUEAGYAlMCYEfEFfrPoBdDIt9CFNXAwIoiUUQwgsYYAiOrgEAGopMH/+Lx8YARB//AI14AYoAEECE0nX5K8cAjVABO9MPjZ4BIASLTRBqAI1EtAgBxhMcwhNAI20oIsYMyBAAeQiDvwFgQDwmtWEYQHy4/oFkziNKyEFkqIACObcAOwBAdCNX6LX+oV50CCJWV6RcdBdX6IQh+oICDYNnMCIdwl8BiTPA6/bIHYAbCeKVhqRBDa/DA0bILFdqQKC2hOABgzkMiZ6hDIYWdHX/trGBBf92RKMEoy05IgigdViLRkRgJzBFAwWFBkDgAopIBoDhAA+A+Q8PhBsLgUFmSARmiY6wAQ8At0AGVlDo1OShAhYdg34owB79iGEACABqAGoE6SwDwAYAGOyLQhSLcoAYO/APgw8NQCIASggPtgwxRokAchgPtvGLTfgAg0X4CNPmCXUS/GFlg9QgguvQiwBWFItGGDvCDxSDXEEGTkEGAUCJAkZABsGLy9PggwDDCAlF/DvfD6SDTgBm69OCb3GAXgAPtk4BD7ZGAQmgbyvY4G8733IaDUNvU6EDRG+LTgTpgLvu//+LShiAE0kANINDADSLQsAMBNAI' $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 &= 'COUy8lCLmsFhA4hFC4uC4TPQMwNgDTC1DAPwO8ZXQdDSiV30iXXgMqoLECsQDusBXovBwehkFj0VM3xCFzMQgvgp0STHRYDOIPIkEHRAFY1EPwE94jEew+Ik4TEcjQQ/MwHTJKEpM//RbRCgJMHABFX2H1fBdl0QJU6iMxeB0TKKRQvTZfwQJaRNExAMhMDxGnvwGgoL5FrI4VoJffxDGEMEEHAMMAKBbfghwSp5F4sKMA6JVUAQilX4iBQQmxC4QOm8URgQB4QzwoIzfvyAM8BBoAHIM3YKijP8r48zjzOPM44zPGIOZ4Ez91UzMQ4FDnMCDiMzAQ4QMxsIDikzJAENoD/5A4Cq+VAzpsEy+VUz+VAzAgNSM/wPvsGJRbAQD7aAATJRM8hQMyrIgGWKEgEoUhaAfQoLUjND4gfgCAvBIfAwC4BFC1EzbrsA4AlF/ENDgH0ACwCJXfR/IA8AtkMBD7YLweAACAvBD75NC/dE2dMEhEULEACEiwBFEAM0hZhCfkBs6waLNaQAHIsAQhCJQhSLQgwAiUIQ6xIPvsEAjUSCDIswhMkAdAiLSgyJCIkAcgyLRQxHi8gAK85HI0oIizIAihwOiBwGQEEAT4X/f/GLXfQAM/ZGO0XsiUUADA+MW/3//4oATQuIirQuAABAi038iYqwAQhKEAgjyCsAIpoEKyAAAImKwAATX14AW8nCDACDyP8I6/SQAQCL/1WLAOyLVQhWi3UMALgBAQAAO/B9ADIrxjtFEHwDAQC0UFboiPn//xA7xn0FATMiK/AAAXUQg30QAItI8ImCASh/BYAS6wAK/3UQVlLoiWD8//9eXYAvBy2DIOwYi4IIgD+LTQAIiUX0iwJTiiKagVKJRfAAb1aLArKBVAPBO8hXiwK6AlNF6A+NbgMBgBfGwegWPQAEAAAAcwcPv0RCwBjrDMeCvAAWgFEAADPAhcB9TMcARQwAACAA99gAhXUMdBaNTAAgAYH5gAoAGB8PAL+Egj4OAADrUCGNDAAECgoBCjwDAQoKJNFtDIXAfAi7g7oBCQAPhQ2BgD07ffQPgwQABBCKjBAYgB3T5ioA2YhdD4l1/IRA238eD7Z3gPUPAMHmCAvxD77LAYB65gl1/EdHgBTDEAAJvsEVK8Z5AByLTfCLdQiIgAQxi3IEA/GAP0T/RUED6YICADfIAIPhB4lN+IP5MAcPhdnAHQBtwekIGDvOQSm0ShgIAUApEYNl+ACLdQL4ByuF9n1TuQAAAIAAi138994EhcvAPFw2AYH7EuRAKnMiAA6yPiOhAA4TjRw2BAUNAQWCPAAFiXX46w4BFANHE4AW0emF9nyyKYQ+dUGCPQ2AJ4qMBBa4gFbTZfyKTQQPKgMDiE0PhMkgfx0Ptl8CP+MIFAvZALoPQD/jCV2BQT9FDxCDxgcEExHAGw+FwoAZwfgDIDwCD449gAI8MwgPg6/AAQ++wIoEmGCAwIlF7ID7EAMPgr4BXrbDjQBI/YXJdEWLdQD8aiNZK8jT7h3CI31ADEAGwCKwAyoAwwBFD4B9DwDgfyEPtkfCIQTcwSEDAdzDIesCM/aLRUjsiwRC3I00gJr8IMHoGT2AABpzQ0APvoQQtA1EeR6LgBdAeTTAhShND0AZhYIXK5o56wwzwMdRAAPw61SE23RNU+AWgBhqIEcXwqADKPBdD4vIxQqgJ7gWIBYNZYQDgHsNhMiNTIpgDIsxhMAAhIACAQEBhE0Ig0X4AosA2Svei3Xwi8MgI0IIgfmBeIoEkjBATX0JQU918EABCEFD/6BNffgAfyTWigBZTQhABztN0uhhFoySoHaIg3KicVKJAnGLwWKFCG2FgyTsFMCFioJDjRCIkEULi4KiBkX8A30YiUX4oHzjewPIOwTBViV7TewPjV6hIXtF/DPJgHtBqntYCImKISoie0cgQiCxolzYhfOhXCB7+yx7cB2NHACEAid7hgjRCu6Aer4oW/gPgw8TCHohWwsqgwGITQu/' $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 &= '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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 &= 'D4XzEQBSAIspM/ZIi9lEMDvudDIBYgE4RTOAwEmNDAToeABYEIuXAAEA1I1LBACD6gREi8DoY4EAKEE7xQ+FtgA+AGZEAWMERDvmGA+HCAANBJCLzmaAOXAGD4T1EAASoDl3UA+FAQm4AEYEAOsAI1wkQEiLAGwkSEiLdCRQAEiLfCRYSIPEACBBXkFdQVzDApAFAESL2kyLyQBBwesCRTPS6wAARTvafi5BDwi2QQEABAlB/8sAweAISYPBBAtCyAEK/sHgEIME/wDB4BgLyEQzwQDrzYPiA4PqAQR0KQECF4P6AXQAB0Uz0EGLwsMARQ+2EUHB4hAISf/BASbB4QhEzAvRBAaABOvYBkIIAABIiVwkEEiJdEAkGFdIg+wApYEJAXUz/4CdD7dQBlAPt4EIAHC+AXIBAFFcZjvHdgpmECvGZokCCzPS6AAI/v//O8cPhBREDoGTgwEeZjl4BYCSYwcISI1UJDABAOcGZolMJDBIsIvL6DaACoEaIwcSRYIPOYAPD4VcQAWLqsZBVDgBU0DBUV+EUAHEK2wkGFZXQVQngCzAE0AqiQqAI0UzAOSD4Q9Ii/K/AYErQTvMD4Q9FAAAACvPD4VAEwmAFIPsgAVMi0NgAEyLW3hBgThNAERJQ0iLU3CJDkQBbEIhQJhIBA+FAjKADUWLUBBBjQBCDEQ7yA+HIQEABIA6Q0mLSBgID4UUAQN6AUsPBIUKQAJIjUICRAiJYSTAADRIiUEgCEGNQf7AAjBMCIlZEMAAGESJUYAsiUEgRIkhQAUaBMAAOEERwURQ6DIhwinED4XBwCcPtwHAIWaJBusAi8cVA5RYAZRggD8wQVwEX14GkUiLxEiJIFgISIloQEJwGJBIiXggg0KLAgBDAcA/iUEoi0ksOxDBD4f7ACiLeygAM+07/Q+GBvEA//+LSzhEjWVAATvND4XnwAY5ACsPhe/w//85IGsoD4bmAAKLUyAwRItDNEGmxHMAMUSLSyREO0sgIA+DGhVBakMIEEYPthSBOAGJQyAk6wBBi0GnwtMA4AvQQYPACOsAyovC0epBI8QgQf/IiQOAB4P4IAIPgjwFwCDCwQDoAolDMEGNQED+iUM0OWsAWXaDwB8AszvVD4TggAKAQSvUD4TiBAEisNQPhVkhKyBFGKJrAeByhFH////pxyPAAmZX//NVgUBBVQBBVkFXSIHsSAEBDWkwi3E0RTMg9kWNZgGgIesAQIP+BQ+C7OAKRBCL7b/7gAjB7QUAQYPlH0GBxQEB4EQD90SJrCSoA0AHQgVzKotTJDsaUyAeMUAyIR4PtgwIEI1C4x0PtsGLAs6gHeiDxgjr0QhEi/1iCecfRQMI/AP34QcED4MKtvWhKGMI/8KZeAjNeToiVSFyi6m8QWiL2QRBvaFahe0PhNQJgZGxwGFocVwPgmQ3CuAoufTAAUBIuYLEwAB1Ubn+/2AESMcjwYBAhCUABDkUu+gAA3QAasvo6ADt//+FwA+EP6ngAovX4nHsIwItIAIt4QHm4CThAR1BC2NcA+KbpnQDS1w78Q9Ig94JoRF0SiQDiwDOK0tcD7d4BgAr+YvRSIuL4AHBE/0PR/1IA1MAeESLx/9TKDsQ+A+FuqAGA/crqO90EuEMfuQMtaACgOu2SI2TGAgBasSDDGGziUIIYAvhCEFAASgPt4PGgYuJEkJAiYPIQwEyD7eki8pCAUo04CxoAAUmIKADYSCDIgEEOvYgwUAPhXDAC7kDQYAC/1NISINCE/+ASIP4/w+EaiADikghEHkAAUGLxaFuvSCKbCWPwLggBsC4XaRvhP/zw6TZSI2RAzM0idiBeLhAwcALIIMg+BAPhbjBKI2LIaEYTIvDuiHN6CO7gTcADZxgA2XGAAtbR8Mj5pugQHQkEOKxSYvA2DPSSIv5ACrBDDJEgEj/U2ATogFBuGFi2IvXi/AgD4ALjsAUCwAAipdAP2ALQMn/M8DGh2EBAIDyrkj30YH5oQWID40L' $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 &= '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' $CabinetDllx64 &= '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' $CabinetDllx64 &= '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' $CabinetDllx64 &= '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' $CabinetDllx64 &= '0SOeQKNJi4bxQH7QRmBNi9jAfoPxMvA+2kSLwUlAUREBKkH/07Mw+0SLCNgzwDOBO8t0GJFQA1DHBsEHx0aSB1SJRsGxBZasQBEOSM9KrDiscLiwuHggkqygAiD5SIvyuSGKSYuA6U2L4P/WSBAJgXATFyFHBMcHAiPaRwUj0QIj8w9M4BDBGdBIg2NQQACjocFxAKKocgCJcBAho6iyAKB4WEyJYEAHaCLGjnDUOWA6AcdIiXxgOhSJQ7AshJIoTIlDMkjwAEC44F7wXktgrTB7pEAF4AGgEAG68QWMiYMhVaUtTIlL0j7GKAEyYBzF6KzgETAMIzAI4AzL6KUAKuk8gZAcgyMAg6OcEQTog6OAggqLwB/GsaFXRkhw0eEhQEFcd8z/lvNCsuCxUOOxF5fmsQpA4aWB8giNfCQzAEGL6UiD5/xBIIvwTIviwLA9Cw3wAXNgSZJTz+g1cgfhc/KcMDaL1jPJZoCJbwZmiXcEcI7FUTY4gWiDYQQQJhEom+Ql1B2M4gZBkC1/gClsgcTxCGKPW4AM02qL3EswoGcCCZRPWGEUEcjtkk/fYAWgz634AvIBxQJYRIvGQYSyArOzAoEFACaCtBBMi9xJiQBbCEmJaxBJiQJz+khAiwFMi6wtlDis0h9QBDQAL0GLQPFNi/BJjUEf2YBFM/9MiWlQEAQAwE2NS9ZNjUMQ1EmNU9ERSYlDQLhmRYl70DAAKNz/lNMdMNNxETsCesU3Q4IvxjczwEyNgC9JQItbMEmLa2CLcwWwAOMHPkE793QGAGaDTCQ+QIuTLfEfisMkcBKY0ABEKxDCSAOTkSskD0QOiSNV0tV1RUmLzDzQAw+F43IBq1ETYMfAQTvHD4Sq4AdibyZossTiBIs7RQRBi4DIjRQHacn/QN0gO8oPgixAAjv6SA+HJHAAAYOBCIkIE0Q5ggB1Q0iN+wMPESun0GDyBREDYAURAgBMi80z0jPJQRT/1ZFPQMQvRIm7/XIEg/Esww1kCBIMpw24DATpPrAwYrsASItDWMcABwAAAABEiXgEx0AkCAEAUOm8ACD/U4AoQTvHD4TOACxAg/j/D4SMAZCLAIOYAgAAiztEEIm8JJAAQEGLyACNFAdpyf//AAAAO8pyVDv6dxBQAYOcAEaJE0QCOQIQdRNMi8VJgIvVSIvL6NUAvGEAqnRei5MBNAScSACJbCQgRCvCSIgDk6gADkyNjAJbAEmLzOl2////JwKjA5kCpAAJAAnrG0BIi0tYi4QCKceCQQIdiUEExwEAQLAASI2UAhcCeMwFq8D/Uzjp2P0ATxUdQIsTK1QkNAE3TACLSzCJVCQwSEiNi3CALEiNgAVBDLgQAS2AVShIiUQgJCDonAQCZg+EEoMBKotTghpIg8lA/zPASYv+AhTyBK5IACMgSYvWSCD30USLwYQn6GFVBR1IAB24grlAgASQAQIASIlcJAhXSACD7DBIi/lIiwjauQ+BO4vX6D8FggNHgDNPSEyLR8A4SI1PYLqCd4AYCQRKLwOBEc+L2P8AVxiLw0iLXCSAQEiDxDBfw4wtKCAPt4AtygAv6FgBACOFwHUEM8DrQiYAaWaJu6QAFegkFQWCBQ64gR9miXKDAQXr2wIrgRVAOsQOIIUVwxWBPBBIiXSAJBhXQVRBVUEwDIO5wXmActhMi+IpgDN1CkM75wABi4kCkMAG/1cQSIvwCkhAGhrBNo1eASEGcMB4gDEAiVgIMyLAAqNEi4fBCjPSQEiLyOj4bMFwViIEgDnohAYBKQ+EYo0ACQ+3hwEbQUVIQIvWZolGBgRLMAuED4hJ4IADhcB0WUFBCEQPt0YEgQlIWIuXsAUQhwq1gwouMA+3VgQAEoEYTIuAyzPJQf/Uu8EyBQDHdQCNR1iDYASGAMPSAS7bSIvOxmAAUEiLbCRYSIsIdCRgQWNBXUFckF/Dg6fCRuvWxVAIi8RIQA5MiUggQEyJQBhVVkJRQQRWQcKCg2AQAIsA6kyL' $CabinetDllx64 &= '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' $CabinetDllx64 &= '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' $CabinetDllx64 &= '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' $CabinetDllx64 &= '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' $CabinetDllx64 &= 'AA1MjYNY0wAfACvYCgMr8IAQQByA6z+NVwToM4AICYQ3i5OBPkSNTgGgQf/A/8KBCs0AWhcAEEI9h0SvAhBog8AQAwFDcAEEUvX/gP+F/3QJ6M1AE7CDQ3AHQCpBblhBblpgAXJQgDUCb1+Do1+LxaPDb3TBb3wkGIBskknACwG+QTlFiMBOAAFxYEUzyUyLANFJY8BBO9F1IApmAbSBASLrXAAPtowIvRsAAAAr1mZBAbSK9BGAo4H6AEAOSGPCiH0LQoAHEL0cAAqgDUjB+AeDAx0BBwrBgQuCwTRBD7dKAGJJi0IQZokUIEhBikJnQAZyYgBBCEJmQdBiZ4BB9kJgB3UegQQaZIADZkVHgQRkRYgSSgACcmfgMEJguAL/ICxmRIXAdWMJ4AFaVEAG0EiNHQBPVwAAweIDRUArWkxJjboBDg8AtweLC0iDwwQAg8EFSIPHBA8Ur8gARZ/gBAPRSBA72HzfIAfIZtEA6WZBOUpicxYAweoCQYPj/oEC4qByP0E703MEgIvG6x24/3+hDYA7wHQMuACA4REAOUJidQNEi85cQYtgPwEqwC4QAWYYQ8Qs7H4gTIlAa2UzEMBIi/JgYg+36AVgMPBgAOhEiuBmQDlBYA+EB0AqQCD2xQd1EKATxWaAQf/FRIqkGINoAYB7zWb/xQ+2PAABQfbEAXUSSARjx4AHRIYCD7ewFIbptwA1AC8fwTSITIv5IAOEjgbgNJlAgo4E4ACBR7HtQWkABZIe//9Gi4QAuBA3AQBFhcAAdBJCK7y7wB4hYgSL1+iLoQSLQwVBEM5AEMYPtzxIZIH/oT19DWAOgAwY4YI9D0iLx+E9AgLBPSCLRCRgTGGZy0YR4BK4AkIAE7joPNWDDh2EDpCJDjQgG4NuAhagBEHQ7GY7azBgD4L5gDAAGIYCueIXlgDDF4JbZl1oalx46dbs5pTxrsEvIApZAFRMY0lQTItxACBPjQQzuPp+AeEL2keKZAH/RwiKLAGgsEmNqAIZIB2/AMDGAD/YdgYAZkQr2OsGM8CAZkSL2EGB+aEDGHwFv2ESAArTSWMAwUuNFDJEOCwQEA+FuYF6OGQQEP8Pha6hyIoAOBACD4WjQgFAATgKQsDHluG9jUgCSKCDwgKKAcEDhCACAIpCAUj/wTgBIHVOikICIwFEioRCAyMBOopCBCMBEDCKQgUjASaKQkIGIwEcikIHIwESJWAKCEABigKAAQVIgDvNcqgrzbjhFRBMjYX+QCoDyEEAO8l+FzvIZomAXlZEi8l9MCB0AEaKZAD/RoosQSAsTjBBgeIiXkIAixxRZkE723YQDrj//+ABA/gPqIUO/wPfIEEwKEEwcUDGfCQ4IGHr3vjEMxEgCNm9AGBJRI1/AAJEi+dEjXcBAEGL9zl5PA+EAkEgfkQ5ezx+SxAPt1NUECggD7YATBACi0M4weCIBTPIAAEogeHhCYFDColLOEhjyVAZAgRQeEMwZkSJBBBQSGNTIGxLKA8At0NUZokEUeuABkSLx4l7UJAaYGtWiXNQoAZAHccAdFKDe1AgfUwDcQZQLsCLyivIgUL50SB/OLj9AQ87WNBzLqJFoCmrkFk7AEM8i/APT3M8IIP+A3UUcQMPtzBLVivRUFCAIkEPAE/3RItDUEGDIPgDD4zg8R478BgPj9chOSMGxUGDCMD9K+EEQSvW6BJxMGyLU9AIzivKBVElufEMAUs8jUoA/olLUGZEAXOaVIIQREEQsAtDVDBVBEwAqhBBI8lNIwrBQhDRIA8wD7cEQFBmQokEQT0QgyBDUP91q0MFi+eBEBBEO98PhKhRaABDTESLxWY5ewhUdAVSBkQrwDsIx3wKMAtMSANTkCDrA0gAkjPJQRAE/vciOVtURIlbAEzrbUQ753RdwSEDM9JmQSsgQjEJJ6AKMHjRApD5IBPHdC4+HwYfBhUGnBoGA0VEi+YyC/9LPKAQD2yF4lAYUQceXwdVBxoXUAcQB+IGBBAfVCvo' $CabinetDllx64 &= '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' $CabinetDllx64 &= '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' $CabinetDllx64 &= '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' $CabinetDllx64 &= 'K0I4DCB1DUGAKf/HSWPDgipFADvZfh1JY8tIjI1EgCgAbkj/xoA7IEg78ccAgGoAfELrBCYhSIszASZsiIoMN4ElOAwwCyUG5wAlgFV+Gklj0xWAT4OAJsGAJsBIOxDCxwECASXuuP8AfwAAI+grxUgEY8iAoH4LTIvBAYCgAk0PTMJBiwDASItcJEhBXwBBXkFdQVxfXgBdw4vKQYtEjQAAQYkHQYsEjqEC1okB6caAn5ADAABIi8RIiVgISASJaADdcCBEiUAAGFdBVEFVQVYAQVdIiwFEi9oATIvxRQ+3DAMASItBEEaLFIgAQokUiEyLSRgASItZIEU70HcAD0KDJJsAQ4OgJJkA6bYAKb9BKgBLjRSZTo0EmwBMi+dMi+9JiwAGRYv6SIvPSQCNNAdKjSwYigAELzgEPnUqSCvAScJ/lsAMigBtBA6UdRUGBYEGBXTWwwGAfSRJO81+E4EHAH1mSIv5TDvhAEyL6UkPTPxFAIkQT40EuUWLQBDrIkk7zMQIQohJi/1ADEyL4QCTAPlEiRJKjRS7AESLEkQ7VCRAAA+HZP///4MiEABBgyAAn1wkMABIi2wkOEiLdAnIUMNBgVAEiYkCAIsEi0GJAOvWAcNNRA++SSxMiwDRQYvJRCrKKwDKshBFiEosQQDT4EUJQihEOgDKf11Ji4KQCEAAAEk5goiAAXIKFsADgAACQcdCMImBhUmJwgVJi4qBAQBBikIqiAFJ/wXMBCvGBEHBYigQAEEAUixBOFIsEH6j88PFb4lcJAAgV0iD7BBIiygFu1BA0TMAdEQkEAiDuaiADQBMi0DJdAyDoaTBAulCFwAei4nUCYATA4DIg/kKcxhBhAaYQceBgQsBJunxwQOAg/gGfwxBiQILBOnfQARIjQwkTQBj2EwD2kGLQwD6iQFBD7dD/gBmiUEEQY1A+hGgUUi46AQAiQQRAGaJRBEEQYuBAaEHQo18APbrCiBI/8JB/wICgDoQ6HXxRYMDRDvHAHNnD7ZCAw+2gFoEweMIC9iAAQoCBQEBAgFBjQwYgIXJeDJFi5FhFQBDjQQCO8hzIwBBO8pyBYvLQQAryovBiEoBwQDoCIhCAovBwQDoEMHpGIhKBACIQgNIg8IFQSKDAg0F64ghGIsBAEGJQ/oPt0EEAmYAAf6NRwpBiQPiA0FjCEgzzOgPCDj//4FBOEiDxAwQX8Us4iwIRI1CAP9FMslIi9lNgGPQRYXAeC+AYgBATo0ckEGDOwACdgtB/sFBgED5A3Mb6wPABEEA/8hJg+sESYMQ6gF53+ICA0UzAMBEO8JNY8h9AEpJweECQSvQQESLwkiLQyCbDCABhcl0KkB5dxMAi0NYSIvRi0wAi1iJRJNYiUsAWOsSi0NciUMCYAADiUNcjUH+EIlDWElgg0mD6DQBdYJ+COlBoHlsJBHAeXQkGCFDIIvqgA++USxBi/DADwSD6gBF2eg9/f8A/0yNQ1hBuQMhoT2LCLoEYTyLgyFhTYgISP8CAcHpRAhIoBd150lhtoMA6QF11Yv+g+egAes9SIvggYthBACL1YoEAv/F/4jOiAGkBv+DmKAABIG7oQAAgAAAdUAPSIvL6OuALMYEg7BhAoX2db+FiP90EcQNQIgwJAcYg2MoYBBkcEDGQ8QsIMNyg8QgJTHkGyJ04Rt8JBjAW0G4ErBgF0G7gVdNjZGEQCngGIHBiCVgAgAPtxIPtgFJgwTCAmCKD6/QRAOiwiAyAXXmQEmg4A0AM9JEO9J2VosQwo0ExcEHTI0dHHA2IJiBFEBaD7bCAEIPtjQYTo2cQgnhCUmNnEnBC0EgD7YLD7egS8MCAAPOSf/DD6/IBEQDYJbvAXXk/gLCoAZBO8JyrEmQjZFFKIAFuvmhfQCBwWY8AAAPts4KgBIgEsDg/8LjBuFDfHXmgjjBHsAz4BqAagcIwegDxk+QhdIPDISyYDXrtRhIiXiGIMO1AT0z/4vyoDsAM+1BtRBMjTUAVPz+' $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. Link to comment Share on other sites More sharing options...
Recommended Posts
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 accountSign in
Already have an account? Sign in here.
Sign In Now