Jump to content

Leaderboard

Popular Content

Showing content with the highest reputation on 11/16/2025 in all areas

  1. Description WinCred is a User Defined Function (UDF) library for AutoIt that provides a complete interface to the Windows Credential Management API. This UDF allows you to create, read, update, and delete credentials stored in the Windows Credential Manager, which is the same secure storage system used by Windows itself for storing passwords and other sensitive information. Features Create and modify credentials using _WinCred_CredWrite Read credentials from the user's credential set with _WinCred_CredRead Delete credentials using _WinCred_CredDelete Support for all credential types (Generic, Domain Password, Certificates, etc.) Configurable persistence options (Session, Local Machine, Enterprise) Full Unicode support Comprehensive error handling with detailed error codes Complete example scripts for all functions Fully documented following AutoIt UDF standards Functions The UDF provides three main functions: _WinCred_CredWrite - Creates a new credential or modifies an existing credential in the user's credential set _WinCred_CredRead - Reads a credential from the user's credential set and returns an array with all credential information _WinCred_CredDelete - Deletes a credential from the user's credential set All functions follow AutoIt's standard error handling mechanism. For detailed syntax, parameters, and return values, please refer to the function documentation in the UDF file. Constants All constants are defined in WinCredConstants.au3, including credential types ($CRED_TYPE_*), persistence options ($CRED_PERSIST_*), and flags ($CRED_PRESERVE_CREDENTIAL_BLOB). See the constants file for a complete list. Quick Start Example #include "WinCred.au3" ; Create a credential Local $sTargetName = "MyApp-Credential" Local $sUserName = "MyUsername" Local $vPassword = Binary("MySecretPassword") If _WinCred_CredWrite($sTargetName, $CRED_TYPE_GENERIC, $sUserName, $vPassword) Then ConsoleWrite("Credential created successfully!" & @CRLF) Else ConsoleWrite("Error creating credential: " & @error & @CRLF) EndIf ; Read the credential Local $aCredential = _WinCred_CredRead($sTargetName, $CRED_TYPE_GENERIC) If Not @error Then ConsoleWrite("TargetName: " & $aCredential[0] & @CRLF) ConsoleWrite("UserName: " & $aCredential[2] & @CRLF) ConsoleWrite("Blob Size: " & BinaryLen($aCredential[3]) & " bytes" & @CRLF) EndIf ; Delete the credential _WinCred_CredDelete($sTargetName, $CRED_TYPE_GENERIC) Example Scripts The UDF includes complete example scripts in the Examples directory: _WinCred_CredWrite.au3 - Demonstrates creating credentials with different persistence settings _WinCred_CredRead.au3 - Shows how to read credentials and display all available information _WinCred_CredDelete.au3 - Demonstrates deleting credentials and verifying deletion All examples are fully commented and follow AutoIt best practices. Security Notes Credentials are stored securely in the Windows Credential Manager The CredentialBlob should contain binary data (use Binary() function) For sensitive data, consider encrypting the blob before storing Documentation Full function documentation is included in the UDF file following AutoIt UDF standards. The UDF is compatible with AutoIt's built-in help file system. License This UDF is released under the MIT License. See the LICENSE file for details. Changelog See CHANGELOG.md for a complete list of changes. Links GitHub Repository: https://github.com/DonChunior/WinCred-UDF Microsoft Documentation: https://learn.microsoft.com/en-us/windows/win32/api/wincred/
    2 points
  2. It seems that this is less about index collisions. The real problem is obviously that memory areas are being used across multiple map instances. Whether this occurs exclusively when using string indices in conjunction with integer indices or in other cases as well, we cannot know here and now. Without having the source code for the implementation, we can only speculate about what is happening in the background based on the behavior. And so far, it seems to me that the memory areas for the buckets of the hash table are not completely cleaned up when dereferencing the map variable, and on the other hand, these areas are used when initializing a map variable without being fully prepared for use (e.g., memory area zeros or something like that). There may well be a clever idea behind this, for example, to increase performance or something like that—we don't know. However, the current implementation is undoubtedly a bug, and worse still, a bug whose consequences cannot really be assessed at present. Therefore, we cannot simply dismiss the issue with blanket statements such as “don't use integer keys” or something similar. This naturally raises the question of how to deal with it. It has been clearly stated that bug reports should not be created for maps. Nevertheless, the bug tracker is full of tickets for maps, and they are being processed as normal. That's why I would have liked to discuss the whole thing in advance in the forum, preferably with the developers involved (actually, I wanted to do just that in the German forum first, but you had already posted the thread here...). In my opinion, the “AutoIt General Help and Support” forum is not the right place for this, but rather “AutoIt Technical Discussion.” However, it may well be that the bug has already been fixed and has been resolved in the course of the following ticket: https://www.autoitscript.com/trac/autoit/ticket/3948 The phenomenon described there is quite similar.
    2 points
  3. Trong

    AutoIt Resource Embedder

    AutoIt Resource Embedder A professional tool to convert binary files into self-contained AutoIt functions with advanced encoding and compression support. Author: Dao Van Trong - TRONG.PRO 🌟 Features Core Functionality Binary File Embedding - Convert any binary file (DLL, EXE, images, etc.) into AutoIt code Multiple Encoding Formats Hex String Encoding Base64 String Encoding (with Unicode support) LZNT Compression Level 1: Standard 4096-byte chunks Level 2: No chunking (maximum compression) Architecture Detection - Automatically detects PE file architecture (x86, x64, ARM, ARM64, IA64) Dual Operation Modes GUI Mode - User-friendly graphical interface CLI Mode - Command-line for automation/scripting Advanced Features Smart Helper Functions _DeployFile() for single file - Returns binary, hex string, or writes to file _GetBin($filename) for multiple files - Switch/Case based retrieval Automatic Decompression/Decoding - Generated code includes all necessary helper functions Error Handling - Comprehensive error checking and reporting Chunk Size Control - Configurable line length (100-4000 characters) Batch Processing - Process multiple files at once 🚀 Quick Start GUI Mode Run the script: Double-click "AutoIt Resource Embedder.au3" Add files: Click "Add Files..." button Select one or more binary files Files appear in the list with size and architecture info Configure encoding: Hex - Standard hex string encoding Base64 - Base64 string encoding Hex + LZNT - Hex encoding with compression Base64 + LZNT - Base64 encoding with compression Select LZNT Level (1 or 2) if using compression Generate code: Click "Generate All Functions" or "Preview Single" Code appears in the output window Save output: "Save All to File" - Single .au3 file with all functions "Save Separate Files" - Individual .au3 file per input file "Copy to Clipboard" - Copy generated code CLI Mode Process files from command line: AutoIt3.exe "AutoIt Resource Embedder.au3" file1.dll file2.exe Output: All_Embedded.au3 (or individual file if only one input) 📖 Usage Examples Example 1: Single File with Helper Function Input: myLib.dll Generated Code: ; Function containing encoded data Func _GetBinData_myLib_dll_x86() Local $sHexData = '0x4D5A90000300000004000000FFFF...' Return $sHexData EndFunc ; Helper function to deploy the file Func _DeployFile($sDestPath = "", $bReturnHex = False) Local $sHexData = _GetBinData_myLib_dll_x86() If $sHexData = "" Then Return SetError(1, 0, "") Local $bBinary = Binary($sHexData) ; If no destination path, return binary or hex string If $sDestPath = "" Then If $bReturnHex Then Return StringTrimLeft($bBinary, 2) Else Return $bBinary EndIf EndIf ; Write binary data to file Local $hFile = FileOpen($sDestPath, 18) If $hFile = -1 Then Return SetError(4, 0, "") FileWrite($hFile, $bBinary) FileClose($hFile) If Not FileExists($sDestPath) Then Return SetError(5, 0, "") Return $sDestPath EndFunc Usage: ; Get binary data $bData = _DeployFile() ; Get hex string $sHex = _DeployFile("", True) ; Write to file $sPath = _DeployFile(@TempDir & "\myLib.dll") Example 2: Multiple Files with _GetBin() Input: Multiple DLL files Generated Code: Func _GetBin($sName) Local $sData = "" Switch $sName Case "kernel32.dll" $sData = _GetBinData_kernel32_dll_x86() Case "user32.dll" $sData = _GetBinData_user32_dll_x86() Case "advapi32.dll" $sData = _GetBinData_advapi32_dll_x86() EndSwitch If $sData = "" Then Return SetError(1, 0, Binary("")) Local $bData = Binary($sData) Return $bData EndFunc Usage: ; Get any embedded file by name $bKernel32 = _GetBin("kernel32.dll") $bUser32 = _GetBin("user32.dll") $bAdvapi32 = _GetBin("advapi32.dll") Example 3: With Compression Enable LZNT Compression: Select "Hex + LZNT" or "Base64 + LZNT" Choose compression level (1 or 2) Generated code includes decompression function: Func _WinAPI_LZNTDecompress($bCompressed) Local $tInput = DllStructCreate("byte[" & BinaryLen($bCompressed) & "]") DllStructSetData($tInput, 1, $bCompressed) Local $tOutput = DllStructCreate("byte[" & (BinaryLen($bCompressed) * 10) & "]") Local $aRet = DllCall("ntdll.dll", "uint", "RtlDecompressBuffer", "ushort", 0x0002, "struct*", $tOutput, "ulong", DllStructGetSize($tOutput), "struct*", $tInput, "ulong", BinaryLen($bCompressed), "ulong*", 0) If @error Or $aRet[0] <> 0 Then Return SetError(1, 0, "") Return BinaryMid(DllStructGetData($tOutput, 1), 1, $aRet[6]) EndFunc ⚙️ Configuration Options Encoding Formats Option Description Use Case Hex Standard hexadecimal encoding General purpose, human-readable Base64 Base64 string encoding Smaller output, better for text Hex + LZNT Hex with compression Large files, need compression Base64 + LZNT Base64 with compression Maximum size reduction Compression Levels Level ChunkSize Description Level 1 4096 bytes Standard LZNT compression Level 2 0 (no chunking) Maximum compression ratio Line Length Range: 100 - 4000 characters Default: 4000 characters Purpose: Controls how long each line of encoded data is in the generated code 🎯 Use Cases DLL Embedding - Embed runtime libraries directly in your AutoIt scripts Resource Packaging - Package images, icons, or data files Portable Applications - Create single-file executables with all dependencies Obfuscation - Hide sensitive binary data within scripts Version Control - Include small binaries in source control as text Driver Deployment - Embed device drivers for automated installation Plugin Systems - Dynamically load plugins from embedded data 🏗️ Architecture Detection Automatically identifies PE file architecture: Architecture Machine Code Description x86 0x014C 32-bit Intel x64 0x8664 64-bit AMD/Intel ARM 0x01C0, 0x01C4 ARM processors ARM64 0xAA64 64-bit ARM IA64 0x0200 Intel Itanium Not PE - Non-executable files 🛠️ Technical Details Encoding Methods Hex Encoding: Binary($sHexData) ; Direct conversion from hex string Base64 Encoding: Uses Windows Crypto API (Crypt32.dll) Unicode support (CryptStringToBinaryW) Automatic whitespace removal Compression LZNT Algorithm: Windows native compression (ntdll.dll) RtlCompressBuffer / RtlDecompressBuffer Workspace allocation: 1MB (0x100000 bytes) Error handling with proper status codes Generated Code Structure 1. Header comments (file info, settings) 2. Data functions (_GetBinData_xxx) 3. Helper functions (decode/decompress) 4. Deployment functions (_DeployFile or _GetBin) 5. Usage examples (commented) 📝 Error Handling The tool provides comprehensive error handling: Error Code Description SetError 1 Cannot read file or invalid data SetError 2 Encoding/compression failed SetError 3 Decompression failed SetError 4 Cannot create output file SetError 5 File write verification failed Error Messages: Console output for debugging MessageBox alerts for critical errors Descriptive error messages in generated code 🔧 Advanced Features Custom Function Names Function names are automatically sanitized: Removes invalid characters Includes filename and architecture Format: _GetBinData_filename_architecture Helper Function Options For Single File: _DeployFile($sDestPath = "", $bReturnHex = False) Returns binary data (default) Returns hex string ($bReturnHex = True) Writes to file ($sDestPath provided) For Multiple Files: _GetBin($sName) Switch/Case based selection Returns binary data Includes all decode/decompress logic 📊 Performance Tips Compression Trade-offs: Level 1: Faster, moderate compression Level 2: Slower, better compression Skip compression for files < 10KB Encoding Selection: Use Hex for debugging (readable) Use Base64 for smaller output size ~33% size increase with Base64 vs binary Chunk Size: Larger chunks = fewer lines but harder to edit Smaller chunks = more readable but more lines Default 4000 is optimal for most cases 🔄 Version History Version 3.0 (Current) ✅ Added Base64 encoding support ✅ Integrated LZNT compression (Level 1 & 2) ✅ Redesigned GUI with radio buttons ✅ Added _GetBin() for multiple files ✅ Enhanced _DeployFile() with flexible return options ✅ Fixed function naming (sanitization) ✅ Improved error handling and reporting ✅ Unicode support for Base64 (CryptStringToBinaryW) ✅ Workspace allocation for LZNT compression ✅ Integrated Base64.au3 library Version 2.x Legacy hex-only encoding Basic helper functions GUI mode only 📄 License MIT License - Free to use, modify, and distribute. 🙏 Acknowledgments AutoIt Community for feedback and testing LZNT_Base64.au3 library implementation Windows API documentation for LZNT compression ⚡ Quick Reference Card ╔══════════════════════════════════════════════════════════════╗ ║ QUICK REFERENCE - AutoIt Resource Embedder v3.0 ║ ╠══════════════════════════════════════════════════════════════╣ ║ GUI Mode: Double-click script ║ ║ CLI Mode: AutoIt3.exe script.au3 file1 file2 ... ║ ║ ║ ║ Encoding Options: ║ ║ • Hex - Standard hex encoding ║ ║ • Base64 - Base64 encoding ║ ║ • Hex + LZNT - Hex with compression ║ ║ • Base64+LZNT - Base64 with compression ║ ║ ║ ║ Single File: _DeployFile($path, $bReturnHex) ║ ║ Multiple Files: _GetBin($filename) ║ ║ ║ ║ Line Length: 100 - 4000 characters (default: 4000) ║ ║ Compression: Level 1 (4096) or Level 2 (0) ║ ╚══════════════════════════════════════════════════════════════╝ Made with ❤️ by Dao Van Trong - TRONG.PRO Embed anything, anywhere! App Source: #Region ;**** Directives created by AutoIt3Wrapper_GUI **** #AutoIt3Wrapper_UseX64=y #EndRegion ;**** Directives created by AutoIt3Wrapper_GUI **** ; ================================================================================================= ; Title .........: AutoIt Resource Embedder ; Author(s) .....: Dao Van Trong - TRONG.PRO ; Version .......: 3.0 (Enhanced with multiple encoding formats and compression support) ; Description ...: A professional tool to convert binary files into self-contained AutoIt functions. ; Features: Hex/Base64 encoding, LZNT compression, architecture detection, ; GUI and CLI modes, helper functions with automatic decompression/decoding. ; ================================================================================================= #Region ; *** INCLUDES *** #include <GUIConstantsEx.au3> #include <StaticConstants.au3> #include <WindowsConstants.au3> #include <ListViewConstants.au3> #include <ButtonConstants.au3> #include <ComboConstants.au3> #include <ListBoxConstants.au3> #include <EditConstants.au3> #include <StaticConstants.au3> #include <WinAPIError.au3> #include <Security.au3> #include <Memory.au3> #include <Clipboard.au3> #include <SendMessage.au3> #include <WinAPISys.au3> #include <WinAPISysWin.au3> #include <GuiStatusBar.au3> #include <Array.au3> #include <File.au3> #EndRegion ; *** INCLUDES *** #Region ; *** GLOBAL VARIABLES *** ; Global variables for GUI controls Global $g_hGUI, $g_hListView, $g_hEditOutput, $g_hInputChunkSize, $iStatusBar Global $g_hBtnAddFiles, $g_hBtnRemoveSelected, $g_hBtnClearAll, $g_hCheckAddHelpers, $g_hBtnGenerate, $g_hBtnPreview, $g_hBtnCopy, $g_hBtnSaveAll, $g_hBtnSaveSeparate, $g_hBtnExit Global $g_hRadioHex, $g_hRadioBase64, $g_hRadioHexLZNT, $g_hRadioBase64LZNT, $g_hComboCompression ; Global 2D array to store file information. ; Index [x][0]: Full Path ; Index [x][1]: File Name ; Index [x][2]: Formatted File Size ; Index [x][3]: Architecture ; Index [x][4]: Generated Function Name Global $g_aSelectedFiles[0][5] #EndRegion ; *** GLOBAL VARIABLES *** #Region ; *** SCRIPT ENTRY POINT *** ; Check if command-line arguments were provided to determine execution mode. If $CmdLine[0] > 0 Then _RunCommandLineMode() Else _RunGuiMode() EndIf #EndRegion ; *** SCRIPT ENTRY POINT *** #Region ; *** GUI MODE FUNCTIONS *** ; ------------------------------------------------------------------------------------------------- ; Function: _RunGuiMode() ; Purpose: Creates and manages the main Graphical User Interface (GUI). ; ------------------------------------------------------------------------------------------------- Func _RunGuiMode() $g_hGUI = GUICreate("AutoIt Resource Embedder by Dao Van Trong - TRONG.PRO", 795, 555) GUISetFont(9, 400, 0, "Segoe UI", $g_hGUI, 5) GUISetBkColor(0xF0F0F0) _CreateGUI_Controls() $iStatusBar = _GUICtrlStatusBar_Create($g_hGUI) _GUICtrlStatusBar_SetText($iStatusBar, "Ready | AutoIt Resource Embedder v3.0") GUISetState(@SW_SHOW, $g_hGUI) Local $nMsg While 1 $nMsg = GUIGetMsg() Switch $nMsg Case $GUI_EVENT_CLOSE, $g_hBtnExit ExitLoop Case $g_hBtnAddFiles _GUI_HandleAddFiles() Case $g_hBtnRemoveSelected _GUI_HandleRemoveSelected() Case $g_hBtnClearAll _GUI_HandleClearAll() Case $g_hBtnGenerate _GUI_HandleGenerateAll() Case $g_hBtnPreview _GUI_HandlePreviewSingle() Case $g_hBtnCopy _GUI_HandleCopyToClipboard() Case $g_hBtnSaveAll _GUI_HandleSaveAll() Case $g_hBtnSaveSeparate _GUI_HandleSaveSeparate() EndSwitch WEnd GUIDelete($g_hGUI) EndFunc ;==>_RunGuiMode ; ------------------------------------------------------------------------------------------------- ; Function: _CreateGUI_Controls() ; Purpose: Creates all controls for the main GUI window. ; ------------------------------------------------------------------------------------------------- Func _CreateGUI_Controls() GUICtrlCreateLabel("1. File Selection:", 10, 15, 150, 20, $SS_CENTERIMAGE, $GUI_WS_EX_PARENTDRAG) GUICtrlSetFont(-1, 9, 800) $g_hBtnAddFiles = GUICtrlCreateButton("Add Files...", 162, 11, 100, 25, BitOR($BS_CENTER, $BS_VCENTER)) $g_hBtnRemoveSelected = GUICtrlCreateButton("Remove Selected", 272, 11, 120, 25, BitOR($BS_CENTER, $BS_VCENTER)) $g_hBtnClearAll = GUICtrlCreateButton("Clear All", 402, 11, 80, 25, BitOR($BS_CENTER, $BS_VCENTER)) $g_hListView = GUICtrlCreateListView("File Name|Size|Architecture|Function Name", 10, 38, 780, 150) GUICtrlSendMsg($g_hListView, $LVM_SETCOLUMNWIDTH, 0, 250) GUICtrlSendMsg($g_hListView, $LVM_SETCOLUMNWIDTH, 1, 100) GUICtrlSendMsg($g_hListView, $LVM_SETCOLUMNWIDTH, 2, 100) GUICtrlSendMsg($g_hListView, $LVM_SETCOLUMNWIDTH, 3, 320) GUICtrlCreateLabel("2. Generation Options:", 10, 195, 150, 20, $SS_CENTERIMAGE, $GUI_WS_EX_PARENTDRAG) GUICtrlSetFont(-1, 9, 800) GUICtrlCreateLabel("Output Format:", 4, 220, 132, 20, BitOR($SS_RIGHT, $SS_CENTERIMAGE), $GUI_WS_EX_PARENTDRAG) GUICtrlSetFont(-1, 8, 700, 2) $g_hRadioHex = GUICtrlCreateRadio("Hex", 172, 220, 76, 22) GUICtrlSetState(-1, $GUI_CHECKED) $g_hRadioBase64 = GUICtrlCreateRadio("Base64", 252, 220, 100, 22) $g_hRadioHexLZNT = GUICtrlCreateRadio("Hex + LZNT", 358, 220, 100, 22) $g_hRadioBase64LZNT = GUICtrlCreateRadio("Base64 + LZNT", 470, 220, 100, 22) GUICtrlCreateLabel("LZNT Level:", 584, 220, 100, 20, BitOR($SS_RIGHT, $SS_CENTERIMAGE), $GUI_WS_EX_PARENTDRAG) $g_hComboCompression = GUICtrlCreateCombo("", 688, 220, 96, 25, BitOR($GUI_SS_DEFAULT_COMBO, $CBS_SIMPLE)) GUICtrlSetData($g_hComboCompression, "Level 1|Level 2", "Level 2") GUICtrlCreateLabel("Line Length (chars):", 584, 195, 100, 20, BitOR($SS_RIGHT, $SS_CENTERIMAGE), $GUI_WS_EX_PARENTDRAG) GUICtrlSetFont(-1, 8, 700, 2) $g_hInputChunkSize = GUICtrlCreateInput("4000", 688, 195, 96, 23) $g_hCheckAddHelpers = GUICtrlCreateCheckbox("Include helper functions", 172, 195, 200, 22) GUICtrlSetState(-1, $GUI_CHECKED) $g_hBtnGenerate = GUICtrlCreateButton("3. Generate All Functions", 210, 243, 304, 35, BitOR($BS_CENTER, $BS_VCENTER)) GUICtrlSetFont(-1, 10, 800) GUICtrlSetBkColor($g_hBtnGenerate, 0x90EE90) $g_hBtnPreview = GUICtrlCreateButton("Preview Single", 516, 243, 116, 35, BitOR($BS_CENTER, $BS_VCENTER)) GUICtrlCreateLabel("Generated Code:", 10, 252, 150, 20, $SS_CENTERIMAGE, $GUI_WS_EX_PARENTDRAG) GUICtrlSetFont(-1, 9, 800) $g_hEditOutput = GUICtrlCreateEdit("", 10, 280, 780, 220) GUICtrlSetData(-1, "") GUICtrlSetFont(-1, 9, 400) $g_hBtnCopy = GUICtrlCreateButton("Copy to Clipboard", 634, 243, 154, 35, BitOR($BS_CENTER, $BS_VCENTER)) GUICtrlSetFont(-1, 9, 800) $g_hBtnSaveAll = GUICtrlCreateButton("Save All to File", 14, 502, 130, 30, BitOR($BS_CENTER, $BS_VCENTER)) $g_hBtnSaveSeparate = GUICtrlCreateButton("Save Separate Files", 154, 502, 130, 30, BitOR($BS_CENTER, $BS_VCENTER)) $g_hBtnExit = GUICtrlCreateButton("Exit", 660, 502, 130, 30, BitOR($BS_CENTER, $BS_VCENTER)) GUICtrlSetBkColor($g_hBtnExit, 0xFFB6C1) EndFunc ;==>_CreateGUI_Controls ; ------------------------------------------------------------------------------------------------- ; Function: _GUI_HandleAddFiles() ; Purpose: Opens a file dialog and adds selected files to the list. ; ------------------------------------------------------------------------------------------------- Func _GUI_HandleAddFiles() Local $sFiles = FileOpenDialog("Select Files", @ScriptDir, "All Files (*.*)", 4) If @error Then _GUICtrlStatusBar_SetText($iStatusBar, "File selection cancelled") Return EndIf Local $aNewFiles = StringSplit($sFiles, "|") Local $iAdded = 0, $iSkipped = 0 If $aNewFiles[0] = 1 Then ; Single file If _AddFileToList($aNewFiles[1]) Then $iAdded = 1 Else $iSkipped = 1 EndIf Else ; Multiple files Local $sBasePath = $aNewFiles[1] For $i = 2 To $aNewFiles[0] If _AddFileToList($sBasePath & "\" & $aNewFiles[$i]) Then $iAdded += 1 Else $iSkipped += 1 EndIf Next EndIf ; Update status bar with detailed information Local $sStatus = "" If $iAdded > 0 Then $sStatus = "Added " & $iAdded & " file" & ($iAdded > 1 ? "s" : "") If $iSkipped > 0 Then $sStatus &= ($sStatus <> "" ? " | " : "") & "Skipped " & $iSkipped & " duplicate" & ($iSkipped > 1 ? "s" : "") $sStatus &= " | Total: " & UBound($g_aSelectedFiles) & " file(s)" _GUICtrlStatusBar_SetText($iStatusBar, $sStatus) EndFunc ;==>_GUI_HandleAddFiles ; ------------------------------------------------------------------------------------------------- ; Function: _GUI_HandleRemoveSelected() ; Purpose: Removes the selected file from the list. ; ------------------------------------------------------------------------------------------------- Func _GUI_HandleRemoveSelected() Local $iIndex = GUICtrlSendMsg($g_hListView, $LVM_GETNEXTITEM, -1, $LVNI_SELECTED) If $iIndex = -1 Then _GUICtrlStatusBar_SetText($iStatusBar, "No file selected") Return EndIf _ArrayDelete($g_aSelectedFiles, $iIndex) GUICtrlSendMsg($g_hListView, $LVM_DELETEITEM, $iIndex, 0) _GUICtrlStatusBar_SetText($iStatusBar, "File removed | Total: " & UBound($g_aSelectedFiles) & " file(s)") EndFunc ;==>_GUI_HandleRemoveSelected ; ------------------------------------------------------------------------------------------------- ; Function: _GUI_HandleClearAll() ; Purpose: Clears all files from the list and resets the UI. ; ------------------------------------------------------------------------------------------------- Func _GUI_HandleClearAll() ReDim $g_aSelectedFiles[0][5] GUICtrlSendMsg($g_hListView, $LVM_DELETEALLITEMS, 0, 0) GUICtrlSetData($g_hEditOutput, "") _GUICtrlStatusBar_SetText($iStatusBar, "All files cleared | Ready") EndFunc ;==>_GUI_HandleClearAll ; ------------------------------------------------------------------------------------------------- ; Function: _GUI_HandleGenerateAll() ; Purpose: Generates the complete code for all files in the list. ; ------------------------------------------------------------------------------------------------- Func _GUI_HandleGenerateAll() If UBound($g_aSelectedFiles) = 0 Then Return MsgBox(48, "Warning", "Please add at least one file first.") GUICtrlSetData($g_hEditOutput, "Generating code, please wait...") Sleep(10) Local $bAddHelpers = (GUICtrlRead($g_hCheckAddHelpers) = $GUI_CHECKED) Local $iChunkSize = _ValidateChunkSize(GUICtrlRead($g_hInputChunkSize)) ; Determine encoding/compression from radio buttons Local $bUseHex = False, $bUseBase64 = False, $bUseCompression = False, $iCompLevel = 0 If GUICtrlRead($g_hRadioHex) = $GUI_CHECKED Then $bUseHex = True ElseIf GUICtrlRead($g_hRadioBase64) = $GUI_CHECKED Then $bUseBase64 = True ElseIf GUICtrlRead($g_hRadioHexLZNT) = $GUI_CHECKED Then $bUseHex = True $bUseCompression = True $iCompLevel = (GUICtrlRead($g_hComboCompression) = "Level 2") ? 2 : 1 ElseIf GUICtrlRead($g_hRadioBase64LZNT) = $GUI_CHECKED Then $bUseBase64 = True $bUseCompression = True $iCompLevel = (GUICtrlRead($g_hComboCompression) = "Level 2") ? 2 : 1 EndIf Local $sCode = _GenerateCodeBundle($g_aSelectedFiles, $bAddHelpers, $iChunkSize, $bUseHex, $bUseBase64, $bUseCompression, $iCompLevel) GUICtrlSetData($g_hEditOutput, $sCode) _GUICtrlStatusBar_SetText($iStatusBar, "Code generated successfully for " & UBound($g_aSelectedFiles) & " file(s) | " & StringLen($sCode) & " characters") EndFunc ;==>_GUI_HandleGenerateAll ; ------------------------------------------------------------------------------------------------- ; Function: _GUI_HandlePreviewSingle() ; Purpose: Generates code for only the selected file. ; ------------------------------------------------------------------------------------------------- Func _GUI_HandlePreviewSingle() Local $iIndex = GUICtrlSendMsg($g_hListView, $LVM_GETNEXTITEM, -1, $LVNI_SELECTED) If $iIndex = -1 Then Return MsgBox(48, "Warning", "Please select a file from the list first.") GUICtrlSetData($g_hEditOutput, "Generating preview...") Sleep(10) Local $iChunkSize = _ValidateChunkSize(GUICtrlRead($g_hInputChunkSize)) ; Determine encoding/compression from radio buttons Local $bUseHex = False, $bUseBase64 = False, $bUseCompression = False, $iCompLevel = 0 If GUICtrlRead($g_hRadioHex) = $GUI_CHECKED Then $bUseHex = True ElseIf GUICtrlRead($g_hRadioBase64) = $GUI_CHECKED Then $bUseBase64 = True ElseIf GUICtrlRead($g_hRadioHexLZNT) = $GUI_CHECKED Then $bUseHex = True $bUseCompression = True $iCompLevel = (GUICtrlRead($g_hComboCompression) = "Level 2") ? 2 : 1 ElseIf GUICtrlRead($g_hRadioBase64LZNT) = $GUI_CHECKED Then $bUseBase64 = True $bUseCompression = True $iCompLevel = (GUICtrlRead($g_hComboCompression) = "Level 2") ? 2 : 1 EndIf Local $sOutput = "; Preview for: " & $g_aSelectedFiles[$iIndex][1] & @CRLF $sOutput &= "; Architecture: " & $g_aSelectedFiles[$iIndex][3] & @CRLF & @CRLF Local $sCode = _GenerateEncodedFunction($g_aSelectedFiles[$iIndex][0], $g_aSelectedFiles[$iIndex][4], $g_aSelectedFiles[$iIndex][1], $g_aSelectedFiles[$iIndex][3], $iChunkSize, $bUseHex, $bUseBase64, $bUseCompression, $iCompLevel) If GUICtrlRead($g_hCheckAddHelpers) = $GUI_CHECKED Then $sCode &= @CRLF & @CRLF & _GenerateHelperFunction($g_aSelectedFiles[$iIndex][4], $g_aSelectedFiles[$iIndex][1], $bUseHex, $bUseBase64, $bUseCompression, $iCompLevel) EndIf GUICtrlSetData($g_hEditOutput, $sOutput & $sCode) _GUICtrlStatusBar_SetText($iStatusBar, "Preview generated for: " & $g_aSelectedFiles[$iIndex][1]) EndFunc ;==>_GUI_HandlePreviewSingle ; ------------------------------------------------------------------------------------------------- ; Function: _GUI_HandleCopyToClipboard() ; Purpose: Copies the output text to the clipboard. ; ------------------------------------------------------------------------------------------------- Func _GUI_HandleCopyToClipboard() Local $sCode = GUICtrlRead($g_hEditOutput) If StringStripWS($sCode, 8) = "" Then _GUICtrlStatusBar_SetText($iStatusBar, "No code to copy") Return MsgBox(48, "Warning", "No code to copy. Please generate code first.") EndIf _ClipBoard_SetData($sCode) _GUICtrlStatusBar_SetText($iStatusBar, "Code copied to clipboard | " & StringLen($sCode) & " characters") MsgBox(64, "Success", "Code copied to clipboard successfully!") GUICtrlSetData($g_hEditOutput, $sCode) EndFunc ;==>_GUI_HandleCopyToClipboard ; ------------------------------------------------------------------------------------------------- ; Function: _GUI_HandleSaveAll() ; Purpose: Saves the generated code for all files into a single .au3 file. ; ------------------------------------------------------------------------------------------------- Func _GUI_HandleSaveAll() Local $sCode = GUICtrlRead($g_hEditOutput) If StringStripWS($sCode, 8) = "" Then Return MsgBox(48, "Warning", "No code to save. Please generate code first.") Local $sSaveFile = FileSaveDialog("Save Combined Code", @ScriptDir, "AutoIt Scripts (*.au3)", 16, "All_Embedded.au3") If @error Then Return If @error Or Not _SaveStringToFile($sSaveFile, $sCode) Then _GUICtrlStatusBar_SetText($iStatusBar, "Save failed: " & $sSaveFile) Return MsgBox(16, "Error", "Failed to save file: " & $sSaveFile) EndIf _GUICtrlStatusBar_SetText($iStatusBar, "File saved: " & $sSaveFile & " | " & _FormatFileSize(FileGetSize($sSaveFile))) MsgBox(64, "Success", "File saved successfully: " & $sSaveFile) EndFunc ;==>_GUI_HandleSaveAll ; ------------------------------------------------------------------------------------------------- ; Function: _GUI_HandleSaveSeparate() ; Purpose: Saves the generated code for each file into its own separate .au3 file. ; ------------------------------------------------------------------------------------------------- Func _GUI_HandleSaveSeparate() If UBound($g_aSelectedFiles) = 0 Then Return MsgBox(48, "Warning", "No files to process.") Local $sSaveDir = FileSelectFolder("Select folder to save separate files", @ScriptDir) If @error Then Return Local $iChunkSize = _ValidateChunkSize(GUICtrlRead($g_hInputChunkSize)) Local $bAddHelpers = (GUICtrlRead($g_hCheckAddHelpers) = $GUI_CHECKED) ; Determine encoding/compression from radio buttons Local $bUseHex = False, $bUseBase64 = False, $bUseCompression = False, $iCompLevel = 0 If GUICtrlRead($g_hRadioHex) = $GUI_CHECKED Then $bUseHex = True ElseIf GUICtrlRead($g_hRadioBase64) = $GUI_CHECKED Then $bUseBase64 = True ElseIf GUICtrlRead($g_hRadioHexLZNT) = $GUI_CHECKED Then $bUseHex = True $bUseCompression = True $iCompLevel = (GUICtrlRead($g_hComboCompression) = "Level 2") ? 2 : 1 ElseIf GUICtrlRead($g_hRadioBase64LZNT) = $GUI_CHECKED Then $bUseBase64 = True $bUseCompression = True $iCompLevel = (GUICtrlRead($g_hComboCompression) = "Level 2") ? 2 : 1 EndIf Local $iSaved = 0 For $i = 0 To UBound($g_aSelectedFiles) - 1 Local $sFilePath = $g_aSelectedFiles[$i][0] Local $sFileName = $g_aSelectedFiles[$i][1] Local $sArch = $g_aSelectedFiles[$i][3] Local $sFuncName = $g_aSelectedFiles[$i][4] Local $sDrive, $sDir, $sNameOnly, $sExt _PathSplit($sFilePath, $sDrive, $sDir, $sNameOnly, $sExt) Local $sSaveFile = $sSaveDir & "\" & $sNameOnly & "_Embedded.au3" Local $sCode = "; Generated from: " & $sFileName & @CRLF $sCode &= "; Architecture: " & $sArch & @CRLF & @CRLF $sCode &= _GenerateEncodedFunction($sFilePath, $sFuncName, $sFileName, $sArch, $iChunkSize, $bUseHex, $bUseBase64, $bUseCompression, $iCompLevel) If $bAddHelpers Then $sCode &= _GenerateHelperFunction($sFuncName, $sFileName, $bUseHex, $bUseBase64, $bUseCompression, $iCompLevel) EndIf If _SaveStringToFile($sSaveFile, $sCode) Then $iSaved += 1 Next _GUICtrlStatusBar_SetText($iStatusBar, "Saved " & $iSaved & " of " & UBound($g_aSelectedFiles) & " file(s) to: " & $sSaveDir) MsgBox(64, "Success", "Saved " & $iSaved & " of " & UBound($g_aSelectedFiles) & " files to:" & @CRLF & $sSaveDir) EndFunc ;==>_GUI_HandleSaveSeparate #EndRegion ; *** GUI MODE FUNCTIONS *** #Region ; *** COMMAND-LINE MODE FUNCTIONS *** ; ------------------------------------------------------------------------------------------------- ; Function: _RunCommandLineMode() ; Purpose: Handles the script's execution when run from the command line. ; ------------------------------------------------------------------------------------------------- Func _RunCommandLineMode() Local $aFilePaths[0] For $i = 1 To $CmdLine[0] If FileExists($CmdLine[$i]) Then _ArrayAdd($aFilePaths, $CmdLine[$i]) Else ConsoleWrite("! Warning: File not found - " & $CmdLine[$i] & @CRLF) EndIf Next If UBound($aFilePaths) = 0 Then ConsoleWrite("! Error: No valid files provided." & @CRLF & " Usage: " & @ScriptName & " <file1> [file2] ..." & @CRLF) Exit 1 EndIf Local $aFilesData[UBound($aFilePaths)][5] For $i = 0 To UBound($aFilePaths) - 1 _PopulateFileInfo($aFilesData, $i, $aFilePaths[$i]) Next ConsoleWrite("+ Generating code for " & UBound($aFilesData) & " file(s)..." & @CRLF) Local $sCode = _GenerateCodeBundle($aFilesData, True, 4000, True, False, False, 0) Local $sOutputFile If UBound($aFilesData) = 1 Then Local $sDrive, $sDir, $sFileName, $sExtension _PathSplit($aFilePaths[0], $sDrive, $sDir, $sFileName, $sExtension) $sOutputFile = $sDrive & $sDir & $sFileName & "_Embedded.au3" Else $sOutputFile = @ScriptDir & "\All_Embedded.au3" EndIf If _SaveStringToFile($sOutputFile, $sCode) Then ConsoleWrite("+ Success: Output saved to - " & $sOutputFile & @CRLF) Else ConsoleWrite("! Error: Could not create output file - " & $sOutputFile & @CRLF) Exit 1 EndIf EndFunc ;==>_RunCommandLineMode #EndRegion ; *** COMMAND-LINE MODE FUNCTIONS *** #Region ; *** FILE AND DATA HANDLING *** ; ------------------------------------------------------------------------------------------------- ; Function: _AddFileToList($sFilePath) ; Purpose: Adds a file's information to the global array and updates the GUI list. ; Prevents duplicate files from being added. ; ------------------------------------------------------------------------------------------------- Func _AddFileToList($sFilePath) ; Validate file exists If Not FileExists($sFilePath) Then _GUICtrlStatusBar_SetText($iStatusBar, "File not found: " & $sFilePath) Return False EndIf ; Check for duplicate - exact path match For $i = 0 To UBound($g_aSelectedFiles) - 1 If $g_aSelectedFiles[$i][0] = $sFilePath Then Local $sFileName = _GetFileName($sFilePath) _GUICtrlStatusBar_SetText($iStatusBar, "Duplicate skipped: " & $sFileName & " (already in list)") Return False EndIf Next ; Add new file Local $iUBound = UBound($g_aSelectedFiles) ReDim $g_aSelectedFiles[$iUBound + 1][5] _PopulateFileInfo($g_aSelectedFiles, $iUBound, $sFilePath) Local $sListViewItem = $g_aSelectedFiles[$iUBound][1] & "|" & $g_aSelectedFiles[$iUBound][2] & "|" & $g_aSelectedFiles[$iUBound][3] & "|" & $g_aSelectedFiles[$iUBound][4] GUICtrlCreateListViewItem($sListViewItem, $g_hListView) Return True EndFunc ;==>_AddFileToList ; ------------------------------------------------------------------------------------------------- ; Function: _PopulateFileInfo(ByRef $aArray, $iIndex, $sFilePath) ; Purpose: Gathers file info and populates a row in the provided 2D array. ; ------------------------------------------------------------------------------------------------- Func _PopulateFileInfo(ByRef $aArray, $iIndex, $sFilePath) Local $sFileName = _GetFileName($sFilePath) Local $sArch = _DetectArchitecture($sFilePath) $aArray[$iIndex][0] = $sFilePath $aArray[$iIndex][1] = $sFileName $aArray[$iIndex][2] = _FormatFileSize(FileGetSize($sFilePath)) $aArray[$iIndex][3] = $sArch $aArray[$iIndex][4] = "_GetBinData_" & _SanitizeName($sFileName) & "_" & _SanitizeName($sArch) EndFunc ;==>_PopulateFileInfo #EndRegion ; *** FILE AND DATA HANDLING *** #Region ; *** CORE CODE GENERATION *** ; ------------------------------------------------------------------------------------------------- ; Function: _GenerateCodeBundle(ByRef $aFiles, $bAddHelpers, $iChunkSize, $bUseHex, $bUseBase64, $bUseCompression, $iCompLevel) ; Purpose: The main code generation engine. Creates the full script content. ; ------------------------------------------------------------------------------------------------- Func _GenerateCodeBundle(ByRef $aFiles, $bAddHelpers, $iChunkSize, $bUseHex = True, $bUseBase64 = False, $bUseCompression = False, $iCompLevel = 0) Local $sOutput = "; Generated by AutoIt Resource Embedder - TRONG.PRO" & @CRLF $sOutput &= "; Total files: " & UBound($aFiles) & @CRLF $sOutput &= "; Encoding: " & ($bUseHex ? "Hex " : "") & ($bUseBase64 ? "Base64 " : "") & @CRLF $sOutput &= "; Compression: " & ($bUseCompression And $iCompLevel > 0 ? "LZNT Level " & $iCompLevel : "None") & @CRLF $sOutput &= "; Generated on: " & @YEAR & "-" & @MON & "-" & @MDAY & " " & @HOUR & ":" & @MIN & ":" & @SEC & @CRLF & @CRLF For $i = 0 To UBound($aFiles) - 1 $sOutput &= _GenerateEncodedFunction($aFiles[$i][0], $aFiles[$i][4], $aFiles[$i][1], $aFiles[$i][3], $iChunkSize, $bUseHex, $bUseBase64, $bUseCompression, $iCompLevel) & @CRLF & @CRLF Next If $bAddHelpers Then If UBound($aFiles) = 1 Then $sOutput &= _GenerateHelperFunction($aFiles[0][4], $aFiles[0][1], $bUseHex, $bUseBase64, $bUseCompression, $iCompLevel) Else $sOutput &= _GenerateMasterHelperFunctionFromArray($aFiles, $bUseHex, $bUseBase64, $bUseCompression, $iCompLevel) EndIf EndIf Return $sOutput EndFunc ;==>_GenerateCodeBundle ; ------------------------------------------------------------------------------------------------- ; Function: _GenerateEncodedFunction($sFilePath, $sFuncName, $sFileName, $sArch, $iChunkSize, $bUseHex, $bUseBase64, $bUseCompression, $iCompLevel) ; Purpose: Reads a binary file and wraps its encoded content in an AutoIt function. ; ------------------------------------------------------------------------------------------------- Func _GenerateEncodedFunction($sFilePath, $sFuncName, $sFileName, $sArch, $iChunkSize = 4000, $bUseHex = True, $bUseBase64 = False, $bUseCompression = False, $iCompLevel = 0) Local $hFile = FileOpen($sFilePath, 16) If $hFile = -1 Then ConsoleWrite("! Error: Unable to open file in binary mode: " & $sFilePath & @CRLF) Return "" EndIf Local $bData = FileRead($hFile) FileClose($hFile) If @error Or $bData = "" Then ConsoleWrite("! Error reading binary data from file: " & $sFilePath & @CRLF) Return "" EndIf ; Apply compression if requested Local $bProcessedData = $bData If $bUseCompression And $iCompLevel > 0 Then Local $iEngine = ($iCompLevel = 2) ? 258 : 2 ; 2=Standard, 258=Maximum $bProcessedData = _LZNT_Compress($bData, 16, $iEngine, False) ; Updated library signature If @error Then ConsoleWrite("! Error: LZNT compression failed for file: " & $sFilePath & @CRLF) MsgBox(16, "Compression Error", "Failed to compress file: " & $sFileName & @CRLF & @CRLF & "Please try again or disable compression.") Return "" EndIf ConsoleWrite("+ Compressed " & $sFileName & ": " & _FormatFileSize(BinaryLen($bData)) & " → " & _FormatFileSize(BinaryLen($bProcessedData)) & @CRLF) EndIf ; Generate function header Local $sOutput = "Func " & $sFuncName & "()" & @CRLF $sOutput &= @TAB & '; This function holds the encoded data for ' & $sFileName & @CRLF $sOutput &= @TAB & '; File size: ' & _FormatFileSize(FileGetSize($sFilePath)) & @CRLF $sOutput &= @TAB & '; Architecture: ' & $sArch & @CRLF $sOutput &= @TAB & '; Encoding: ' & ($bUseHex ? "Hex " : "") & ($bUseBase64 ? "Base64 " : "") & @CRLF $sOutput &= @TAB & '; Compression: ' & ($bUseCompression And $iCompLevel > 0 ? "LZNT Level " & $iCompLevel : "None") & @CRLF $sOutput &= @TAB & '; Generated by AutoIt Resource Embedder' & @CRLF ; Generate Hex data if requested If $bUseHex Then Local $sHexWithPrefix = String($bProcessedData) Local $iHexLen = StringLen($sHexWithPrefix) $sOutput &= @TAB & "Local $sHexData = '" & StringMid($sHexWithPrefix, 1, $iChunkSize) & "'" & @CRLF For $i = $iChunkSize + 1 To $iHexLen Step $iChunkSize $sOutput &= @TAB & "$sHexData &= '" & StringMid($sHexWithPrefix, $i, $iChunkSize) & "'" & @CRLF Next EndIf ; Generate Base64 data if requested If $bUseBase64 Then Local $sBase64 = _Base64Encode($bProcessedData, 0) ; 0 = no line breaks If @error Or $sBase64 = "" Then ConsoleWrite("! Error: Base64 encoding failed for file: " & $sFilePath & @CRLF) MsgBox(16, "Encoding Error", "Failed to encode file to Base64: " & $sFileName & @CRLF & @CRLF & "Please try again or use Hex encoding.") Return "" EndIf Local $iB64Len = StringLen($sBase64) $sOutput &= @TAB & "Local $sBase64Data = '" & StringMid($sBase64, 1, $iChunkSize) & "'" & @CRLF For $i = $iChunkSize + 1 To $iB64Len Step $iChunkSize $sOutput &= @TAB & "$sBase64Data &= '" & StringMid($sBase64, $i, $iChunkSize) & "'" & @CRLF Next EndIf ; Return appropriate data based on encoding options $sOutput &= @CRLF If $bUseHex And $bUseBase64 Then $sOutput &= @TAB & '; Returns array: [0] = Hex, [1] = Base64' & @CRLF $sOutput &= @TAB & 'Local $aData[2] = [$sHexData, $sBase64Data]' & @CRLF $sOutput &= @TAB & 'Return $aData' & @CRLF ElseIf $bUseHex Then $sOutput &= @TAB & 'Return $sHexData' & @CRLF Else $sOutput &= @TAB & 'Return $sBase64Data' & @CRLF EndIf $sOutput &= "EndFunc ;==>" & $sFuncName Return $sOutput EndFunc ;==>_GenerateEncodedFunction ; ------------------------------------------------------------------------------------------------- ; Function: _GenerateHelperFunction($sFuncName, $sOriginalFileName, $bUseHex, $bUseBase64, $bUseCompression, $iCompLevel) ; Purpose: Generates a helper function to deploy a single embedded file with decode/decompress support. ; ------------------------------------------------------------------------------------------------- Func _GenerateHelperFunction($sFuncName, $sOriginalFileName, $bUseHex = True, $bUseBase64 = False, $bUseCompression = False, $iCompLevel = 0) Local $sHelperFunc = @CRLF & @CRLF ; Add Base64 decode function if needed If $bUseBase64 Then $sHelperFunc &= '; -------------------------------------------------------------------------------------------------' & @CRLF $sHelperFunc &= '; Base64 Decode Function (Unicode version - matches Base64.au3 encoder)' & @CRLF $sHelperFunc &= '; -------------------------------------------------------------------------------------------------' & @CRLF $sHelperFunc &= 'Func _Base64Decode($sB64String)' & @CRLF $sHelperFunc &= @TAB & '; Remove whitespace' & @CRLF $sHelperFunc &= @TAB & '$sB64String = StringRegExpReplace($sB64String, "\s", "")' & @CRLF $sHelperFunc &= @TAB & 'If $sB64String = "" Then Return SetError(1, 0, Binary(""))' & @CRLF $sHelperFunc &= @TAB & '; Get required buffer size' & @CRLF $sHelperFunc &= @TAB & 'Local $aResult = DllCall("Crypt32.dll", "bool", "CryptStringToBinaryW", "wstr", $sB64String, "dword", StringLen($sB64String), "dword", 1, "ptr", 0, "dword*", 0, "ptr", 0, "ptr", 0)' & @CRLF $sHelperFunc &= @TAB & 'If @error Or Not $aResult[0] Then Return SetError(2, 0, Binary(""))' & @CRLF $sHelperFunc &= @TAB & 'Local $iSize = $aResult[5]' & @CRLF $sHelperFunc &= @TAB & 'Local $tOutput = DllStructCreate("byte[" & $iSize & "]")' & @CRLF $sHelperFunc &= @TAB & '; Perform decoding' & @CRLF $sHelperFunc &= @TAB & '$aResult = DllCall("Crypt32.dll", "bool", "CryptStringToBinaryW", "wstr", $sB64String, "dword", StringLen($sB64String), "dword", 1, "struct*", $tOutput, "dword*", $iSize, "ptr", 0, "ptr", 0)' & @CRLF $sHelperFunc &= @TAB & 'If @error Or Not $aResult[0] Then Return SetError(3, 0, Binary(""))' & @CRLF $sHelperFunc &= @TAB & 'Return DllStructGetData($tOutput, 1)' & @CRLF $sHelperFunc &= 'EndFunc ;==>_Base64Decode' & @CRLF & @CRLF EndIf ; Add LZNT decompress function if needed If $bUseCompression And $iCompLevel > 0 Then Local $iEngine = ($iCompLevel = 2) ? 258 : 2 $sHelperFunc &= '; -------------------------------------------------------------------------------------------------' & @CRLF $sHelperFunc &= '; LZNT Decompress Function (Engine: ' & $iEngine & ', Level: ' & $iCompLevel & ')' & @CRLF $sHelperFunc &= '; -------------------------------------------------------------------------------------------------' & @CRLF $sHelperFunc &= 'Func _LZNT_Decompress($bCompressed)' & @CRLF $sHelperFunc &= @TAB & 'Local $tInput = DllStructCreate("byte[" & BinaryLen($bCompressed) & "]")' & @CRLF $sHelperFunc &= @TAB & 'DllStructSetData($tInput, 1, $bCompressed)' & @CRLF $sHelperFunc &= @TAB & 'Local $tOutput = DllStructCreate("byte[" & (BinaryLen($bCompressed) * 16) & "]")' & @CRLF $sHelperFunc &= @TAB & 'Local $aRet = DllCall("ntdll.dll", "int", "RtlDecompressBuffer", "ushort", ' & $iEngine & ', "ptr", DllStructGetPtr($tOutput), "dword", DllStructGetSize($tOutput), "ptr", DllStructGetPtr($tInput), "dword", DllStructGetSize($tInput), "dword*", 0)' & @CRLF $sHelperFunc &= @TAB & 'If @error Or $aRet[0] <> 0 Then Return SetError(1, 0, Binary(""))' & @CRLF $sHelperFunc &= @TAB & 'Local $tOut = DllStructCreate("byte[" & $aRet[6] & "]", DllStructGetPtr($tOutput))' & @CRLF $sHelperFunc &= @TAB & 'Return DllStructGetData($tOut, 1)' & @CRLF $sHelperFunc &= 'EndFunc ;==>_LZNT_Decompress' & @CRLF & @CRLF EndIf ; Add WriteBinaryFile helper function $sHelperFunc &= '; -------------------------------------------------------------------------------------------------' & @CRLF $sHelperFunc &= '; Write Binary File Function' & @CRLF $sHelperFunc &= '; -------------------------------------------------------------------------------------------------' & @CRLF $sHelperFunc &= 'Func _WriteBinaryFile($sFilePath, $bBinaryData)' & @CRLF $sHelperFunc &= @TAB & 'If Not IsBinary($bBinaryData) Then Return SetError(1, 0, False)' & @CRLF $sHelperFunc &= @TAB & 'If BinaryLen($bBinaryData) = 0 Then Return SetError(2, 0, False)' & @CRLF $sHelperFunc &= @TAB & '; Remove existing file/folder' & @CRLF $sHelperFunc &= @TAB & 'If FileExists($sFilePath) Then' & @CRLF $sHelperFunc &= @TAB & @TAB & 'FileSetAttrib($sFilePath, "-RASH", 1)' & @CRLF $sHelperFunc &= @TAB & @TAB & 'DirRemove($sFilePath, 1)' & @CRLF $sHelperFunc &= @TAB & @TAB & 'FileDelete($sFilePath)' & @CRLF $sHelperFunc &= @TAB & 'EndIf' & @CRLF $sHelperFunc &= @TAB & '; Write binary data' & @CRLF $sHelperFunc &= @TAB & 'Local $hFile = FileOpen($sFilePath, 2 + 8 + 16) ; Write + Create + Binary' & @CRLF $sHelperFunc &= @TAB & 'If $hFile = -1 Then Return SetError(3, 0, False)' & @CRLF $sHelperFunc &= @TAB & 'FileWrite($hFile, $bBinaryData)' & @CRLF $sHelperFunc &= @TAB & 'FileClose($hFile)' & @CRLF $sHelperFunc &= @TAB & 'Return FileExists($sFilePath)' & @CRLF $sHelperFunc &= 'EndFunc ;==>_WriteBinaryFile' & @CRLF & @CRLF ; Generate deployment function $sHelperFunc &= '; =================================================================' & @CRLF $sHelperFunc &= '; Helper function to deploy the file from encoded data.' & @CRLF $sHelperFunc &= '; Parameters: $sDestPath - File path to write (empty = return binary)' & @CRLF $sHelperFunc &= '; $bReturnHex - Return hex string instead of binary (Default: False)' & @CRLF $sHelperFunc &= '; Encoding: ' & ($bUseHex ? "Hex " : "") & ($bUseBase64 ? "Base64 " : "") & @CRLF $sHelperFunc &= '; Compression: ' & ($bUseCompression And $iCompLevel > 0 ? "LZNT Level " & $iCompLevel : "None") & @CRLF $sHelperFunc &= '; =================================================================' & @CRLF $sHelperFunc &= 'Func _DeployFile($sDestPath = "", $bReturnHex = False)' & @CRLF $sHelperFunc &= @TAB & '; Get encoded data from main function' & @CRLF ; Handle data retrieval based on encoding options If $bUseHex And $bUseBase64 Then $sHelperFunc &= @TAB & 'Local $aData = ' & $sFuncName & '()' & @CRLF $sHelperFunc &= @TAB & 'If Not IsArray($aData) Then Return SetError(1, 0, "")' & @CRLF $sHelperFunc &= @TAB & 'Local $bBinary = Binary($aData[0]) ; Use Hex data' & @CRLF ElseIf $bUseHex Then $sHelperFunc &= @TAB & 'Local $sHexData = ' & $sFuncName & '()' & @CRLF $sHelperFunc &= @TAB & 'If $sHexData = "" Then Return SetError(1, 0, "")' & @CRLF $sHelperFunc &= @TAB & 'Local $bBinary = Binary($sHexData)' & @CRLF Else $sHelperFunc &= @TAB & 'Local $sBase64Data = ' & $sFuncName & '()' & @CRLF $sHelperFunc &= @TAB & 'If $sBase64Data = "" Then Return SetError(1, 0, "")' & @CRLF $sHelperFunc &= @TAB & 'Local $bBinary = _Base64Decode($sBase64Data)' & @CRLF $sHelperFunc &= @TAB & 'If @error Then Return SetError(2, 0, "")' & @CRLF EndIf ; Add decompression if needed If $bUseCompression And $iCompLevel > 0 Then $sHelperFunc &= @CRLF & @TAB & '; Decompress the data' & @CRLF $sHelperFunc &= @TAB & '$bBinary = _LZNT_Decompress($bBinary)' & @CRLF $sHelperFunc &= @TAB & 'If @error Then Return SetError(3, 0, "")' & @CRLF EndIf ; Return binary/hex or write to file $sHelperFunc &= @CRLF & @TAB & '; If no destination path, return binary or hex string' & @CRLF $sHelperFunc &= @TAB & 'If $sDestPath = "" Then' & @CRLF $sHelperFunc &= @TAB & @TAB & 'If $bReturnHex Then' & @CRLF $sHelperFunc &= @TAB & @TAB & @TAB & 'Return StringTrimLeft($bBinary, 2) ; Remove "0x" prefix' & @CRLF $sHelperFunc &= @TAB & @TAB & 'Else' & @CRLF $sHelperFunc &= @TAB & @TAB & @TAB & 'Return $bBinary' & @CRLF $sHelperFunc &= @TAB & @TAB & 'EndIf' & @CRLF $sHelperFunc &= @TAB & 'EndIf' & @CRLF $sHelperFunc &= @CRLF & @TAB & '; Write binary data to file' & @CRLF $sHelperFunc &= @TAB & 'If Not _WriteBinaryFile($sDestPath, $bBinary) Then Return SetError(4, 0, "")' & @CRLF $sHelperFunc &= @TAB & 'Return $sDestPath' & @CRLF $sHelperFunc &= 'EndFunc ;==>_DeployFile' & @CRLF & @CRLF $sHelperFunc &= '; Example usage:' & @CRLF $sHelperFunc &= '; $bBinary = _DeployFile() ; Get binary data' & @CRLF $sHelperFunc &= '; $sHex = _DeployFile("", True) ; Get hex string' & @CRLF $sHelperFunc &= '; $sPath = _DeployFile(@TempDir & "\' & $sOriginalFileName & '") ; Write to file' & @CRLF Return $sHelperFunc EndFunc ;==>_GenerateHelperFunction ; ------------------------------------------------------------------------------------------------- ; Function: _GenerateMasterHelperFunctionFromArray(ByRef $aFiles, $bUseHex, $bUseBase64, $bUseCompression, $iCompLevel) ; Purpose: Generates _GetBin() function with Switch/Case for all embedded files. ; ------------------------------------------------------------------------------------------------- Func _GenerateMasterHelperFunctionFromArray(ByRef $aFiles, $bUseHex = True, $bUseBase64 = False, $bUseCompression = False, $iCompLevel = 0) Local $sHelperFunc = @CRLF & @CRLF ; Add Base64 decode function if needed If $bUseBase64 Then $sHelperFunc &= '; -------------------------------------------------------------------------------------------------' & @CRLF $sHelperFunc &= '; Base64 Decode Function (Unicode version - matches Base64.au3 encoder)' & @CRLF $sHelperFunc &= '; -------------------------------------------------------------------------------------------------' & @CRLF $sHelperFunc &= 'Func _Base64Decode($sB64String)' & @CRLF $sHelperFunc &= @TAB & '; Remove whitespace' & @CRLF $sHelperFunc &= @TAB & '$sB64String = StringRegExpReplace($sB64String, "\s", "")' & @CRLF $sHelperFunc &= @TAB & 'If $sB64String = "" Then Return SetError(1, 0, Binary(""))' & @CRLF $sHelperFunc &= @TAB & '; Get required buffer size' & @CRLF $sHelperFunc &= @TAB & 'Local $aResult = DllCall("Crypt32.dll", "bool", "CryptStringToBinaryW", "wstr", $sB64String, "dword", StringLen($sB64String), "dword", 1, "ptr", 0, "dword*", 0, "ptr", 0, "ptr", 0)' & @CRLF $sHelperFunc &= @TAB & 'If @error Or Not $aResult[0] Then Return SetError(2, 0, Binary(""))' & @CRLF $sHelperFunc &= @TAB & 'Local $iSize = $aResult[5]' & @CRLF $sHelperFunc &= @TAB & 'Local $tOutput = DllStructCreate("byte[" & $iSize & "]")' & @CRLF $sHelperFunc &= @TAB & '; Perform decoding' & @CRLF $sHelperFunc &= @TAB & '$aResult = DllCall("Crypt32.dll", "bool", "CryptStringToBinaryW", "wstr", $sB64String, "dword", StringLen($sB64String), "dword", 1, "struct*", $tOutput, "dword*", $iSize, "ptr", 0, "ptr", 0)' & @CRLF $sHelperFunc &= @TAB & 'If @error Or Not $aResult[0] Then Return SetError(3, 0, Binary(""))' & @CRLF $sHelperFunc &= @TAB & 'Return DllStructGetData($tOutput, 1)' & @CRLF $sHelperFunc &= 'EndFunc ;==>_Base64Decode' & @CRLF & @CRLF EndIf ; Add LZNT decompress function if needed If $bUseCompression And $iCompLevel > 0 Then Local $iEngine = ($iCompLevel = 2) ? 258 : 2 $sHelperFunc &= '; -------------------------------------------------------------------------------------------------' & @CRLF $sHelperFunc &= '; LZNT Decompress Function (Engine: ' & $iEngine & ', Level: ' & $iCompLevel & ')' & @CRLF $sHelperFunc &= '; -------------------------------------------------------------------------------------------------' & @CRLF $sHelperFunc &= 'Func _LZNT_Decompress($bCompressed)' & @CRLF $sHelperFunc &= @TAB & 'Local $tInput = DllStructCreate("byte[" & BinaryLen($bCompressed) & "]")' & @CRLF $sHelperFunc &= @TAB & 'DllStructSetData($tInput, 1, $bCompressed)' & @CRLF $sHelperFunc &= @TAB & 'Local $tOutput = DllStructCreate("byte[" & (BinaryLen($bCompressed) * 16) & "]")' & @CRLF $sHelperFunc &= @TAB & 'Local $aRet = DllCall("ntdll.dll", "int", "RtlDecompressBuffer", "ushort", ' & $iEngine & ', "ptr", DllStructGetPtr($tOutput), "dword", DllStructGetSize($tOutput), "ptr", DllStructGetPtr($tInput), "dword", DllStructGetSize($tInput), "dword*", 0)' & @CRLF $sHelperFunc &= @TAB & 'If @error Or $aRet[0] <> 0 Then Return SetError(1, 0, Binary(""))' & @CRLF $sHelperFunc &= @TAB & 'Local $tOut = DllStructCreate("byte[" & $aRet[6] & "]", DllStructGetPtr($tOutput))' & @CRLF $sHelperFunc &= @TAB & 'Return DllStructGetData($tOut, 1)' & @CRLF $sHelperFunc &= 'EndFunc ;==>_LZNT_Decompress' & @CRLF & @CRLF EndIf ; Add WriteBinaryFile helper function $sHelperFunc &= '; -------------------------------------------------------------------------------------------------' & @CRLF $sHelperFunc &= '; Write Binary File Function' & @CRLF $sHelperFunc &= '; -------------------------------------------------------------------------------------------------' & @CRLF $sHelperFunc &= 'Func _WriteBinaryFile($sFilePath, $bBinaryData)' & @CRLF $sHelperFunc &= @TAB & 'If Not IsBinary($bBinaryData) Then Return SetError(1, 0, False)' & @CRLF $sHelperFunc &= @TAB & 'If BinaryLen($bBinaryData) = 0 Then Return SetError(2, 0, False)' & @CRLF $sHelperFunc &= @TAB & '; Remove existing file/folder' & @CRLF $sHelperFunc &= @TAB & 'If FileExists($sFilePath) Then' & @CRLF $sHelperFunc &= @TAB & @TAB & 'FileSetAttrib($sFilePath, "-RASH", 1)' & @CRLF $sHelperFunc &= @TAB & @TAB & 'DirRemove($sFilePath, 1)' & @CRLF $sHelperFunc &= @TAB & @TAB & 'FileDelete($sFilePath)' & @CRLF $sHelperFunc &= @TAB & 'EndIf' & @CRLF $sHelperFunc &= @TAB & '; Write binary data' & @CRLF $sHelperFunc &= @TAB & 'Local $hFile = FileOpen($sFilePath, 2 + 8 + 16) ; Write + Create + Binary' & @CRLF $sHelperFunc &= @TAB & 'If $hFile = -1 Then Return SetError(3, 0, False)' & @CRLF $sHelperFunc &= @TAB & 'FileWrite($hFile, $bBinaryData)' & @CRLF $sHelperFunc &= @TAB & 'FileClose($hFile)' & @CRLF $sHelperFunc &= @TAB & 'Return FileExists($sFilePath)' & @CRLF $sHelperFunc &= 'EndFunc ;==>_WriteBinaryFile' & @CRLF & @CRLF $sHelperFunc &= '; =================================================================' & @CRLF $sHelperFunc &= '; Helper function to get binary data by filename.' & @CRLF $sHelperFunc &= '; Usage: $bData = _GetBin("filename.ext")' & @CRLF $sHelperFunc &= '; Encoding: ' & ($bUseHex ? "Hex " : "") & ($bUseBase64 ? "Base64 " : "") & @CRLF $sHelperFunc &= '; Compression: ' & ($bUseCompression And $iCompLevel > 0 ? "LZNT Level " & $iCompLevel : "None") & @CRLF $sHelperFunc &= '; =================================================================' & @CRLF $sHelperFunc &= 'Func _GetBin($sName)' & @CRLF $sHelperFunc &= @TAB & 'Local $sData = ""' & @CRLF $sHelperFunc &= @TAB & 'Switch $sName' & @CRLF ; Generate Switch cases for each file For $i = 0 To UBound($aFiles) - 1 Local $sFileName = $aFiles[$i][1] Local $sFuncName = $aFiles[$i][4] $sHelperFunc &= @TAB & @TAB & 'Case "' & $sFileName & '"' & @CRLF $sHelperFunc &= @TAB & @TAB & @TAB & '$sData = ' & $sFuncName & '()' & @CRLF Next $sHelperFunc &= @TAB & 'EndSwitch' & @CRLF $sHelperFunc &= @CRLF $sHelperFunc &= @TAB & '; Decode from encoding format to binary' & @CRLF $sHelperFunc &= @TAB & 'If $sData = "" Then Return SetError(1, 0, Binary(""))' & @CRLF $sHelperFunc &= @TAB & 'Local $bData' & @CRLF If $bUseBase64 Then $sHelperFunc &= @TAB & '$bData = _Base64Decode($sData)' & @CRLF $sHelperFunc &= @TAB & 'If @error Then Return SetError(2, 0, Binary(""))' & @CRLF Else $sHelperFunc &= @TAB & '$bData = Binary($sData) ; Hex to binary' & @CRLF EndIf ; Add decompression if needed If $bUseCompression And $iCompLevel > 0 Then $sHelperFunc &= @CRLF & @TAB & '; Decompress the data' & @CRLF $sHelperFunc &= @TAB & '$bData = _LZNT_Decompress($bData)' & @CRLF $sHelperFunc &= @TAB & 'If @error Then Return SetError(3, 0, Binary(""))' & @CRLF EndIf $sHelperFunc &= @CRLF $sHelperFunc &= @TAB & 'Return $bData' & @CRLF $sHelperFunc &= 'EndFunc ;==>_GetBin' & @CRLF & @CRLF $sHelperFunc &= '; Example usage:' & @CRLF For $i = 0 To UBound($aFiles) - 1 Local $sFileName = $aFiles[$i][1] $sHelperFunc &= '; $bData = _GetBin("' & $sFileName & '")' & @CRLF $sHelperFunc &= '; _WriteBinaryFile(@TempDir & "\\' & $sFileName & '", $bData)' & @CRLF Next Return $sHelperFunc EndFunc ;==>_GenerateMasterHelperFunctionFromArray #EndRegion ; *** CORE CODE GENERATION *** #Region ; *** PE HEADER AND ARCHITECTURE DETECTION *** ; ------------------------------------------------------------------------------------------------- ; Function: _DetectArchitecture($sFilePath) ; Purpose: A wrapper that returns the architecture string for a file. ; ------------------------------------------------------------------------------------------------- Func _DetectArchitecture($sFilePath) Local $sArch = _DetectArchitecture_File($sFilePath) If @error Then Return "N/A" Return $sArch EndFunc ;==>_DetectArchitecture ; ------------------------------------------------------------------------------------------------- ; Function: _DetectArchitecture_File($sFilePath) ; Purpose: Reads a file's PE headers to identify the target CPU architecture. ; ------------------------------------------------------------------------------------------------- Func _DetectArchitecture_File($sFilePath) If Not FileExists($sFilePath) Then Return SetError(1, 0, "FILE_NOT_FOUND") Local $hFile = FileOpen($sFilePath, 16) If $hFile = -1 Then Return SetError(2, 0, "CANNOT_OPEN_FILE") Local $bDOSHeader = FileRead($hFile, 64) If @error Then FileClose($hFile) Return SetError(3, 0, "CANNOT_READ_DOS_HEADER") EndIf If BinaryMid($bDOSHeader, 1, 2) <> "0x4D5A" Then FileClose($hFile) Return "Not PE" EndIf Local $iPEOffset = _BinaryToInt(BinaryMid($bDOSHeader, 61, 4)) FileSetPos($hFile, $iPEOffset, $FILE_BEGIN) Local $bPESig = FileRead($hFile, 4) If @error Or $bPESig <> "0x50450000" Then FileClose($hFile) Return SetError(5, 0, "INVALID_PE_SIGNATURE") EndIf Local $bCOFF = FileRead($hFile, 2) FileClose($hFile) If @error Then Return SetError(6, 0, "CANNOT_READ_COFF_HEADER") Local $iMachine = _BinaryToInt($bCOFF) Switch $iMachine Case 0x014c Return "x86" Case 0x8664 Return "x64" Case 0x01c0, 0x01c4 Return "ARM" Case 0xAA64 Return "ARM64" Case 0x0200 Return "IA64" Case Else Return "UNKNOWN_0x" & Hex($iMachine, 4) EndSwitch EndFunc ;==>_DetectArchitecture_File ; ------------------------------------------------------------------------------------------------- ; Function: _BinaryToInt($bData) ; Purpose: Converts a little-endian binary string to an integer value. ; ------------------------------------------------------------------------------------------------- Func _BinaryToInt($bData) Local $iResult = 0 For $i = 1 To BinaryLen($bData) $iResult += Number(BinaryMid($bData, $i, 1)) * (256 ^ ($i - 1)) Next Return $iResult EndFunc ;==>_BinaryToInt #EndRegion ; *** PE HEADER AND ARCHITECTURE DETECTION *** #Region ; *** UTILITY FUNCTIONS *** ; ------------------------------------------------------------------------------------------------- ; Function: _SanitizeName($sInput) ; Purpose: Removes illegal characters from a string to make it a valid function name. ; ------------------------------------------------------------------------------------------------- Func _SanitizeName($sInput) Local $sCleaned = StringRegExpReplace($sInput, "[^a-zA-Z0-9_]", "") If StringLeft($sCleaned, 1) = "$" Then $sCleaned = StringTrimLeft($sCleaned, 1) Return $sCleaned EndFunc ;==>_SanitizeName ; ------------------------------------------------------------------------------------------------- ; Function: _GetFileName($sFilePath) ; Purpose: Extracts the filename and extension from a full path. ; ------------------------------------------------------------------------------------------------- Func _GetFileName($sFilePath) Return StringRegExpReplace($sFilePath, "^.*\\", "") EndFunc ;==>_GetFileName ; ------------------------------------------------------------------------------------------------- ; Function: _FormatFileSize($iBytes) ; Purpose: Converts a file size in bytes into a human-readable string (KB, MB, GB). ; ------------------------------------------------------------------------------------------------- Func _FormatFileSize($iBytes) If $iBytes < 1024 Then Return $iBytes & " B" ElseIf $iBytes < 1048576 Then Return Round($iBytes / 1024, 1) & " KB" ElseIf $iBytes < 1073741824 Then Return Round($iBytes / 1048576, 2) & " MB" Else Return Round($iBytes / 1073741824, 2) & " GB" EndIf EndFunc ;==>_FormatFileSize ; ------------------------------------------------------------------------------------------------- ; Function: _ValidateChunkSize($iChunkSize) ; Purpose: Ensures the chunk size is within a valid range. ; ------------------------------------------------------------------------------------------------- Func _ValidateChunkSize($iChunkSize) ; First, check if the input from the GUI is a string containing only digits. If Not StringIsDigit($iChunkSize) Then Return 4000 ; If not, it's invalid, return the default value. EndIf ; If it is a digit string, convert it to a real number. Local $nChunkSize = Number($iChunkSize) If ($iChunkSize < 100) Or ($iChunkSize > 4000) Then Return 4000 EndIf Return Int($iChunkSize) EndFunc ;==>_ValidateChunkSize ; ------------------------------------------------------------------------------------------------- ; Function: _SaveStringToFile($sFilePath, $sContent) ; Purpose: A robust function to save a string to a file. ; Returns: True on success, False on failure. ; ------------------------------------------------------------------------------------------------- Func _SaveStringToFile($sFilePath, $sContent) Local $hFile = FileOpen($sFilePath, 2) If $hFile = -1 Then Return False Local $bSuccess = FileWrite($hFile, $sContent) FileClose($hFile) Return $bSuccess EndFunc ;==>_SaveStringToFile Func _LZNT_Compress($bInput, $iOrigSize = 16, $iEngine = 258, $bBase64 = False, $iLineLen = 1024) $bInput = Binary($bInput) If (BinaryLen($bInput) < 1) Then Return SetError(-1, 0, "") If $iEngine <> 2 And $iEngine <> 258 Then $iEngine = 258 Local $tInput = DllStructCreate("byte[" & BinaryLen($bInput) & "]") DllStructSetData($tInput, 1, $bInput) Local $aCall = DllCall("ntdll.dll", "int", "RtlGetCompressionWorkSpaceSize", _ "ushort", $iEngine, "dword*", 0, "dword*", 0) If @error Or $aCall[0] Then Return SetError(1, 0, "") Local $tWork = DllStructCreate("byte[" & $aCall[2] & "]") If ($iOrigSize < 1) Then $iOrigSize = 16 Local $iLen = $iOrigSize * DllStructGetSize($tInput) Local $tBuffer = DllStructCreate("byte[" & $iLen & "]") $aCall = DllCall("ntdll.dll", "int", "RtlCompressBuffer", _ "ushort", $iEngine, _ "ptr", DllStructGetPtr($tInput), "dword", DllStructGetSize($tInput), _ "ptr", DllStructGetPtr($tBuffer), "dword", DllStructGetSize($tBuffer), _ "dword", 4096, "dword*", 0, "ptr", DllStructGetPtr($tWork)) If @error Or $aCall[0] Then Return SetError(2, 0, "") Local $tOut = DllStructCreate("byte[" & $aCall[7] & "]", DllStructGetPtr($tBuffer)) Local $bOut = DllStructGetData($tOut, 1) If $bBase64 Then Return SetError(0, DllStructGetSize($tInput), _Base64Encode($bOut, $iLineLen)) Return SetError(0, DllStructGetSize($tInput), $bOut) EndFunc ;==>_LZNT_Compress Func _LZNT_Decompress($vInput, $iOrigSize = 16, $iEngine = 258, $bBase64 = False) Local $bInput If $bBase64 Then $bInput = _Base64Decode($vInput) Else $bInput = $vInput EndIf $bInput = Binary($bInput) If (BinaryLen($bInput) < 1) Then Return SetError(-1, 0, "") If $iEngine <> 2 And $iEngine <> 258 Then $iEngine = 258 Local $tInput = DllStructCreate("byte[" & BinaryLen($bInput) & "]") DllStructSetData($tInput, 1, $bInput) If ($iOrigSize < 1) Then $iOrigSize = 16 Local $iLen = $iOrigSize * DllStructGetSize($tInput) Local $tBuffer = DllStructCreate("byte[" & $iLen & "]") Local $aCall = DllCall("ntdll.dll", "int", "RtlDecompressBuffer", _ "ushort", $iEngine, _ "ptr", DllStructGetPtr($tBuffer), "dword", DllStructGetSize($tBuffer), _ "ptr", DllStructGetPtr($tInput), "dword", DllStructGetSize($tInput), _ "dword*", 0) If @error Or $aCall[0] Then Return SetError(1, 0, "") Local $tOut = DllStructCreate("byte[" & $aCall[6] & "]", DllStructGetPtr($tBuffer)) Return SetError(0, $aCall[6], DllStructGetData($tOut, 1)) EndFunc ;==>_LZNT_Decompress Func _LZNT_CompressStr($sInput, $iOrigSize = 16, $iEncoding = 4, $iEngine = 2, $bBase64 = False, $iLineLen = 1024) Local $bData = StringToBinary($sInput, $iEncoding) Local $sReturn = _LZNT_Compress($bData, $iOrigSize, $iEngine, $bBase64, $iLineLen) Return SetError(@error, @extended, $sReturn) EndFunc ;==>_LZNT_CompressStr Func _LZNT_DecompressStr($vInput, $iOrigSize = 16, $iEncoding = 4, $iEngine = 2, $bBase64 = False) Local $bData = _LZNT_Decompress($vInput, $iOrigSize, $iEngine, $bBase64) If @error Then Return SetError(1, 0, "") Return BinaryToString($bData, $iEncoding) EndFunc ;==>_LZNT_DecompressStr Func _Base64Encode($bData, $iLineLen = 0) If ($iLineLen < 1) Then $iLineLen = 0 $bData = Binary($bData) Local $tInput = DllStructCreate("byte[" & BinaryLen($bData) & "]") DllStructSetData($tInput, 1, $bData) Local $iFlags = 0x40000001 ; CRYPT_STRING_BASE64 | CRYPT_STRING_NOCRLF ; Get required buffer size Local $aResult = DllCall("Crypt32.dll", "bool", "CryptBinaryToStringW", _ "struct*", $tInput, _ "dword", DllStructGetSize($tInput), _ "dword", $iFlags, _ "ptr", 0, _ "dword*", 0) If @error Or Not $aResult[0] Then Return SetError(1, 0, "") Local $iSize = $aResult[5] Local $tOutput = DllStructCreate("wchar[" & $iSize & "]") ; Perform encoding $aResult = DllCall("Crypt32.dll", "bool", "CryptBinaryToStringW", _ "struct*", $tInput, _ "dword", DllStructGetSize($tInput), _ "dword", $iFlags, _ "struct*", $tOutput, _ "dword*", $iSize) If @error Or Not $aResult[0] Then Return SetError(2, 0, "") Local $sOut = DllStructGetData($tOutput, 1) ; Manual wrap for embedding in AutoIt source If ($iLineLen > 0) And (StringLen($sOut) > $iLineLen) Then Local $sWrapped = "" For $i = 1 To StringLen($sOut) Step $iLineLen $sWrapped &= StringMid($sOut, $i, $iLineLen) & @CRLF Next $sOut = StringTrimRight($sWrapped, 2) EndIf Return $sOut EndFunc ;==>_Base64Encode Func _Base64EncodeStr($sInput, $iLineLen = 0, $iEncodeType = 4) If ($iLineLen < 1) Then $iLineLen = 0 If ($iEncodeType > 4) Or ($iEncodeType < 1) Then $iEncodeType = 4 Local $bBinary = StringToBinary($sInput, $iEncodeType) Local $sReturn = _Base64Encode($bBinary, $iLineLen) Return SetError(@error, @extended, $sReturn) EndFunc ;==>_Base64EncodeStr Func _Base64Decode($sInput, $bReturnType = 0) If ($bReturnType > 4) Or ($bReturnType < 1) Then $bReturnType = 0 ; Remove all whitespace and CRLF $sInput = StringRegExpReplace($sInput, "\s", "") If $sInput = "" Then Return SetError(1, 0, Binary("")) Local $iFlags = 0x1 ; CRYPT_STRING_BASE64 ; Get required buffer size Local $aResult = DllCall("Crypt32.dll", "bool", "CryptStringToBinaryW", _ "wstr", $sInput, _ "dword", StringLen($sInput), _ "dword", $iFlags, _ "ptr", 0, _ "dword*", 0, _ "ptr", 0, _ "ptr", 0) If @error Or Not $aResult[0] Then Return SetError(2, 0, Binary("")) Local $iSize = $aResult[5] Local $tOutput = DllStructCreate("byte[" & $iSize & "]") ; Perform decoding $aResult = DllCall("Crypt32.dll", "bool", "CryptStringToBinaryW", _ "wstr", $sInput, _ "dword", StringLen($sInput), _ "dword", $iFlags, _ "struct*", $tOutput, _ "dword*", $iSize, _ "ptr", 0, _ "ptr", 0) If @error Or Not $aResult[0] Then Return SetError(3, 0, Binary("")) Local $bBinary = DllStructGetData($tOutput, 1) If ($bReturnType = 0) Then Return $bBinary Else ; Convert binary to string with specified encoding Return BinaryToString($bBinary, $bReturnType) EndIf EndFunc ;==>_Base64Decode Func _Base64DecodeStr($sInput, $iDecodeType = 4) Local $sReturn = _Base64Decode($sInput, $iDecodeType) Return SetError(@error, @extended, $sReturn) EndFunc ;==>_Base64DecodeStr #EndRegion ; *** UTILITY FUNCTIONS ***
    1 point
  4. In order not to pollute other threads, here's one dedicated to Windows.UI controls and examples. These are for use with Xaml Islands, NOT WinUI3 - although porting them across shouldn't be too demanding. Both methods have their pros and cons - but I'd say the XAML Island approach is bit more robust at this point in time. Don't forget to update your manifests to make this work! (background/details in this thread) Download PS. More than happy for this to be a community thing if anyone else wishes to contribute
    1 point
  5. @Nine I was doing some testing with your WCD IPC UDF and I was very impressed with it. It really is quite simple yet such a genius idea and very efficient as well. Testing with your scripts worked perfectly. But it didn't work when I integrated it into my script. Is it possible that it didn't work with my script because my script is already a GUI script? I checked with System Informer and there wasn't a window titled "WCDServer". It would've shown there whether it was hidden or not. EDIT: I figured out the problem. I was using _WinAPI_SetWindowText to set the title for the AutoIt window specifically but it was changing the title from "WCDServer" to the other title that I was using previously. This is something that I can work around. Your UDF is the perfect solution to my problem. Thank you.
    1 point
  6. You're probably missing the proper vc_redist dll's since you're on such old OS. https://learn.microsoft.com/en-us/cpp/windows/latest-supported-vc-redist?view=msvc-170
    1 point
×
×
  • Create New...