<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Stefor07</title>
    <description>The latest articles on DEV Community by Stefor07 (@stefor07).</description>
    <link>https://dev.to/stefor07</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F1273145%2F098addc4-321b-4cb4-95d4-553ff9bc3da9.jpeg</url>
      <title>DEV Community: Stefor07</title>
      <link>https://dev.to/stefor07</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/stefor07"/>
    <language>en</language>
    <item>
      <title>Nested Virtualization on Windows 11: The VBS Conflict Explained</title>
      <dc:creator>Stefor07</dc:creator>
      <pubDate>Thu, 12 Feb 2026 20:50:11 +0000</pubDate>
      <link>https://dev.to/stefor07/windows-11-vbs-vs-desktop-hypervisors-a-deep-dive-into-vt-x-conflicts-j8n</link>
      <guid>https://dev.to/stefor07/windows-11-vbs-vs-desktop-hypervisors-a-deep-dive-into-vt-x-conflicts-j8n</guid>
      <description>&lt;h1&gt;
  
  
  Introduction
&lt;/h1&gt;

&lt;p&gt;After upgrading to a modern system with full virtualization support — including &lt;strong&gt;VT-x, EPT, IOMMU, TPM 2.0, and Secure Boot&lt;/strong&gt; — I expected everything to work flawlessly. Instead, I encountered crashes and instability when running &lt;strong&gt;nested virtualization&lt;/strong&gt; scenarios, particularly when attempting to run &lt;strong&gt;VMware inside VMware Workstation Pro&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;At first, I suspected hardware instability, BIOS misconfiguration, or a VMware bug. However, after extensive testing, I discovered the real culprit: &lt;strong&gt;Windows Virtualization-Based Security (VBS)&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;This article covers:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;How VBS affects desktop hypervisors on modern &lt;strong&gt;Windows 11 (24H2/25H2)&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;Why nested virtualization fails under certain configurations&lt;/li&gt;
&lt;li&gt;Practical solutions for advanced lab environments requiring full &lt;strong&gt;VT-x&lt;/strong&gt; access&lt;/li&gt;
&lt;/ul&gt;

&lt;h1&gt;
  
  
  The Problem: VMware Nested Virtualization Failures
&lt;/h1&gt;

&lt;p&gt;The issue surfaced when I upgraded to a &lt;strong&gt;14th generation Intel CPU&lt;/strong&gt; with hybrid cores (P-cores and E-cores). While &lt;strong&gt;VMware Workstation Pro&lt;/strong&gt; ran perfectly on the host, problems arose when I tried running &lt;strong&gt;VMware inside a Windows 11 24H2 VM&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Attempting to boot a Windows 11 ISO inside the nested VM resulted in an immediate crash: VMware reported that &lt;strong&gt;an exception had caused a breakpoint&lt;/strong&gt;, and the VM shut down.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fenrqzslvflc9pzr05mrs.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fenrqzslvflc9pzr05mrs.png" alt=" " width="800" height="449"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h1&gt;
  
  
  Understanding the Root Cause: VBS
&lt;/h1&gt;

&lt;p&gt;&lt;strong&gt;Virtualization-Based Security (VBS)&lt;/strong&gt; is fully integrated into Windows 11's kernel and takes exclusive control of VT-x/AMD-V. This prevents desktop hypervisors from accessing hardware virtualization directly, causing conflicts with nested virtualization.&lt;/p&gt;

&lt;h3&gt;
  
  
  Initial Troubleshooting Attempts
&lt;/h3&gt;

&lt;p&gt;I tried several manual approaches to disable VBS:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Disabling Core Isolation&lt;/strong&gt; (Windows Security → Device Security)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Disabling hypervisor launch&lt;/strong&gt;:
&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight powershell"&gt;&lt;code&gt;&lt;span class="w"&gt;   &lt;/span&gt;&lt;span class="n"&gt;bcdedit&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;/set&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;hypervisorlaunchtype&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;off&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Disabling HypervisorIOMMUPolicy&lt;/strong&gt;:
&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight powershell"&gt;&lt;code&gt;&lt;span class="w"&gt;   &lt;/span&gt;&lt;span class="n"&gt;bcdedit&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;/set&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;HypervisorIOMMUPolicy&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;off&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Group Policy and Registry edits&lt;/strong&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;None of these methods worked completely. The hypervisors continued to crash or remained unstable.&lt;/p&gt;

&lt;h3&gt;
  
  
  The Only Working Solution: Microsoft's DG_Readiness_Tool
&lt;/h3&gt;

&lt;p&gt;After extensive testing, I discovered that the &lt;strong&gt;only reliable solution&lt;/strong&gt; is using Microsoft's official script for disabling VBS:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Download:&lt;/strong&gt; &lt;a href="https://www.microsoft.com/en-us/download/details.aspx?id=53337" rel="noopener noreferrer"&gt;DG_Readiness_Tool&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Usage:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight powershell"&gt;&lt;code&gt;&lt;span class="n"&gt;DG_Readiness_Tool_v3.6.ps1&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-Disable&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;After running the script and rebooting, VBS is successfully disabled and nested virtualization works correctly.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Important:&lt;/strong&gt; This change is &lt;strong&gt;temporary&lt;/strong&gt; — Windows re-enables VBS after subsequent reboots, so the script must be rerun when needed.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why Other Approaches Don't Work
&lt;/h2&gt;

&lt;h3&gt;
  
  
  HypervisorIOMMUPolicy Alone Is Not Enough
&lt;/h3&gt;

&lt;p&gt;Initially, I believed that disabling &lt;code&gt;HypervisorIOMMUPolicy&lt;/code&gt; would solve issues for lightweight hypervisors and Android emulators while keeping VBS active. &lt;strong&gt;This turned out to be incorrect.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Even with &lt;code&gt;HypervisorIOMMUPolicy&lt;/code&gt; disabled, hypervisors running inside VMware VMs remain unstable or fail to launch because:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;VBS maintains VT-x/AMD-V control&lt;/strong&gt;: As long as VBS is active, Windows Hypervisor Platform retains exclusive access to hardware virtualization extensions&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Nested hypervisors require direct hardware access&lt;/strong&gt;: VMware, VirtualBox, and even lightweight emulators need unmediated access to VT-x/AMD-V&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Security layer interference&lt;/strong&gt;: VBS creates a security boundary that conflicts with nested virtualization regardless of IOMMU settings&lt;/li&gt;
&lt;/ol&gt;

&lt;h3&gt;
  
  
  The Real Solution
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Complete VBS disabling via the DG_Readiness_Tool is the only reliable approach&lt;/strong&gt; for running any hypervisor inside VMware virtual machines, including:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;VMware Workstation Pro&lt;/li&gt;
&lt;li&gt;VirtualBox&lt;/li&gt;
&lt;li&gt;Android emulators (AVD, Genymotion)&lt;/li&gt;
&lt;li&gt;KVM (on Linux guests)&lt;/li&gt;
&lt;li&gt;Other lightweight hypervisors&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Complete Solutions
&lt;/h2&gt;

&lt;p&gt;Since VBS cannot be permanently removed from Windows 11 24H2/25H2, here are your options:&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;Solution 1: Temporary VBS Disable (Recommended for Testing)&lt;/strong&gt;
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Run &lt;code&gt;DG_Readiness_Tool_v3.6.ps1 -Disable&lt;/code&gt; before each session requiring nested virtualization&lt;/li&gt;
&lt;li&gt;Provides full VT-x access temporarily&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Limitation:&lt;/strong&gt; Must be rerun after each reboot&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;Solution 2: Downgrade or Dual-Boot (Recommended for Permanent Use)&lt;/strong&gt;
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Use &lt;strong&gt;Windows 11 22H2&lt;/strong&gt; (doesn't enforce VBS)&lt;/li&gt;
&lt;li&gt;Install as dual-boot alongside 24H2/25H2&lt;/li&gt;
&lt;li&gt;Provides permanent, stable hardware virtualization without workarounds&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;Solution 3: Switch to Linux (Best for Advanced Labs)&lt;/strong&gt;
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;No VBS restrictions whatsoever&lt;/li&gt;
&lt;li&gt;Superior virtualization performance&lt;/li&gt;
&lt;li&gt;Native KVM support with full hardware access&lt;/li&gt;
&lt;li&gt;Popular options: &lt;strong&gt;Ubuntu, Fedora, Debian, Arch-based distributions&lt;/strong&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Compatibility Matrix
&lt;/h2&gt;

&lt;p&gt;The table below shows hypervisor compatibility when running &lt;strong&gt;inside VMware VMs&lt;/strong&gt; on Windows 11 24H2/25H2:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Hypervisor / Software&lt;/th&gt;
&lt;th&gt;VBS Enabled&lt;/th&gt;
&lt;th&gt;VBS Disabled (DG_Readiness_Tool)&lt;/th&gt;
&lt;th&gt;Notes&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;VMware Workstation Pro&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;❌ Crash&lt;/td&gt;
&lt;td&gt;✅ Works&lt;/td&gt;
&lt;td&gt;Requires full VBS disable&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;VirtualBox&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;❌ Crash/Unstable&lt;/td&gt;
&lt;td&gt;✅ Works&lt;/td&gt;
&lt;td&gt;Requires full VBS disable&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Android Emulators (AVD)&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;❌ Crash/Unstable&lt;/td&gt;
&lt;td&gt;✅ Works&lt;/td&gt;
&lt;td&gt;Requires full VBS disable&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;KVM (Linux VM)&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;❌ Cannot run&lt;/td&gt;
&lt;td&gt;✅ Works&lt;/td&gt;
&lt;td&gt;Requires full VBS disable&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Hyper-V (Windows VM)&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;❌ Not supported&lt;/td&gt;
&lt;td&gt;❌ Limited&lt;/td&gt;
&lt;td&gt;Nested Hyper-V not functional on VMware&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Other lightweight hypervisors&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;❌ Unstable&lt;/td&gt;
&lt;td&gt;✅ Works&lt;/td&gt;
&lt;td&gt;Requires full VBS disable&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;&lt;strong&gt;Legend:&lt;/strong&gt; ✅ Works reliably | ❌ Fails or unstable&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Key Finding:&lt;/strong&gt; All hypervisors running inside VMware VMs require VBS to be completely disabled. Partial solutions like disabling only &lt;code&gt;HypervisorIOMMUPolicy&lt;/code&gt; or &lt;code&gt;hypervisorlaunchtype&lt;/code&gt; do not provide stable nested virtualization.&lt;/p&gt;

&lt;h2&gt;
  
  
  Key Takeaways
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;VBS must be fully disabled&lt;/strong&gt; for any nested virtualization scenario on Windows 11 24H2/25H2:
&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight powershell"&gt;&lt;code&gt;&lt;span class="w"&gt;   &lt;/span&gt;&lt;span class="n"&gt;DG_Readiness_Tool_v3.6.ps1&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-Disable&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ol&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Partial solutions don't work&lt;/strong&gt;: Disabling only &lt;code&gt;HypervisorIOMMUPolicy&lt;/code&gt; or &lt;code&gt;hypervisorlaunchtype&lt;/code&gt; is insufficient&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Hardware requirements:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Enable VT-x/AMD-V in BIOS/UEFI&lt;/li&gt;
&lt;li&gt;Expose virtualization to guest VM in VMware settings&lt;/li&gt;
&lt;li&gt;Use multi-core CPU allocation for better stability&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Long-term solutions:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;For frequent nested virtualization use:&lt;/strong&gt; Switch to Windows 11 22H2 or Linux&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;For occasional testing:&lt;/strong&gt; Use the DG_Readiness_Tool and accept the need to rerun it after reboots&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;For production lab environments:&lt;/strong&gt; Linux hosts provide the most stable and performant solution&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  Conclusion
&lt;/h2&gt;

&lt;p&gt;Modern Windows 11's VBS creates fundamental incompatibilities with nested virtualization. While VBS enhances system security, it takes exclusive control of hardware virtualization extensions, making it impossible for hypervisors running inside VMs to function properly.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The critical discovery:&lt;/strong&gt; Unlike what initial testing suggested, there is &lt;strong&gt;no partial workaround&lt;/strong&gt;. Complete VBS disabling via Microsoft's DG_Readiness_Tool is mandatory for any nested hypervisor scenario, regardless of whether you're running VMware, VirtualBox, or lightweight Android emulators.&lt;/p&gt;

&lt;p&gt;For users requiring frequent nested virtualization:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Windows 11 22H2&lt;/strong&gt; in dual-boot configuration offers a permanent VBS-free environment&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Linux hosts&lt;/strong&gt; eliminate VBS restrictions entirely and provide superior performance&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Temporary VBS disabling&lt;/strong&gt; works but requires re-running the script after every reboot&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Understanding this limitation helps set realistic expectations and choose the right platform for advanced virtualization labs and development environments.&lt;/p&gt;

&lt;h2&gt;
  
  
  🔎 Possible Silent Fix in Recent Updates
&lt;/h2&gt;

&lt;p&gt;After installing recent cumulative updates on Windows 11 25H2 (notably build 26200.7840), I noticed a significant behavioral change:&lt;br&gt;
VBS remained enabled as a feature, but the hypervisor was no longer forced into execution at boot.&lt;/p&gt;

&lt;p&gt;Previously, even after explicitly disabling Hyper-V launch via BCD and policy settings, the system would re-enable the hypervisor at startup. This required manual intervention on every reboot.&lt;/p&gt;

&lt;p&gt;Following recent updates, the system now correctly respects &lt;code&gt;hypervisorlaunchtype off&lt;/code&gt;, and VBS remains configured but not running unless explicitly required.&lt;/p&gt;

&lt;p&gt;Although Microsoft has not documented a specific fix related to VBS policy enforcement, this suggests that changes were made to how Windows handles hypervisor auto-launch behavior.&lt;/p&gt;

</description>
      <category>microsoft</category>
      <category>security</category>
      <category>tooling</category>
      <category>tutorial</category>
    </item>
    <item>
      <title>Decompression in C/C++: Virtual Files and Memory I/O Principles and Techniques</title>
      <dc:creator>Stefor07</dc:creator>
      <pubDate>Mon, 27 Oct 2025 19:40:55 +0000</pubDate>
      <link>https://dev.to/stefor07/decompression-in-c-virtual-files-and-memory-io-principles-and-techniques-1pih</link>
      <guid>https://dev.to/stefor07/decompression-in-c-virtual-files-and-memory-io-principles-and-techniques-1pih</guid>
      <description>&lt;p&gt;In this article, we will analyze techniques for managing buffers and virtual files during decompression operations in C/C++, with practical examples showing how to work with both high-level and low-level libraries.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why Decompress Directly in Memory?
&lt;/h2&gt;

&lt;p&gt;Decompressing archives directly in memory instead of using temporary files offers several advantages:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Performance&lt;/strong&gt;: Avoiding disk I/O significantly reduces latency, especially for repeated reads or streaming scenarios.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Security&lt;/strong&gt;: Sensitive data never touches the disk, reducing the risk of exposure or leaving traces.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Single-File Deployment&lt;/strong&gt;: Combined with &lt;a href="https://dev.to/stefor07/how-to-embed-binary-data-into-a-win32-executable-file-in-4-methods-43kp"&gt;techniques like embedding binary data in executables&lt;/a&gt;, you can load and unpack archives without deploying external files.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Flexible Data Sources&lt;/strong&gt;: Works with network streams, embedded resources, or any custom buffer—not bound by the file system.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Cleaner Resource Management&lt;/strong&gt;: No temporary files means less cleanup, fewer permissions issues, and simpler code.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Memory vs Disk Decompression: Understanding the Landscape
&lt;/h2&gt;

&lt;p&gt;Decompression libraries fall into two categories based on how they handle data sources:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;High-level libraries&lt;/strong&gt; provide native APIs for extracting data directly into memory buffers. These abstract away the complexity of I/O operations, making memory-based decompression straightforward.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Low-level, file-centric libraries&lt;/strong&gt; assume data comes from disk files. They expect standard file operations (&lt;code&gt;read&lt;/code&gt;, &lt;code&gt;write&lt;/code&gt;, &lt;code&gt;seek&lt;/code&gt;) and require developers to implement custom I/O callbacks to work with memory buffers.&lt;/p&gt;

&lt;p&gt;Understanding this distinction helps you choose the right tool and integration approach for your use case.&lt;/p&gt;

&lt;h2&gt;
  
  
  High-Level Libraries with Native Memory Support
&lt;/h2&gt;

&lt;p&gt;Several modern libraries provide built-in memory extraction without requiring custom callbacks:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;libzip&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;zip_fread()&lt;/code&gt;: Reads files directly into memory buffers&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;zip_source_buffer_create()&lt;/code&gt;: Creates a ZIP source from existing memory&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;zip_open_from_source()&lt;/code&gt;: Opens archives using in-memory sources&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;libarchive&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;archive_read_data()&lt;/code&gt;: Extracts entries into memory buffers&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;archive_write_data()&lt;/code&gt;: Writes from memory into archives&lt;/li&gt;
&lt;li&gt;Supports multiple formats (ZIP, TAR, etc.)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;zlib&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;uncompress()&lt;/code&gt;: Single-call buffer decompression&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;inflateInit()&lt;/code&gt;, &lt;code&gt;inflate()&lt;/code&gt;: Stream-based API for progressive decompression&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;miniz&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;mz_zip_reader_init_mem()&lt;/code&gt;: Open ZIP from a RAM buffer&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;mz_zip_reader_extract_file_to_heap()&lt;/code&gt;: Extract a file into an allocated buffer&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;mz_zip_reader_extract_file_to_mem()&lt;/code&gt;: Extract into a provided buffer&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Iterative API (&lt;code&gt;extract_iter&lt;/code&gt;) → Read stream from memory&lt;/p&gt;

&lt;p&gt;These libraries handle all the complexity internally—reading compressed chunks, decompressing them, and writing output—while exposing simple, memory-friendly APIs.&lt;/p&gt;

&lt;h2&gt;
  
  
  Low-Level Libraries: The Custom Callback Approach
&lt;/h2&gt;

&lt;p&gt;Unlike high-level libraries, some decompression tools are designed exclusively for file-based I/O:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;LZMA SDK (7-Zip)&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Windows Cabinet APIs&lt;/strong&gt; (&lt;code&gt;FCICreate&lt;/code&gt;, &lt;code&gt;FDICopy&lt;/code&gt;, etc.)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Minizip (part of zlib)&lt;/strong&gt; (&lt;code&gt;pzlib_filefunc_def&lt;/code&gt;)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;These libraries don't provide memory extraction APIs. Instead, they expect standard file operations and process data through internal buffers that aren't exposed to developers.&lt;/p&gt;

&lt;p&gt;To work with memory buffers, you must implement &lt;strong&gt;custom I/O callbacks&lt;/strong&gt; that simulate file behavior. The library requests data—thinking it's reading from a file—while your callbacks feed it data from memory instead.&lt;/p&gt;

&lt;h3&gt;
  
  
  How Custom Callbacks Work
&lt;/h3&gt;

&lt;p&gt;The process is conceptually simple:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Your compressed archive is loaded into a memory buffer&lt;/li&gt;
&lt;li&gt;The library performs read, seek, or write operations&lt;/li&gt;
&lt;li&gt;Your callbacks intercept these operations and provide data from your buffer&lt;/li&gt;
&lt;li&gt;The library processes this data through its internal buffers, decompressing as if reading from a real file&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;This approach requires more boilerplate but provides full control over memory usage and enables working with non-disk data sources.&lt;/p&gt;

&lt;h2&gt;
  
  
  Implementing Memory Callbacks
&lt;/h2&gt;

&lt;p&gt;To make file-centric libraries work with memory, we encapsulate the buffer in a structure that tracks position:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight cpp"&gt;&lt;code&gt;&lt;span class="cp"&gt;#include&lt;/span&gt; &lt;span class="cpf"&gt;&amp;lt;stdint.h&amp;gt;&lt;/span&gt;&lt;span class="cp"&gt;
#include&lt;/span&gt; &lt;span class="cpf"&gt;&amp;lt;string.h&amp;gt;&lt;/span&gt;&lt;span class="cp"&gt;
#include&lt;/span&gt; &lt;span class="cpf"&gt;&amp;lt;stdbool.h&amp;gt;&lt;/span&gt;&lt;span class="cp"&gt;
&lt;/span&gt;
&lt;span class="k"&gt;typedef&lt;/span&gt; &lt;span class="k"&gt;struct&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;const&lt;/span&gt; &lt;span class="kt"&gt;uint8_t&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="n"&gt;data&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;      &lt;span class="c1"&gt;// pointer to memory buffer&lt;/span&gt;
    &lt;span class="kt"&gt;size_t&lt;/span&gt; &lt;span class="n"&gt;size&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;           &lt;span class="c1"&gt;// total size of buffer&lt;/span&gt;
    &lt;span class="kt"&gt;size_t&lt;/span&gt; &lt;span class="n"&gt;pos&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;            &lt;span class="c1"&gt;// current position&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="n"&gt;MemoryStream&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Core Callback Implementations
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Read Callback&lt;/strong&gt;&lt;br&gt;
Reads up to &lt;code&gt;bytes&lt;/code&gt; from the stream into &lt;code&gt;dst&lt;/code&gt;.&lt;br&gt;
Returns the number of bytes actually read.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight cpp"&gt;&lt;code&gt;&lt;span class="kt"&gt;size_t&lt;/span&gt; &lt;span class="nf"&gt;Read&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;MemoryStream&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="n"&gt;ms&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="kt"&gt;void&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="n"&gt;dst&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="kt"&gt;size_t&lt;/span&gt; &lt;span class="n"&gt;bytes&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; 
&lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;!&lt;/span&gt;&lt;span class="n"&gt;ms&lt;/span&gt; &lt;span class="o"&gt;||&lt;/span&gt; &lt;span class="o"&gt;!&lt;/span&gt;&lt;span class="n"&gt;dst&lt;/span&gt; &lt;span class="o"&gt;||&lt;/span&gt; &lt;span class="n"&gt;ms&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="n"&gt;pos&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;=&lt;/span&gt; &lt;span class="n"&gt;ms&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="n"&gt;size&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;

    &lt;span class="kt"&gt;size_t&lt;/span&gt; &lt;span class="n"&gt;remainingBytes&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;ms&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="n"&gt;size&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="n"&gt;ms&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="n"&gt;pos&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;bytes&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;remainingBytes&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="n"&gt;bytes&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;remainingBytes&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;

    &lt;span class="n"&gt;memcpy&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;dst&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;ms&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="n"&gt;data&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;ms&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="n"&gt;pos&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;bytes&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

    &lt;span class="n"&gt;ms&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="n"&gt;pos&lt;/span&gt; &lt;span class="o"&gt;+=&lt;/span&gt; &lt;span class="n"&gt;bytes&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;bytes&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Seek Callback&lt;/strong&gt;&lt;br&gt;
Moves the current position relative to the beginning, current position, or end of the stream.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight cpp"&gt;&lt;code&gt;&lt;span class="k"&gt;typedef&lt;/span&gt; &lt;span class="k"&gt;enum&lt;/span&gt; &lt;span class="n"&gt;SeekOrigin&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="n"&gt;SEEK_SET&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;SEEK_CUR&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;SEEK_END&lt;/span&gt; &lt;span class="p"&gt;};&lt;/span&gt;

&lt;span class="kt"&gt;bool&lt;/span&gt; &lt;span class="nf"&gt;Seek&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;MemoryStream&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="n"&gt;ms&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="kt"&gt;long&lt;/span&gt; &lt;span class="n"&gt;offset&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;SeekOrigin&lt;/span&gt; &lt;span class="n"&gt;origin&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; 
&lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;!&lt;/span&gt;&lt;span class="n"&gt;ms&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nb"&gt;false&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;

    &lt;span class="kt"&gt;uint64_t&lt;/span&gt; &lt;span class="n"&gt;newPos&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

    &lt;span class="k"&gt;switch&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;origin&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; 
    &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="k"&gt;case&lt;/span&gt; &lt;span class="n"&gt;SEEK_SET&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; 
        &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="n"&gt;newPos&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;uint64_t&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="n"&gt;offset&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; 
            &lt;span class="k"&gt;break&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
        &lt;span class="p"&gt;}&lt;/span&gt;
        &lt;span class="k"&gt;case&lt;/span&gt; &lt;span class="n"&gt;SEEK_CUR&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="n"&gt;newPos&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;uint64_t&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="n"&gt;ms&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="n"&gt;pos&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;offset&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; 
            &lt;span class="k"&gt;break&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
        &lt;span class="p"&gt;}&lt;/span&gt; 
        &lt;span class="k"&gt;case&lt;/span&gt; &lt;span class="n"&gt;SEEK_END&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; 
        &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="n"&gt;newPos&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;uint64_t&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="n"&gt;ms&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="n"&gt;size&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;offset&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; 
            &lt;span class="k"&gt;break&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
        &lt;span class="p"&gt;}&lt;/span&gt;

        &lt;span class="k"&gt;default&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;
        &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nb"&gt;false&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
        &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;

    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;newPos&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="n"&gt;newPos&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="k"&gt;else&lt;/span&gt; &lt;span class="nf"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;newPos&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;uint64_t&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="n"&gt;ms&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="n"&gt;size&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="n"&gt;newPos&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;uint64_t&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="n"&gt;ms&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="n"&gt;size&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;

    &lt;span class="n"&gt;ms&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="n"&gt;pos&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;size_t&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="n"&gt;newPos&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nb"&gt;true&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;blockquote&gt;
&lt;p&gt;⚠️ &lt;strong&gt;Warning:&lt;/strong&gt; Inside this callback, the &lt;code&gt;newPos&lt;/code&gt; variable is declared as an &lt;code&gt;uint64_t&lt;/code&gt;. This is done for safety, to avoid overflows when adding or subtracting &lt;code&gt;long&lt;/code&gt; values with the current position or the stream size (&lt;code&gt;size_t&lt;/code&gt;). In particular, since &lt;code&gt;ms-&amp;gt;size&lt;/code&gt; and &lt;code&gt;ms-&amp;gt;pos&lt;/code&gt; are of type &lt;code&gt;size_t&lt;/code&gt; (typically unsigned), converting to &lt;code&gt;uint64_t&lt;/code&gt; allows for correct handling of negative offsets and prevents undefined behavior resulting from operations between signed and unsigned types. &lt;strong&gt;Additionally, using &lt;code&gt;int64_t&lt;/code&gt; provides extra safety when working with very large archives, ensuring that file positions larger than 4 GB or 2^32 bytes are handled correctly. This choice does not affect behavior on 32-bit processes.&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;strong&gt;Look Callback&lt;/strong&gt;&lt;br&gt;
Provides a direct pointer to the unread portion of the buffer (for “peek” access).&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight cpp"&gt;&lt;code&gt;&lt;span class="kt"&gt;bool&lt;/span&gt; &lt;span class="nf"&gt;Look&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;MemoryStream&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="n"&gt;ms&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="k"&gt;const&lt;/span&gt; &lt;span class="kt"&gt;void&lt;/span&gt;&lt;span class="o"&gt;**&lt;/span&gt; &lt;span class="n"&gt;buf&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="kt"&gt;size_t&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="n"&gt;size&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;!&lt;/span&gt;&lt;span class="n"&gt;ms&lt;/span&gt; &lt;span class="o"&gt;||&lt;/span&gt; &lt;span class="o"&gt;!&lt;/span&gt;&lt;span class="n"&gt;buf&lt;/span&gt; &lt;span class="o"&gt;||&lt;/span&gt; &lt;span class="o"&gt;!&lt;/span&gt;&lt;span class="n"&gt;size&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nb"&gt;false&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;

    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;ms&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="n"&gt;pos&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;=&lt;/span&gt; &lt;span class="n"&gt;ms&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="n"&gt;size&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;buf&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;NULL&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
        &lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;size&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nb"&gt;false&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;

    &lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;buf&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;ms&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="n"&gt;data&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;ms&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="n"&gt;pos&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;size&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;ms&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="n"&gt;size&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="n"&gt;ms&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="n"&gt;pos&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nb"&gt;true&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Skip Callback&lt;/strong&gt;&lt;br&gt;
Advances the current position by &lt;code&gt;offset&lt;/code&gt; bytes (without reading).&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight cpp"&gt;&lt;code&gt;&lt;span class="kt"&gt;bool&lt;/span&gt; &lt;span class="nf"&gt;Skip&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;MemoryStream&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="n"&gt;ms&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="kt"&gt;size_t&lt;/span&gt; &lt;span class="n"&gt;offset&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; 
&lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;!&lt;/span&gt;&lt;span class="n"&gt;ms&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nb"&gt;false&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;

    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;offset&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;SIZE_MAX&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="n"&gt;ms&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="n"&gt;pos&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nb"&gt;false&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;

    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;ms&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="n"&gt;pos&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;offset&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;ms&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="n"&gt;size&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="n"&gt;ms&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="n"&gt;pos&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;ms&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="n"&gt;size&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="k"&gt;else&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="n"&gt;ms&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="n"&gt;pos&lt;/span&gt; &lt;span class="o"&gt;+=&lt;/span&gt; &lt;span class="n"&gt;offset&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;

    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nb"&gt;true&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Write Callback&lt;/strong&gt;&lt;br&gt;
Writes up to &lt;code&gt;bytes&lt;/code&gt; from &lt;code&gt;src&lt;/code&gt; into the buffer.&lt;br&gt;
Returns the number of bytes successfully written.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight cpp"&gt;&lt;code&gt;&lt;span class="kt"&gt;bool&lt;/span&gt; &lt;span class="nf"&gt;Write&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;MemoryStream&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="n"&gt;ms&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="k"&gt;const&lt;/span&gt; &lt;span class="kt"&gt;void&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="n"&gt;src&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="kt"&gt;size_t&lt;/span&gt; &lt;span class="n"&gt;size&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="kt"&gt;size_t&lt;/span&gt; &lt;span class="n"&gt;remainingBytes&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;ms&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="n"&gt;size&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="n"&gt;ms&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="n"&gt;pos&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;size&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;remainingBytes&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="n"&gt;size&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;remainingBytes&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;

    &lt;span class="kt"&gt;uint8_t&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="n"&gt;dest&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;uint8_t&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="n"&gt;ms&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="n"&gt;data&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;ms&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="n"&gt;pos&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="n"&gt;memcpy&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;dest&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;src&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;size&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

    &lt;span class="n"&gt;ms&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="n"&gt;pos&lt;/span&gt; &lt;span class="o"&gt;+=&lt;/span&gt; &lt;span class="n"&gt;size&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nb"&gt;true&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Tell Callback&lt;/strong&gt;&lt;br&gt;
Returns the current position within the buffer.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight cpp"&gt;&lt;code&gt;&lt;span class="kt"&gt;size_t&lt;/span&gt; &lt;span class="nf"&gt;Tell&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;const&lt;/span&gt; &lt;span class="n"&gt;MemoryStream&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="n"&gt;ms&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;ms&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="n"&gt;ms&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="n"&gt;pos&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;=&lt;/span&gt; &lt;span class="n"&gt;ms&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="n"&gt;size&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;?&lt;/span&gt; &lt;span class="n"&gt;ms&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="n"&gt;pos&lt;/span&gt; &lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Callback Purpose and Usage
&lt;/h2&gt;

&lt;p&gt;Each callback serves a specific role when simulating file access in memory:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Read&lt;/strong&gt;: Provides the next chunk of data from the memory buffer. Essential for decompression, parsing, or streaming input.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Seek&lt;/strong&gt;: Moves the current position relative to the beginning, current position, or end of the buffer. Required for random-access libraries.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Look&lt;/strong&gt;: Provides a pointer to the unread portion of the buffer for 
“peek” operations without changing the current position. Optional but useful for inspection.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Skip&lt;/strong&gt;: Advances the current position by a given number of bytes without copying data. Useful for efficiently ignoring unwanted sections.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Write&lt;/strong&gt;: Stores processed or decompressed output back into memory. Not required for read-only operations.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Tell&lt;/strong&gt;: Returns the current position within the buffer. Needed for offset tracking or progress reporting.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Usage Notes
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Sequential operations&lt;/strong&gt; (e.g., streaming decompression) may only require &lt;strong&gt;Read&lt;/strong&gt; and &lt;strong&gt;Write&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Random-access archives&lt;/strong&gt; or seeking operations require &lt;strong&gt;Seek&lt;/strong&gt;, &lt;strong&gt;Skip&lt;/strong&gt;, and &lt;strong&gt;Tell&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Inspection-only operations&lt;/strong&gt; might only need &lt;strong&gt;Read&lt;/strong&gt; and &lt;strong&gt;Look&lt;/strong&gt;, skipping &lt;strong&gt;Write&lt;/strong&gt; entirely.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Adapting Callbacks to Specific Libraries
&lt;/h3&gt;

&lt;p&gt;The callbacks above are a &lt;strong&gt;starting template&lt;/strong&gt;. Each library has different requirements for function signatures, parameters, or behavior. Some might pass opaque pointers instead of &lt;code&gt;MemoryStream*&lt;/code&gt;, or require additional flags.&lt;/p&gt;

&lt;p&gt;The key principle is &lt;strong&gt;adapting memory buffers to behave like files&lt;/strong&gt;. From this foundation, customize the callbacks to match your library's API.&lt;/p&gt;

&lt;h3&gt;
  
  
  Library-Specific Requirements
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;LZMA SDK&lt;/strong&gt;&lt;br&gt;
Requires &lt;code&gt;ILookInStream&lt;/code&gt; interface with &lt;strong&gt;4 callbacks&lt;/strong&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;Look&lt;/code&gt; → peek at upcoming bytes without advancing&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;Skip&lt;/code&gt; → skip bytes forward&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;Read&lt;/code&gt; → read and advance cursor&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;Seek&lt;/code&gt; → move to specific position&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Windows Cabinet (CAB) SDK&lt;/strong&gt;&lt;br&gt;
Requires &lt;strong&gt;2 main callbacks&lt;/strong&gt;:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;File operations (&lt;code&gt;CabRead&lt;/code&gt;, &lt;code&gt;CabWrite&lt;/code&gt;, &lt;code&gt;CabSeek&lt;/code&gt;)&lt;/li&gt;
&lt;li&gt;Notify callback (&lt;code&gt;CabNotify&lt;/code&gt;) for operation events&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;strong&gt;minizip (part of zlib)&lt;/strong&gt;&lt;br&gt;
Requires &lt;strong&gt;7 main callbacks&lt;/strong&gt;:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;File open&lt;/strong&gt;: &lt;code&gt;ZipOpen&lt;/code&gt; – opens the archive (or memory stream)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;File read&lt;/strong&gt;: &lt;code&gt;ZipRead&lt;/code&gt; – reads data from the archive&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;File write&lt;/strong&gt;: &lt;code&gt;ZipWrite&lt;/code&gt; – writes data to the archive&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;File tell&lt;/strong&gt;: &lt;code&gt;ZipTell&lt;/code&gt; – returns the current position in the archive&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;File seek&lt;/strong&gt;: &lt;code&gt;ZipSeek&lt;/code&gt; – moves the read/write position&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;File close&lt;/strong&gt;: &lt;code&gt;ZipClose&lt;/code&gt; – closes the archive or stream&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;File error&lt;/strong&gt;: &lt;code&gt;ZipError&lt;/code&gt; – reports I/O errors&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;This comparison shows how different libraries require varying levels of manual I/O adaptation.&lt;/p&gt;

&lt;h2&gt;
  
  
  Library Comparison
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Library&lt;/th&gt;
&lt;th&gt;Memory Support&lt;/th&gt;
&lt;th&gt;Custom Callbacks&lt;/th&gt;
&lt;th&gt;Complexity&lt;/th&gt;
&lt;th&gt;Key Features&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;libzip&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;✅ Native&lt;/td&gt;
&lt;td&gt;❌ Not needed&lt;/td&gt;
&lt;td&gt;Low&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;zip_fread()&lt;/code&gt;, &lt;code&gt;zip_source_buffer_create()&lt;/code&gt;, &lt;code&gt;zip_open_from_source()&lt;/code&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;libarchive&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;✅ Native&lt;/td&gt;
&lt;td&gt;❌ Not needed&lt;/td&gt;
&lt;td&gt;Low&lt;/td&gt;
&lt;td&gt;Multi-format support, &lt;code&gt;archive_read_data()&lt;/code&gt;, &lt;code&gt;archive_write_data()&lt;/code&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;zlib&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;⚠️ Partial&lt;/td&gt;
&lt;td&gt;❌ Not needed&lt;/td&gt;
&lt;td&gt;Low/Medium&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;uncompress()&lt;/code&gt; and streaming APIs, efficient for simple compression&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;miniz&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;✅ Native&lt;/td&gt;
&lt;td&gt;❌ Not needed&lt;/td&gt;
&lt;td&gt;Low&lt;/td&gt;
&lt;td&gt;Provides dedicated in-memory ZIP APIs (&lt;code&gt;mz_zip_reader_init_mem()&lt;/code&gt;, &lt;code&gt;mz_zip_reader_extract_file_to_heap()&lt;/code&gt;, &lt;code&gt;mz_zip_reader_extract_file_to_mem()&lt;/code&gt;)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;minizip (part of zlib)&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;❌ Manual&lt;/td&gt;
&lt;td&gt;✅ Required&lt;/td&gt;
&lt;td&gt;Medium&lt;/td&gt;
&lt;td&gt;Requires implementing 7 callbacks for the &lt;code&gt;zlib_filefunc_def&lt;/code&gt; structure.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;LZMA SDK (7-Zip)&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;❌ Manual&lt;/td&gt;
&lt;td&gt;✅ Required&lt;/td&gt;
&lt;td&gt;High&lt;/td&gt;
&lt;td&gt;Requires &lt;code&gt;ISeqInStream&lt;/code&gt; (1 callback) or &lt;code&gt;ILookInStream&lt;/code&gt; (4 callbacks), granular control&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Windows Cabinet (CAB) APIs&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;❌ Manual&lt;/td&gt;
&lt;td&gt;✅ Required&lt;/td&gt;
&lt;td&gt;Medium&lt;/td&gt;
&lt;td&gt;Core callbacks: &lt;code&gt;Read&lt;/code&gt;, &lt;code&gt;Write&lt;/code&gt;, &lt;code&gt;Seek&lt;/code&gt;, plus &lt;code&gt;CabNotify&lt;/code&gt;, simpler than LZMA&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h2&gt;
  
  
  Conclusion
&lt;/h2&gt;

&lt;p&gt;Memory-based decompression in C/C++ requires understanding two distinct approaches: high-level libraries with native memory APIs, and low-level file-centric libraries requiring custom callbacks.&lt;/p&gt;

&lt;p&gt;High-level libraries like &lt;strong&gt;libzip&lt;/strong&gt;, &lt;strong&gt;libarchive&lt;/strong&gt;, &lt;strong&gt;zlib&lt;/strong&gt;, and &lt;strong&gt;miniz&lt;/strong&gt; provide straightforward, efficient APIs for working directly with memory buffers. For most use cases, these should be your first choice.&lt;/p&gt;

&lt;p&gt;When working with specialized formats or legacy libraries like &lt;strong&gt;LZMA SDK&lt;/strong&gt; or &lt;strong&gt;Windows Cabinet APIs&lt;/strong&gt;, &lt;strong&gt;Minizip&lt;/strong&gt; , custom callbacks bridge the gap. By implementing virtual file operations on memory buffers, you gain the same flexibility while maintaining full control over data flow.&lt;/p&gt;

&lt;p&gt;Whether you're embedding archives in executables, processing network streams, or avoiding disk I/O for security reasons, these techniques enable efficient, flexible decompression workflows entirely in memory.&lt;/p&gt;

&lt;p&gt;Apply these patterns in your projects: start with high-level APIs when available, and implement custom callbacks when necessary. With this foundation, you're equipped to build secure, performant decompression solutions in C++.&lt;/p&gt;

</description>
      <category>cpp</category>
      <category>programming</category>
      <category>libraries</category>
    </item>
    <item>
      <title>The Perfect Illusion: When VirtualBox Pretends to Be Parallels</title>
      <dc:creator>Stefor07</dc:creator>
      <pubDate>Tue, 15 Jul 2025 16:10:04 +0000</pubDate>
      <link>https://dev.to/stefor07/the-perfect-illusion-when-virtualbox-pretends-to-be-parallels-4ahb</link>
      <guid>https://dev.to/stefor07/the-perfect-illusion-when-virtualbox-pretends-to-be-parallels-4ahb</guid>
      <description>&lt;p&gt;&lt;strong&gt;A visual and technical experiment to reinvent the Parallels experience on Windows, starting with VirtualBox and pushing it beyond its limits.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;"Parallels Desktop on Windows doesn't exist. Or so they say. But looking at this window—clean, immersive, devoid of any recognizable hypervisor signature—makes you wonder: what if it actually existed?&lt;br&gt;
A virtual machine that doesn't feel virtual. No intrusive UI, no detail that betrays its technical heart. Just a parallel operating system, living alongside my real world.&lt;br&gt;
If Parallels never came to Windows, then I decided to bring it to you.&lt;br&gt;
This isn't emulation. It's not cloning. It's illusion—perfect, intentional, ingeniously constructed.&lt;br&gt;
Welcome to my visual experiment: when VirtualBox pretends to be Parallels and perception surpasses reality".&lt;/em&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  How the idea was born – from boredom to vision 💡
&lt;/h2&gt;

&lt;h3&gt;
  
  
  ℹ️ 1. What happened to Parallels?
&lt;/h3&gt;

&lt;p&gt;I was bored. And not just any boredom—the digital kind, made up of identical windows, monotonous virtual systems, and gray interfaces. So I asked myself: what would happen if I could have Parallels Desktop… on Windows? A software that doesn't exist, but one I've always imagined for its elegance and its unique way of bringing two systems together.&lt;/p&gt;

&lt;p&gt;ℹ️ As many know, Parallels is a company we could call VMware’s younger sister — once dedicated to developing desktop virtualization software for Windows, Linux, and macOS alike.&lt;br&gt;
But over time, as attention to the Windows and Linux platforms faded, Parallels felt neglected. A bit heartbroken&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;“...Parallels felt neglected. A bit heartbroken, it quietly stepped away from Windows and Linux, turning its full attention to macOS — the platform where it found not just support, but a sense of identity.”&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h3&gt;
  
  
  ❗ 2.  But do Windows and Linux really have to give up?
&lt;/h3&gt;

&lt;p&gt;Why should Windows and Linux users be denied the fully parallel experience that Parallels Desktop once offered? It’s simply not fair. So, driven by a mix of frustration and curiosity, I decided to recreate the illusion myself.&lt;/p&gt;

&lt;p&gt;With a bit of cunning and the help of tools like &lt;strong&gt;AutoHotkey&lt;/strong&gt; and &lt;strong&gt;Resource Hacker&lt;/strong&gt;, I started to disguise and camouflage VirtualBox — reshaping icons, tweaking window titles, and crafting a Parallels-like look and feel.&lt;br&gt;
For now, the experiment runs only on Windows. But even there, the illusion is surprisingly convincing.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;"...If the software doesn’t exist, sometimes you just have to simulate it into existence."&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;This wasn’t just about visual tweaks — it was about reimagining the virtualization experience entirely.&lt;br&gt;
Every icon, every title bar, every missing menu had a purpose: to dissolve the border between host and guest, making the virtual system feel native, invisible, seamlessly embedded.&lt;/p&gt;




&lt;h3&gt;
  
  
  🎯 3.  Why VirtualBox?
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Some might ask: why not use VMware instead?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Well, &lt;strong&gt;VirtualBox&lt;/strong&gt; gave me the flexibility I needed — it's open-source, scriptable, and wonderfully customizable.&lt;/p&gt;

&lt;p&gt;Sure, it's not the most powerful hypervisor out there, but when it comes to crafting illusions, it’s the perfect canvas.&lt;br&gt;
And let’s be honest: if a hypothetical Parallels Desktop for Windows had ever existed, it likely wouldn’t have matched VMware’s virtualization performance.&lt;/p&gt;

&lt;p&gt;VMware focuses heavily on Windows, making it almost the opposite of &lt;strong&gt;Parallels&lt;/strong&gt;, which is developed exclusively for macOS.&lt;br&gt;
In that sense, choosing VirtualBox wasn’t about chasing raw power — it was about bending reality to fit a vision&lt;/p&gt;




&lt;h2&gt;
  
  
  🧰 How I created the illusion!
&lt;/h2&gt;

&lt;p&gt;Even though I wasn’t able to fully modify VirtualBox’s entire UI, that didn’t stop me from reshaping the experience at the VM window level.&lt;br&gt;
Using a mix of clever tools and command-line magic, I customized the virtual machine’s appearance to mimic Parallels Desktop’s minimal aesthetic:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;I &lt;strong&gt;removed all default menu bars&lt;/strong&gt; to keep the window clean and immersive.&lt;/li&gt;
&lt;li&gt;With &lt;strong&gt;VBoxManage&lt;/strong&gt;, I changed the VM icon directly from the CLI.&lt;/li&gt;
&lt;li&gt;Thanks to &lt;strong&gt;AutoHotkey&lt;/strong&gt;, I ran scripts that dynamically updated window titles and replaced icons in real time.&lt;/li&gt;
&lt;li&gt;I downloaded the &lt;strong&gt;Parallels Desktop icon&lt;/strong&gt;, converted it, and swapped it into the interface using &lt;strong&gt;Resource Hacker&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;I changed the &lt;strong&gt;VirtualBox&lt;/strong&gt; shortcuts names to &lt;strong&gt;Parallels Desktop&lt;/strong&gt;, and created another &lt;strong&gt;AutoHotkey&lt;/strong&gt; script to start &lt;strong&gt;VirtualBox&lt;/strong&gt; with the window title changed to &lt;strong&gt;Parallels&lt;/strong&gt;.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The result? A VirtualBox VM that looks and behaves like something Parallels might have built for Windows — a visual and perceptual transformation that breaks the barrier between host and guest.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;To make everything even more convincing&lt;/strong&gt;, I added one last touch.&lt;br&gt;
I downloaded the classic &lt;strong&gt;two red bands&lt;/strong&gt; from Parallels Desktop — a visual signature that anyone familiar with the software would instantly recognize.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Using &lt;strong&gt;GIMP&lt;/strong&gt;, I carefully placed those bands over the system's OS icon, creating a layered image that visually mimics the official Parallels branding.&lt;br&gt;
Once re-exported, the final result made the illusion even more real and immersive — as if the VM were part of an actual Parallels build for Windows.&lt;/p&gt;

&lt;h3&gt;
  
  
  🎨 A touch of personality or motivation
&lt;/h3&gt;

&lt;p&gt;It wasn't just about making things look cool, it was about creating something that felt real. Something that could live in a world where Parallels would re-embrace Windows. The red stripes weren't a decoration; they were the signature of a dream I wanted to resurrect, something to please Windows and Linux users, to console them for the absence of Parallels Desktop on Windows/Linux.&lt;/p&gt;

&lt;h3&gt;
  
  
  🔍 A reflection on perception vs. reality
&lt;/h3&gt;

&lt;p&gt;Did the illusion work? Those seeing the VM for the first time weren't asking "Is this VirtualBox?", but "How did you get Parallels on Windows?" And that question alone meant I'd succeeded: the line between simulation and reality had been blurred just enough to make it believable, this is all camouflage up to a certain point.&lt;/p&gt;

&lt;h3&gt;
  
  
  🧠 Philosophical angle (if you like deeper tones
&lt;/h3&gt;

&lt;p&gt;Software isn't just function: it's emotion, memory, branding, aspiration. By visually rebuilding Parallels, I wasn't simply modifying a window... I was restoring an experience that had never been offered to Windows users — until now.&lt;/p&gt;

&lt;p&gt;We should be grateful for it, even if the underlying virtualization engine remains VirtualBox.&lt;/p&gt;

&lt;p&gt;And let’s face it: expectations weren’t high to begin with… but perhaps that made the illusion all the more satisfying.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Even I sometimes forgot I was using VirtualBox. That, to me, was proof that the illusion wasn't just visual — it changed how I experienced virtualization.&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h2&gt;
  
  
  🧾 Introduction to screenshots
&lt;/h2&gt;

&lt;p&gt;&lt;em&gt;Enough talk. Let’s look at it.&lt;br&gt;
Here’s what my Parallels-inspired illusion looks like — built entirely with VirtualBox, scripts, icon edits, and a little creative defiance&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ft8ds4cwkt0bprsvyjfkc.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ft8ds4cwkt0bprsvyjfkc.png" alt=" " width="800" height="448"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fu1h7fi717fbxl17uuhpn.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fu1h7fi717fbxl17uuhpn.png" alt=" " width="800" height="449"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fbx4uj8h42c0pewhao0rn.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fbx4uj8h42c0pewhao0rn.png" alt=" " width="800" height="541"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;The actual VirtualBox UI with some customizations, changed icon and window text&lt;/p&gt;

&lt;p&gt;No virtual machine has ever felt so integrated. When even the most experienced users pause and ask, "Wait, is this Parallels on Windows?", you know the trick has worked—it's all done correctly and believably!&lt;/p&gt;

&lt;p&gt;⚠️ This article does not aim to clone or impersonate any commercial software.&lt;br&gt;
It simply explores how open tools like VirtualBox can be visually reimagined to mimic the aesthetic of other environments.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;I didn't set out to create a clone. I set out to create a possibility, a possibility that never officially existed, but now lives on through perception. This experiment reminded me that creativity isn't bound by platforms or limitations. Sometimes, the best features are the ones we imagine. Since I've always imagined Parallels Desktop on Windows, my dream has now come true, to a certain extent.&lt;/p&gt;




&lt;h2&gt;
  
  
  🔚 Bonus insight: when illusion isn’t enough
&lt;/h2&gt;

&lt;p&gt;This experiment was about perception, reinterpreting what virtualization could look like on Windows. But if your goal is raw power, advanced features, and enterprise-level performance, it's worth mentioning:&lt;br&gt;
💼 &lt;strong&gt;VMware Workstation Pro&lt;/strong&gt; remains the benchmark for professional virtualization on Windows and Linux.&lt;/p&gt;

&lt;p&gt;It's robust, well-maintained, and often surpasses both &lt;strong&gt;VirtualBox&lt;/strong&gt; and &lt;strong&gt;Parallels&lt;/strong&gt; in terms of stability and functionality. If there were a version of &lt;strong&gt;Parallels Desktop&lt;/strong&gt; for Windows, it would certainly have beaten it straight away.&lt;br&gt;
So, if illusion has its charm, performance has its champions.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;In the end, it’s not about replacing Parallels, or replicating VMware’s precision.&lt;br&gt;
It’s about imagining — reshaping a tool, bending its form, and remembering that sometimes, a small illusion can spark a bigger idea.&lt;br&gt;
Whether you choose performance or perception… at least now, there’s a choice.&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h2&gt;
  
  
  🏁 Final thoughts: not just a VM, but a vision
&lt;/h2&gt;

&lt;p&gt;What started with boredom became a form of digital expression.&lt;br&gt;
A simple VirtualBox window, stripped and reshaped, turned into a parallel experience — one that never existed officially, but now feels strangely real.&lt;/p&gt;

&lt;p&gt;This project wasn’t about replacing Parallels. It was about reclaiming possibility.&lt;br&gt;
Windows users deserve elegant virtualization too — and if the industry won’t deliver it, sometimes curiosity and ingenuity can.&lt;/p&gt;

&lt;p&gt;I know it’s still VirtualBox under the hood. And that’s okay.&lt;br&gt;
Because sometimes, the engine isn’t what matters most — the illusion is.&lt;br&gt;
Imagination is the real hypervisor.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Imagination is the real hypervisor.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Did this illusion spark something in you? Ever tried transforming a tool just for the fun of it — or the aesthetics?&lt;br&gt;
Share your thoughts below — I'd love to hear how you've reimagined software experiences, or even built your own digital illusions.&lt;/p&gt;

&lt;p&gt;I'm open and happy to hear your opinion and other ideas! 😊&lt;/p&gt;

</description>
      <category>virtualization</category>
      <category>virtualbox</category>
      <category>parallels</category>
    </item>
    <item>
      <title>How to Easily Distinguish Multiple Binary Files Appended to a Win32 Executable</title>
      <dc:creator>Stefor07</dc:creator>
      <pubDate>Mon, 23 Jun 2025 13:22:13 +0000</pubDate>
      <link>https://dev.to/stefor07/how-to-easily-distinguish-binary-data-concatenated-to-a-win32-executable-2d4g</link>
      <guid>https://dev.to/stefor07/how-to-easily-distinguish-binary-data-concatenated-to-a-win32-executable-2d4g</guid>
      <description>&lt;p&gt;In this article, you'll learn how to reliably identify and extract &lt;strong&gt;multiple binary files appended to the end of an executable file&lt;/strong&gt; using only &lt;strong&gt;offsets&lt;/strong&gt; and &lt;strong&gt;size calculations&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;While experimenting with binary file concatenation on Windows executables, I discovered a &lt;strong&gt;simple and practical method&lt;/strong&gt; to distinguish and load multiple appended files — &lt;strong&gt;without relying on any extra markers, headers, or metadata.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Unlike the technique shown in the fourth method &lt;a href="https://dev.to/stefor07/how-to-embed-binary-data-into-a-win32-executable-file-in-4-methods-43kp"&gt;How to Embed Binary Data into a Win32 Executable File in 4 Methods&lt;/a&gt;, which supports only &lt;strong&gt;a single appended file&lt;/strong&gt;, this approach scales naturally to &lt;strong&gt;multiple appended files&lt;/strong&gt;, with a clean and straightforward logic.&lt;/p&gt;




&lt;h2&gt;
  
  
  Step 1: Declaring Helper Functions in Code
&lt;/h2&gt;

&lt;p&gt;Add these helper functions in your code:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;1.&lt;/strong&gt; Determine the real size of the executable (excluding any appended binary data).&lt;br&gt;
&lt;strong&gt;2.&lt;/strong&gt; Load the appended binary data into memory using the &lt;strong&gt;new memory mapping helper function&lt;/strong&gt; which:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Accepts a struct argument to store all necessary handles for proper cleanup;&lt;/li&gt;
&lt;li&gt;Takes a DWORD argument to specify how many bytes to skip at the beginning (the executable + any previously handled appended files);&lt;/li&gt;
&lt;li&gt;Ensures safe and efficient resource management by allowing explicit freeing of memory-mapped views and handles.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Gets the actual size of the EXE excluding appended binary data&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight cpp"&gt;&lt;code&gt;&lt;span class="n"&gt;DWORD&lt;/span&gt; &lt;span class="nf"&gt;GetRealExeSize&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;const&lt;/span&gt; &lt;span class="n"&gt;TCHAR&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="n"&gt;exePath&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="n"&gt;HANDLE&lt;/span&gt; &lt;span class="n"&gt;hFile&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;CreateFile&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;exePath&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;GENERIC_READ&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;FILE_SHARE_READ&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nb"&gt;NULL&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;OPEN_EXISTING&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;FILE_ATTRIBUTE_NORMAL&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nb"&gt;NULL&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;hFile&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="n"&gt;INVALID_HANDLE_VALUE&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

    &lt;span class="n"&gt;HANDLE&lt;/span&gt; &lt;span class="n"&gt;hMapping&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;CreateFileMapping&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;hFile&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nb"&gt;NULL&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;PAGE_READONLY&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nb"&gt;NULL&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;!&lt;/span&gt;&lt;span class="n"&gt;hMapping&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="n"&gt;CloseHandle&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;hFile&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt; &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;

    &lt;span class="n"&gt;LPBYTE&lt;/span&gt; &lt;span class="n"&gt;pBase&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;LPBYTE&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="n"&gt;MapViewOfFile&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;hMapping&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;FILE_MAP_READ&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;!&lt;/span&gt;&lt;span class="n"&gt;pBase&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="n"&gt;CloseHandle&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;hMapping&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt; &lt;span class="n"&gt;CloseHandle&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;hFile&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt; &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;

    &lt;span class="n"&gt;IMAGE_DOS_HEADER&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="n"&gt;pDosHeader&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;IMAGE_DOS_HEADER&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="n"&gt;pBase&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;pDosHeader&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="n"&gt;e_magic&lt;/span&gt; &lt;span class="o"&gt;!=&lt;/span&gt; &lt;span class="n"&gt;IMAGE_DOS_SIGNATURE&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="n"&gt;UnmapViewOfFile&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;pBase&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
        &lt;span class="n"&gt;CloseHandle&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;hMapping&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
        &lt;span class="n"&gt;CloseHandle&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;hFile&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;

    &lt;span class="n"&gt;IMAGE_NT_HEADERS&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="n"&gt;pNtHeaders&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;IMAGE_NT_HEADERS&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="p"&gt;)(&lt;/span&gt;&lt;span class="n"&gt;pBase&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;pDosHeader&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="n"&gt;e_lfanew&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;pNtHeaders&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="n"&gt;Signature&lt;/span&gt; &lt;span class="o"&gt;!=&lt;/span&gt; &lt;span class="n"&gt;IMAGE_NT_SIGNATURE&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="n"&gt;UnmapViewOfFile&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;pBase&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
        &lt;span class="n"&gt;CloseHandle&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;hMapping&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
        &lt;span class="n"&gt;CloseHandle&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;hFile&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="p"&gt;};&lt;/span&gt;

    &lt;span class="n"&gt;DWORD&lt;/span&gt; &lt;span class="n"&gt;maxEnd&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="n"&gt;IMAGE_SECTION_HEADER&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="n"&gt;pSection&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;IMAGE_FIRST_SECTION&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;pNtHeaders&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;i&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="n"&gt;i&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt; &lt;span class="n"&gt;pNtHeaders&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="n"&gt;FileHeader&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;NumberOfSections&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="o"&gt;++&lt;/span&gt;&lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="n"&gt;DWORD&lt;/span&gt; &lt;span class="n"&gt;sectionEnd&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;pSection&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="p"&gt;].&lt;/span&gt;&lt;span class="n"&gt;PointerToRawData&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;pSection&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="p"&gt;].&lt;/span&gt;&lt;span class="n"&gt;SizeOfRawData&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
        &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;sectionEnd&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;maxEnd&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="n"&gt;maxEnd&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;sectionEnd&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;


    &lt;span class="n"&gt;UnmapViewOfFile&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;pBase&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="n"&gt;CloseHandle&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;hMapping&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="n"&gt;CloseHandle&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;hFile&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;maxEnd&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Version 1: Heap allocation (for small/medium data)&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight cpp"&gt;&lt;code&gt;&lt;span class="n"&gt;BYTE&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="nf"&gt;LoadAppendedData&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;DWORD&lt;/span&gt;&lt;span class="o"&gt;&amp;amp;&lt;/span&gt; &lt;span class="n"&gt;outSize&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;DWORD32&lt;/span&gt; &lt;span class="n"&gt;skippedSize&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="n"&gt;TCHAR&lt;/span&gt; &lt;span class="n"&gt;exePath&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;MAX_PATH&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt; &lt;span class="p"&gt;};&lt;/span&gt;
    &lt;span class="n"&gt;GetModuleFileName&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;NULL&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;exePath&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;MAX_PATH&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

    &lt;span class="n"&gt;DWORD&lt;/span&gt; &lt;span class="n"&gt;exeSize&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;GetRealExeSize&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;exePath&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

    &lt;span class="n"&gt;DWORD&lt;/span&gt; &lt;span class="n"&gt;totalSkippedSize&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;exeSize&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;skippedSize&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

    &lt;span class="n"&gt;HANDLE&lt;/span&gt; &lt;span class="n"&gt;hFile&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;CreateFile&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;exePath&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;GENERIC_READ&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;FILE_SHARE_READ&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nb"&gt;NULL&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;OPEN_EXISTING&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;FILE_ATTRIBUTE_NORMAL&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nb"&gt;NULL&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;hFile&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="n"&gt;INVALID_HANDLE_VALUE&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nb"&gt;nullptr&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

    &lt;span class="n"&gt;LARGE_INTEGER&lt;/span&gt; &lt;span class="n"&gt;fileSize&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;!&lt;/span&gt;&lt;span class="n"&gt;GetFileSizeEx&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;hFile&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="n"&gt;fileSize&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="n"&gt;CloseHandle&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;hFile&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt; &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nb"&gt;nullptr&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;

    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;fileSize&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;QuadPart&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;=&lt;/span&gt; &lt;span class="n"&gt;totalIgnoredSize&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="n"&gt;CloseHandle&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;hFile&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt; &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nb"&gt;nullptr&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;

    &lt;span class="n"&gt;DWORD&lt;/span&gt; &lt;span class="n"&gt;appendedSize&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;DWORD&lt;/span&gt;&lt;span class="p"&gt;)(&lt;/span&gt;&lt;span class="n"&gt;fileSize&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;QuadPart&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="n"&gt;skippedSize&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="n"&gt;BYTE&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="n"&gt;data&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="n"&gt;BYTE&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;appendedSize&lt;/span&gt;&lt;span class="p"&gt;];&lt;/span&gt;

    &lt;span class="n"&gt;SetFilePointer&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;hFile&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;totalSkippedSize&lt;/span&gt; &lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nb"&gt;NULL&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;FILE_BEGIN&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="n"&gt;DWORD&lt;/span&gt; &lt;span class="n"&gt;bytesRead&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="n"&gt;ReadFile&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;hFile&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;data&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;appendedSize&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="n"&gt;bytesRead&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nb"&gt;NULL&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="n"&gt;CloseHandle&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;hFile&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;bytesRead&lt;/span&gt; &lt;span class="o"&gt;!=&lt;/span&gt; &lt;span class="n"&gt;appendedSize&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="k"&gt;delete&lt;/span&gt;&lt;span class="p"&gt;[]&lt;/span&gt; &lt;span class="n"&gt;data&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nb"&gt;nullptr&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;

    &lt;span class="n"&gt;outSize&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;appendedSize&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;data&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Version 2: Memory-mapped (recommended for large files)&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Before declaring the helper function, you should define a structure to store the necessary handles for releasing memory-mapped resources safely:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight cpp"&gt;&lt;code&gt;&lt;span class="k"&gt;struct&lt;/span&gt; &lt;span class="nc"&gt;MappedAppendedData&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="n"&gt;BYTE&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="n"&gt;mappedView&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;nullptr&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;   &lt;span class="c1"&gt;// Pointer to the full mapped view (used in UnmapViewOfFile)&lt;/span&gt;
    &lt;span class="n"&gt;BYTE&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="n"&gt;basePtr&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;nullptr&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;      &lt;span class="c1"&gt;// Offset to where the appended data starts&lt;/span&gt;
    &lt;span class="kt"&gt;size_t&lt;/span&gt; &lt;span class="n"&gt;totalSize&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="n"&gt;HANDLE&lt;/span&gt; &lt;span class="n"&gt;hFile&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;NULL&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="n"&gt;HANDLE&lt;/span&gt; &lt;span class="n"&gt;hMapping&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;NULL&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;};&lt;/span&gt;

&lt;span class="c1"&gt;// Declare an instance of the structure (ideally as extern if used across multiple files)&lt;/span&gt;
&lt;span class="n"&gt;MappedAppendedData&lt;/span&gt; &lt;span class="n"&gt;g_mappedAppendedData&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Now, declare the helper function as follows:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight cpp"&gt;&lt;code&gt;&lt;span class="n"&gt;BYTE&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="nf"&gt;LoadAppendedData&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;MappedAppendedData&lt;/span&gt;&lt;span class="o"&gt;&amp;amp;&lt;/span&gt; &lt;span class="n"&gt;mappedDataStruct&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;DWORD&lt;/span&gt;&lt;span class="o"&gt;&amp;amp;&lt;/span&gt; &lt;span class="n"&gt;outSize&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;DWORD&lt;/span&gt; &lt;span class="n"&gt;skippedSize&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="n"&gt;TCHAR&lt;/span&gt; &lt;span class="n"&gt;exePath&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;MAX_PATH&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt; &lt;span class="p"&gt;};&lt;/span&gt;
    &lt;span class="n"&gt;GetModuleFileName&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;NULL&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;exePath&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;MAX_PATH&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

    &lt;span class="n"&gt;DWORD&lt;/span&gt; &lt;span class="n"&gt;exeSize&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;GetRealExeSize&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;exePath&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

    &lt;span class="n"&gt;DWORD&lt;/span&gt; &lt;span class="n"&gt;totalSkippedSize&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;exeSize&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;skippedSize&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

    &lt;span class="n"&gt;HANDLE&lt;/span&gt; &lt;span class="n"&gt;hFile&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;CreateFile&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;exePath&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;GENERIC_READ&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;FILE_SHARE_READ&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nb"&gt;NULL&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;OPEN_EXISTING&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;FILE_ATTRIBUTE_NORMAL&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nb"&gt;NULL&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;hFile&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="n"&gt;INVALID_HANDLE_VALUE&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nb"&gt;nullptr&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

    &lt;span class="n"&gt;HANDLE&lt;/span&gt; &lt;span class="n"&gt;hMapping&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;CreateFileMapping&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;hFile&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nb"&gt;NULL&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;PAGE_READONLY&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nb"&gt;NULL&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;!&lt;/span&gt;&lt;span class="n"&gt;hMapping&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="n"&gt;CloseHandle&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;hFile&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt; &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nb"&gt;nullptr&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;

    &lt;span class="n"&gt;LPBYTE&lt;/span&gt; &lt;span class="n"&gt;pBase&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;LPBYTE&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="n"&gt;MapViewOfFile&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;hMapping&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;FILE_MAP_READ&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;!&lt;/span&gt;&lt;span class="n"&gt;pBase&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="n"&gt;CloseHandle&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;hMapping&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt; &lt;span class="n"&gt;CloseHandle&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;hFile&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt; &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nb"&gt;nullptr&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;

    &lt;span class="n"&gt;LARGE_INTEGER&lt;/span&gt; &lt;span class="n"&gt;fileSize&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;!&lt;/span&gt;&lt;span class="n"&gt;GetFileSizeEx&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;hFile&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="n"&gt;fileSize&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="n"&gt;UnmapViewOfFile&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;pBase&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
        &lt;span class="n"&gt;CloseHandle&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;hMapping&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
        &lt;span class="n"&gt;CloseHandle&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;hFile&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nb"&gt;nullptr&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;

    &lt;span class="n"&gt;DWORD&lt;/span&gt; &lt;span class="n"&gt;appendedSize&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;DWORD&lt;/span&gt;&lt;span class="p"&gt;)(&lt;/span&gt;&lt;span class="n"&gt;fileSize&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;QuadPart&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="n"&gt;totalSkippedSize&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;appendedSize&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="n"&gt;UnmapViewOfFile&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;pBase&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
        &lt;span class="n"&gt;CloseHandle&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;hMapping&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
        &lt;span class="n"&gt;CloseHandle&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;hFile&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nb"&gt;nullptr&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;

    &lt;span class="n"&gt;mappedDataStruct&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;mappedView&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;pBase&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="n"&gt;mappedDataStruct&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;basePtr&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;pBase&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;totalSkippedSize&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="n"&gt;mappedDataStruct&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;hFile&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;hFile&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="n"&gt;mappedDataStruct&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;hMapping&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;hMapping&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="n"&gt;mappedDataStruct&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;totalSize&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;appendedSize&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

    &lt;span class="n"&gt;outSize&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;appendedSize&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;pBase&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;totalSkippedSize&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Then you will need another function to clean up the mapped memory:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Clean Mapped Memory&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight cpp"&gt;&lt;code&gt;&lt;span class="kt"&gt;void&lt;/span&gt; &lt;span class="nf"&gt;FreeMappedAppendedData&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;MappedAppendedData&lt;/span&gt;&lt;span class="o"&gt;&amp;amp;&lt;/span&gt; &lt;span class="n"&gt;data&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;data&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;mappedView&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="n"&gt;UnmapViewOfFile&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;data&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;mappedView&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
        &lt;span class="n"&gt;data&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;mappedView&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;nullptr&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
        &lt;span class="n"&gt;data&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;basePtr&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;nullptr&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;

    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;data&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;hMapping&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="n"&gt;CloseHandle&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;data&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;hMapping&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
        &lt;span class="n"&gt;data&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;hMapping&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;NULL&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;

    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;data&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;hFile&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="n"&gt;CloseHandle&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;data&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;hFile&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
        &lt;span class="n"&gt;data&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;hFile&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;NULL&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;

    &lt;span class="n"&gt;data&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;totalSize&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;p&gt;&lt;strong&gt;⚠️ Deprecated Variant (Simplified)&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;This is an older, simplified version of the memory mapping function.&lt;br&gt;
It works for quick testing, but &lt;strong&gt;does not store or release the file and mapping handles&lt;/strong&gt;, which can result in serious memory issues.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight cpp"&gt;&lt;code&gt;&lt;span class="n"&gt;BYTE&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="nf"&gt;LoadAppendedData&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;DWORD&lt;/span&gt;&lt;span class="o"&gt;&amp;amp;&lt;/span&gt; &lt;span class="n"&gt;outSize&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;DWORD&lt;/span&gt; &lt;span class="n"&gt;skippedSize&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="n"&gt;TCHAR&lt;/span&gt; &lt;span class="n"&gt;exePath&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;MAX_PATH&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt; &lt;span class="p"&gt;};&lt;/span&gt;
    &lt;span class="n"&gt;GetModuleFileName&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;NULL&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;exePath&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;MAX_PATH&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

    &lt;span class="n"&gt;DWORD&lt;/span&gt; &lt;span class="n"&gt;exeSize&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;GetRealExeSize&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;exePath&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

    &lt;span class="n"&gt;DWORD&lt;/span&gt; &lt;span class="n"&gt;totalSkippedSize&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;exeSize&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;skippedSize&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

    &lt;span class="n"&gt;HANDLE&lt;/span&gt; &lt;span class="n"&gt;hFile&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;CreateFile&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;exePath&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;GENERIC_READ&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;FILE_SHARE_READ&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nb"&gt;NULL&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;OPEN_EXISTING&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;FILE_ATTRIBUTE_NORMAL&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nb"&gt;NULL&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;hFile&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="n"&gt;INVALID_HANDLE_VALUE&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nb"&gt;nullptr&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

    &lt;span class="n"&gt;HANDLE&lt;/span&gt; &lt;span class="n"&gt;hMapping&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;CreateFileMapping&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;hFile&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nb"&gt;NULL&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;PAGE_READONLY&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nb"&gt;NULL&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;!&lt;/span&gt;&lt;span class="n"&gt;hMapping&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="n"&gt;CloseHandle&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;hFile&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt; &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nb"&gt;nullptr&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;

    &lt;span class="n"&gt;LPBYTE&lt;/span&gt; &lt;span class="n"&gt;pBase&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;LPBYTE&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="n"&gt;MapViewOfFile&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;hMapping&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;FILE_MAP_READ&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;!&lt;/span&gt;&lt;span class="n"&gt;pBase&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="n"&gt;CloseHandle&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;hMapping&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt; &lt;span class="n"&gt;CloseHandle&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;hFile&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt; &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nb"&gt;nullptr&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;

    &lt;span class="n"&gt;LARGE_INTEGER&lt;/span&gt; &lt;span class="n"&gt;fileSize&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;!&lt;/span&gt;&lt;span class="n"&gt;GetFileSizeEx&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;hFile&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="n"&gt;fileSize&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="n"&gt;UnmapViewOfFile&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;pBase&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
        &lt;span class="n"&gt;CloseHandle&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;hMapping&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
        &lt;span class="n"&gt;CloseHandle&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;hFile&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nb"&gt;nullptr&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;

    &lt;span class="n"&gt;DWORD&lt;/span&gt; &lt;span class="n"&gt;appendedSize&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;DWORD&lt;/span&gt;&lt;span class="p"&gt;)(&lt;/span&gt;&lt;span class="n"&gt;fileSize&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;QuadPart&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="n"&gt;totalIgnoredSize&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;appendedSize&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="n"&gt;UnmapViewOfFile&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;pBase&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
        &lt;span class="n"&gt;CloseHandle&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;hMapping&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
        &lt;span class="n"&gt;CloseHandle&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;hFile&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nb"&gt;nullptr&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;

    &lt;span class="n"&gt;outSize&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;appendedSize&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;pBase&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;totalSkippedSize&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;blockquote&gt;
&lt;p&gt;⚠️ &lt;strong&gt;Note&lt;/strong&gt;:&lt;/p&gt;

&lt;p&gt;This version does not track or release system handles (&lt;code&gt;HANDLE&lt;/code&gt;, &lt;code&gt;MapViewOfFile&lt;/code&gt;).&lt;/p&gt;

&lt;p&gt;Mapping multiple files with this function can quickly exhaust system resources, leading to &lt;code&gt;ERROR_NOT_ENOUGH_MEMORY (8)&lt;/code&gt; or even application instability.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Do not use in production environments.&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Later in this guide, I’ll explain how to map all the appended data in memory &lt;strong&gt;at once&lt;/strong&gt;, and how to access each segment by declaring pointers and calculating their respective sizes.&lt;/p&gt;




&lt;h2&gt;
  
  
  Step 2: Files Size Retrieving
&lt;/h2&gt;

&lt;p&gt;Suppose we now want to embed multiple files into our application—for example, three files appended at the end of the executable.&lt;/p&gt;

&lt;p&gt;Let's imagine that the various files have different sizes:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;The &lt;strong&gt;first file&lt;/strong&gt; is 153 MB with a size in 160432128 bytes&lt;/li&gt;
&lt;li&gt;The &lt;strong&gt;second file&lt;/strong&gt; is 51 MB with a size in 53477376 bytes&lt;/li&gt;
&lt;li&gt;The &lt;strong&gt;third file&lt;/strong&gt; is 79 MB with a size in 82837504 bytes&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The best way to determine the exact size of the files you want to embed is as follows:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;1.&lt;/strong&gt; Compile the application with the minimal executable (without any appended data).&lt;br&gt;
&lt;strong&gt;2.&lt;/strong&gt; Copy or move the files to be appended to the executable in the build folder (Debug or Release)&lt;br&gt;
&lt;strong&gt;3.&lt;/strong&gt; Open PowerShell in the current folder and run this command: &lt;code&gt;dir&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;The output will look like this:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight powershell"&gt;&lt;code&gt;&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="n"&gt;Directory:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;Build&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Directory&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Path&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt;

&lt;/span&gt;&lt;span class="n"&gt;Mode&lt;/span&gt;&lt;span class="w"&gt;     &lt;/span&gt;&lt;span class="nx"&gt;Length&lt;/span&gt;&lt;span class="w"&gt;       &lt;/span&gt;&lt;span class="nx"&gt;Name&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="o"&gt;----&lt;/span&gt;&lt;span class="w"&gt;     &lt;/span&gt;&lt;span class="o"&gt;------&lt;/span&gt;&lt;span class="w"&gt;       &lt;/span&gt;&lt;span class="o"&gt;----&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="nt"&gt;-a&lt;/span&gt;&lt;span class="o"&gt;----&lt;/span&gt;&lt;span class="w"&gt;   &lt;/span&gt;&lt;span class="mi"&gt;160432128&lt;/span&gt;&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="n"&gt;file1.bin&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="nt"&gt;-a&lt;/span&gt;&lt;span class="o"&gt;----&lt;/span&gt;&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="nx"&gt;53477376&lt;/span&gt;&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="nx"&gt;file2.bin&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="nt"&gt;-a&lt;/span&gt;&lt;span class="o"&gt;----&lt;/span&gt;&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="mi"&gt;82837504&lt;/span&gt;&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="n"&gt;file3.bin&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="nt"&gt;-a&lt;/span&gt;&lt;span class="o"&gt;----&lt;/span&gt;&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="nx"&gt;12345678&lt;/span&gt;&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="nx"&gt;your_application.exe&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="nt"&gt;-a&lt;/span&gt;&lt;span class="o"&gt;----&lt;/span&gt;&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="mi"&gt;12345678&lt;/span&gt;&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="n"&gt;your_application.pdb&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;In this way we can note the size of all the various files, copy them or keep the Powershell window open&lt;/p&gt;

&lt;h2&gt;
  
  
  Step 3: Accessing Embedded Files at Runtime
&lt;/h2&gt;

&lt;p&gt;Once we know the sizes and order of the files to append on the executable, we can access them at runtime by calculating the correct offset and expected size.&lt;/p&gt;

&lt;p&gt;The process depends on whether the target file is the first, intermediate, or last in the concatenated bundle.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Example: Appended Files Overview&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight cpp"&gt;&lt;code&gt;&lt;span class="cm"&gt;/*
    Appended files (in order):

    File 1 size: 160,432,128 bytes
    File 2 size:  53,477,376 bytes
    File 3 size:  82,837,504 bytes
*/&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Accessing the First Appended File (Simplest Case)
&lt;/h3&gt;

&lt;p&gt;Offset is zero. If &lt;code&gt;LoadAppendedData&lt;/code&gt; gives you the full remaining data, you must subtract the sizes of the files that come after.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight cpp"&gt;&lt;code&gt;&lt;span class="n"&gt;DWORD&lt;/span&gt; &lt;span class="n"&gt;embedded_data_size&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="n"&gt;BYTE&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="n"&gt;embedded_data&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;LoadAppendedData&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;embedded_data_size&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="c1"&gt;// Adjust to only include the first file&lt;/span&gt;
&lt;span class="n"&gt;embedded_data_size&lt;/span&gt; &lt;span class="o"&gt;-=&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;fileSize2&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;fileSize3&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Accessing the Last Appended File (Simplest Case)
&lt;/h3&gt;

&lt;p&gt;Only sum the sizes of the files that come before it to calculate the offset. You don't need to subtract anything.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight cpp"&gt;&lt;code&gt;&lt;span class="n"&gt;DWORD&lt;/span&gt; &lt;span class="n"&gt;embedded_data_size&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="n"&gt;DWORD&lt;/span&gt; &lt;span class="n"&gt;offset&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;fileSize1&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;fileSize2&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="n"&gt;BYTE&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="n"&gt;embedded_data&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;LoadAppendedData&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;embedded_data_size&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;offset&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="c1"&gt;// embedded_data_size is automatically the size of File 3 (last file)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Accessing a File in the Middle
&lt;/h3&gt;

&lt;p&gt;To access a file that has others before and after it, you need to:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;1. Add&lt;/strong&gt; the sizes of the files that come before it → this gives you the correct offset&lt;br&gt;
&lt;strong&gt;2. Subtract&lt;/strong&gt; the sizes of the files that come &lt;strong&gt;after&lt;/strong&gt; it&lt;br&gt;&lt;br&gt;
  → This is required to determine the correct &lt;strong&gt;size&lt;/strong&gt;, unless &lt;code&gt;LoadAppendedData&lt;/code&gt; handles the size internally&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight cpp"&gt;&lt;code&gt;&lt;span class="n"&gt;DWORD&lt;/span&gt; &lt;span class="n"&gt;embedded_data_size&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="n"&gt;DWORD&lt;/span&gt; &lt;span class="n"&gt;offset&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;fileSize1&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="n"&gt;BYTE&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="n"&gt;embedded_data&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;LoadAppendedData&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;embedded_data_size&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;offset&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="c1"&gt;// Remove trailing files to isolate only File 2&lt;/span&gt;
&lt;span class="n"&gt;embedded_data_size&lt;/span&gt; &lt;span class="o"&gt;-=&lt;/span&gt; &lt;span class="n"&gt;fileSize3&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;blockquote&gt;
&lt;p&gt;⚠️ &lt;strong&gt;Important:&lt;/strong&gt; ALWAYS remember to call &lt;code&gt;delete&lt;/code&gt; whenever the pointer pointing to the added data is no longer needed to avoid memory leaks if you are using the heap&lt;/p&gt;

&lt;p&gt;⚠️ &lt;strong&gt;Tip:&lt;/strong&gt; To be better and to avoid confusion, enter the size of each file in the order in which they will be appended.&lt;/p&gt;

&lt;p&gt;ℹ️ &lt;strong&gt;Tip:&lt;/strong&gt; Obviously replace &lt;code&gt;fileSize1&lt;/code&gt;, &lt;code&gt;fileSize2&lt;/code&gt; and &lt;code&gt;fileSize3&lt;/code&gt; with the various sizes of our files that will be appended, there can be even more than three&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h3&gt;
  
  
  ✅ General Rule
&lt;/h3&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;To access a specific file from a concatenated bundle, you need to know:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;"How much to &lt;strong&gt;skip&lt;/strong&gt; (offset = sum of previous files)"&lt;/li&gt;
&lt;li&gt;"How much to &lt;strong&gt;read&lt;/strong&gt; (size = total size − sum of following files)"&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Then pass these to &lt;code&gt;LoadAppendedData&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;🔁 This logic doesn't change, no matter how many files are appended.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h3&gt;
  
  
  💡 Optional Tip
&lt;/h3&gt;

&lt;p&gt;To make this robust, define constants or an array of sizes:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight cpp"&gt;&lt;code&gt;&lt;span class="k"&gt;const&lt;/span&gt; &lt;span class="n"&gt;DWORD&lt;/span&gt; &lt;span class="n"&gt;fileSizes&lt;/span&gt;&lt;span class="p"&gt;[]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="n"&gt;fileSize1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;fileSize2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;fileSize3&lt;/span&gt; &lt;span class="p"&gt;};&lt;/span&gt;

&lt;span class="n"&gt;DWORD&lt;/span&gt; &lt;span class="nf"&gt;GetOffset&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;fileIndex&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="n"&gt;DWORD&lt;/span&gt; &lt;span class="n"&gt;offset&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;i&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="n"&gt;i&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt; &lt;span class="n"&gt;fileIndex&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="o"&gt;++&lt;/span&gt;&lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="n"&gt;offset&lt;/span&gt; &lt;span class="o"&gt;+=&lt;/span&gt; &lt;span class="n"&gt;fileSizes&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="p"&gt;];&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;offset&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="n"&gt;DWORD&lt;/span&gt; &lt;span class="nf"&gt;GetSize&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;fileIndex&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="n"&gt;DWORD&lt;/span&gt; &lt;span class="n"&gt;size&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;i&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;fileIndex&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="n"&gt;i&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt; &lt;span class="n"&gt;std&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;size&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;fileSizes&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt; &lt;span class="o"&gt;++&lt;/span&gt;&lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="n"&gt;size&lt;/span&gt; &lt;span class="o"&gt;+=&lt;/span&gt; &lt;span class="n"&gt;fileSizes&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="p"&gt;];&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;fileSizes&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;fileIndex&lt;/span&gt;&lt;span class="p"&gt;];&lt;/span&gt; &lt;span class="c1"&gt;// or subtract from total if needed&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  Improved method for memory mapping
&lt;/h2&gt;

&lt;p&gt;The updated &lt;code&gt;LoadAppendedData()&lt;/code&gt; now uses a &lt;code&gt;MappedAppendedData&lt;/code&gt; struct to manage system resources safely.&lt;br&gt;&lt;br&gt;
This allows cleanup of all mapped appended data at once using &lt;code&gt;FreeMappedAppendedData()&lt;/code&gt;.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;The offset and size logic remains the same as previously described (see Step 3).&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h3&gt;
  
  
  📌 Alternative Access Strategy
&lt;/h3&gt;

&lt;p&gt;Instead of calculating each appended file’s size by subtracting the sizes of subsequent files, you can:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Manually specify file sizes&lt;/strong&gt;, if already known.
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Use pointer arithmetic&lt;/strong&gt; to locate each file by summing the sizes of the previous ones.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This method is cleaner and more efficient when all appended file sizes are known in advance.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;✅ Example&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight cpp"&gt;&lt;code&gt;&lt;span class="c1"&gt;// Global or extern pointer to the full appended data block&lt;/span&gt;
&lt;span class="n"&gt;DWORD&lt;/span&gt; &lt;span class="n"&gt;fullAppendedDataSize&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="n"&gt;BYTE&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="n"&gt;dataPtr&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;nullptr&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="c1"&gt;// Map the entire appended section once (after the executable)&lt;/span&gt;
&lt;span class="n"&gt;dataPtr&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;LoadAppendedData&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;g_mappedAppendedData&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;fullAppendedDataSize&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="c1"&gt;// Known file sizes (in bytes)&lt;/span&gt;
&lt;span class="k"&gt;const&lt;/span&gt; &lt;span class="n"&gt;DWORD&lt;/span&gt; &lt;span class="n"&gt;fileSize1&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;160432128&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;const&lt;/span&gt; &lt;span class="n"&gt;DWORD&lt;/span&gt; &lt;span class="n"&gt;fileSize2&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;53477376&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;const&lt;/span&gt; &lt;span class="n"&gt;DWORD&lt;/span&gt; &lt;span class="n"&gt;fileSize3&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;82837504&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="c1"&gt;// Access each file using pointer arithmetic&lt;/span&gt;
&lt;span class="k"&gt;const&lt;/span&gt; &lt;span class="n"&gt;BYTE&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="n"&gt;file1&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;dataPtr&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;                          &lt;span class="c1"&gt;// First file&lt;/span&gt;
&lt;span class="k"&gt;const&lt;/span&gt; &lt;span class="n"&gt;BYTE&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="n"&gt;file2&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;dataPtr&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;fileSize1&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;              &lt;span class="c1"&gt;// Second file&lt;/span&gt;
&lt;span class="k"&gt;const&lt;/span&gt; &lt;span class="n"&gt;BYTE&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="n"&gt;file3&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;dataPtr&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;fileSize1&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;fileSize2&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;  &lt;span class="c1"&gt;// Third file&lt;/span&gt;

&lt;span class="c1"&gt;// Clean up mapped memory and handles when done&lt;/span&gt;
&lt;span class="c1"&gt;// FreeMappedAppendedData(g_mappedAppendedData);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;This approach eliminates the need for runtime size calculations and is most effective when the sizes of the appended files are known or fixed.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;You can also expose global pointers using &lt;code&gt;extern&lt;/code&gt; declarations in a dedicated header file, allowing both the appended data and the helper functions to be accessed throughout the application.&lt;/p&gt;

&lt;p&gt;In both scenarios, resource handling is centralized through the &lt;code&gt;MappedAppendedData&lt;/code&gt; structure, which can be cleanly released at any time with a single call to &lt;code&gt;FreeMappedAppendedData()&lt;/code&gt;.&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h3&gt;
  
  
  💡 Bonus: Check the integrity of appended files
&lt;/h3&gt;

&lt;p&gt;Verify the integrity of the added files by adding their sizes and comparing the total to the size returned by the &lt;code&gt;LoadAppendedData&lt;/code&gt; function. If they don't match, tampering may have occurred.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Here is a practical example:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight cpp"&gt;&lt;code&gt;&lt;span class="k"&gt;const&lt;/span&gt; &lt;span class="n"&gt;DWORD&lt;/span&gt; &lt;span class="n"&gt;expectedAppendedDataSize&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;fileSize1&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;fileSize2&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;fileSize3&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt; &lt;span class="c1"&gt;// sum of all appended files&lt;/span&gt;

&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;expectedAppendedDataSize&lt;/span&gt; &lt;span class="o"&gt;!=&lt;/span&gt; &lt;span class="n"&gt;fullAppendedDataSize&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="c1"&gt;// Possible tampering detected — take appropriate action or close the application&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Additionally, you can check the validity of pointers that reference the added data by updating the condition to also check for null pointers:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight cpp"&gt;&lt;code&gt;&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;!&lt;/span&gt;&lt;span class="n"&gt;file1&lt;/span&gt; &lt;span class="o"&gt;||&lt;/span&gt; &lt;span class="o"&gt;!&lt;/span&gt;&lt;span class="n"&gt;file2&lt;/span&gt; &lt;span class="o"&gt;||&lt;/span&gt; &lt;span class="o"&gt;!&lt;/span&gt;&lt;span class="n"&gt;file3&lt;/span&gt; &lt;span class="o"&gt;||&lt;/span&gt; &lt;span class="n"&gt;expectedAppendedDataSize&lt;/span&gt; &lt;span class="o"&gt;!=&lt;/span&gt; &lt;span class="n"&gt;fullAppendedDataSize&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="c1"&gt;// Possible tampering detected — take appropriate action or close the application&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;If the application is also protected with an Authenticode signature, include its size in the total:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight cpp"&gt;&lt;code&gt; &lt;span class="n"&gt;DWORD&lt;/span&gt; &lt;span class="n"&gt;signSize&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;GetAuthenticodeSignatureSize&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;

 &lt;span class="k"&gt;const&lt;/span&gt; &lt;span class="n"&gt;DWORD&lt;/span&gt; &lt;span class="n"&gt;expectedAppendedDataSize&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;fileSize1&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;fileSize2&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;fileSize3&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;signSize&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="c1"&gt;// Also add the size of the signature&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The &lt;code&gt;GetAuthenticodeSignatureSize&lt;/code&gt; function below returns the size of the Authenticode signature, if present, and can be used to avoid false positives.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;⚠️ &lt;strong&gt;Note:&lt;/strong&gt; This technique only detects &lt;strong&gt;coarse tampering&lt;/strong&gt;, such as deleting, truncating, or adding files. It does not verify the integrity of the file content itself. For more effective protection, I recommend using cryptographic hashes or digital signature integrity checks.&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h2&gt;
  
  
  Step 4: Binary File Concatenation
&lt;/h2&gt;

&lt;p&gt;Once the application has been compiled, open a Command Prompt in the build directory and run the following command to append the binary files expected by the application:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight powershell"&gt;&lt;code&gt;&lt;span class="n"&gt;copy&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;/b&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;stub.exe&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;+&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;file1.bin&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;+&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;file2.bin&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;+&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;file3.bin&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;final_stub.exe&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This command creates a new executable (&lt;code&gt;final_stub.exe&lt;/code&gt;) that contains the original application followed by the three binary files appended in order.&lt;/p&gt;

&lt;p&gt;At this point, the files have been embedded into the executable, and the application is ready to be tested.&lt;/p&gt;




&lt;h3&gt;
  
  
  Comparison of Memory Mapping Access Strategies
&lt;/h3&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Aspect&lt;/th&gt;
&lt;th&gt;Version 1 (single offset)&lt;/th&gt;
&lt;th&gt;Version 2 (full mapping)&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Data loaded&lt;/td&gt;
&lt;td&gt;Only the required portion&lt;/td&gt;
&lt;td&gt;Entire appended section&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Handling multiple files&lt;/td&gt;
&lt;td&gt;Need to calculate offset for each file&lt;/td&gt;
&lt;td&gt;Pointer arithmetic allows direct access&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Complexity&lt;/td&gt;
&lt;td&gt;Flexible for single-file access&lt;/td&gt;
&lt;td&gt;Efficient for accessing all files&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Resources&lt;/td&gt;
&lt;td&gt;Lower memory usage&lt;/td&gt;
&lt;td&gt;Uses more memory but avoids multiple mappings&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Updating &lt;code&gt;embedded_data_size&lt;/code&gt;
&lt;/td&gt;
&lt;td&gt;Requires trimming&lt;/td&gt;
&lt;td&gt;Not needed, file sizes are known&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h4&gt;
  
  
  Key Differences
&lt;/h4&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Version 1&lt;/strong&gt;: maps one file at a time. Flexible for single-file access, but impractical for multiple files due to increased mappings, memory leaks risk, and virtual address fragmentation.
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Version 2&lt;/strong&gt;: maps all appended data at once. Allows pointer arithmetic to access any file, centralized cleanup via &lt;code&gt;FreeMappedAppendedData()&lt;/code&gt;, and is simpler to manage. Slightly higher memory usage is the trade-off.
&lt;/li&gt;
&lt;/ul&gt;

&lt;h4&gt;
  
  
  Recommendation for 32-bit Applications
&lt;/h4&gt;

&lt;ul&gt;
&lt;li&gt;Prefer &lt;strong&gt;Version 2&lt;/strong&gt; to avoid virtual address fragmentation and ensure stable access to all files.
&lt;/li&gt;
&lt;li&gt;Ensure total appended data stays under 4 GB, or compile with the &lt;code&gt;LARGEADDRESSAWARE&lt;/code&gt; flag to increase the virtual address space from 2 GB to 4 GB.&lt;/li&gt;
&lt;/ul&gt;




&lt;h3&gt;
  
  
  ⚠️ Memory Mapping Pitfalls in 32-bit Applications
&lt;/h3&gt;

&lt;p&gt;I found that repeatedly calling &lt;code&gt;LoadAppendedData&lt;/code&gt; (using the &lt;strong&gt;deprecated helper function&lt;/strong&gt;) and declaring multiple &lt;code&gt;BYTE*&lt;/code&gt; pointers to map different sections eventually caused a system error after loading approximately &lt;strong&gt;600 MB&lt;/strong&gt; of data.&lt;/p&gt;

&lt;p&gt;As mentioned earlier, this led to an &lt;code&gt;ERROR_NOT_ENOUGH_MEMORY (8)&lt;/code&gt; due to &lt;strong&gt;unreleased memory-mapped handles&lt;/strong&gt;.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;⚠️ While this issue typically doesn’t occur in &lt;strong&gt;64-bit processes&lt;/strong&gt;, it can become a serious limitation in &lt;strong&gt;32-bit applications&lt;/strong&gt;, where virtual address space is constrained.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h3&gt;
  
  
  ✅ Why a Single Memory Mapping is Better
&lt;/h3&gt;

&lt;p&gt;One key advantage of using a &lt;strong&gt;single memory-mapped block&lt;/strong&gt; (via &lt;code&gt;MappedAppendedData&lt;/code&gt;) is that it is &lt;strong&gt;more efficient and manageable&lt;/strong&gt; in both design and cleanup.&lt;/p&gt;

&lt;p&gt;Without this approach, you would need to:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Declare &lt;strong&gt;one instance&lt;/strong&gt; of &lt;code&gt;MappedAppendedData&lt;/code&gt; for &lt;strong&gt;each appended file&lt;/strong&gt;;&lt;/li&gt;
&lt;li&gt;Manually call &lt;code&gt;FreeMappedAppendedData()&lt;/code&gt; on &lt;strong&gt;each instance&lt;/strong&gt; to release its resources (mapped view, handles, memory).&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This adds complexity and increases the risk of resource leaks — especially when working with multiple files.&lt;/p&gt;

&lt;p&gt;In contrast, with a &lt;strong&gt;single memory-mapped block&lt;/strong&gt;, you can:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Map &lt;strong&gt;all appended data at once&lt;/strong&gt;;&lt;/li&gt;
&lt;li&gt;Simply declare &lt;code&gt;BYTE*&lt;/code&gt; pointers and calculate offsets to access each embedded file;&lt;/li&gt;
&lt;li&gt;Call &lt;code&gt;FreeMappedAppendedData()&lt;/code&gt; &lt;strong&gt;just once&lt;/strong&gt;, making memory management significantly easier and safer.&lt;/li&gt;
&lt;/ul&gt;

&lt;blockquote&gt;
&lt;p&gt;✅ Using a single &lt;code&gt;MappedAppendedData&lt;/code&gt; structure for all appended content is not only more efficient — it also results in &lt;strong&gt;cleaner, more maintainable code&lt;/strong&gt;.&lt;br&gt;&lt;br&gt;
Otherwise, you'd need one struct per file and call &lt;code&gt;FreeMappedAppendedData()&lt;/code&gt; on each, increasing the risk of memory/resource leaks.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h3&gt;
  
  
  🧠 Summary
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;❌ Avoid repeated memory mappings without freeing them — especially in 32-bit applications.&lt;/li&gt;
&lt;li&gt;✅ Prefer a &lt;strong&gt;single, centralized memory-mapped block&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;✅ Always free resources using &lt;code&gt;FreeMappedAppendedData()&lt;/code&gt; once done.&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  ⚠️ Warning: Authenticode Signature and Appended Data
&lt;/h2&gt;

&lt;p&gt;If you add binary data to the executable &lt;strong&gt;after compilation&lt;/strong&gt; and &lt;strong&gt;before signing&lt;/strong&gt;, be aware that applying an &lt;strong&gt;Authenticode signature&lt;/strong&gt; (e.g., with &lt;code&gt;signtool.exe&lt;/code&gt;) will &lt;strong&gt;slightly bloat the final executable&lt;/strong&gt;. This may corrupt the binary files appended after the executable, or shift their offsets, making them unreadable at runtime.&lt;/p&gt;

&lt;p&gt;To ensure correct offset calculation and avoid accidental inclusion of the Authenticode signature in your embedded data:&lt;/p&gt;

&lt;p&gt;Before reading all the appended binary content, subtract the size of the Authenticode signature.&lt;/p&gt;

&lt;p&gt;Here is a helper function to obtain the size of the &lt;strong&gt;embedded Authenticode signature:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight cpp"&gt;&lt;code&gt;&lt;span class="n"&gt;DWORD&lt;/span&gt; &lt;span class="nf"&gt;GetAuthenticodeSignatureSize&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="n"&gt;HMODULE&lt;/span&gt; &lt;span class="n"&gt;hModule&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;GetModuleHandle&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;nullptr&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;!&lt;/span&gt;&lt;span class="n"&gt;hModule&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

    &lt;span class="n"&gt;PIMAGE_DOS_HEADER&lt;/span&gt; &lt;span class="n"&gt;pDosHeader&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;reinterpret_cast&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;PIMAGE_DOS_HEADER&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;hModule&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;pDosHeader&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="n"&gt;e_magic&lt;/span&gt; &lt;span class="o"&gt;!=&lt;/span&gt; &lt;span class="n"&gt;IMAGE_DOS_SIGNATURE&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

    &lt;span class="n"&gt;PIMAGE_NT_HEADERS&lt;/span&gt; &lt;span class="n"&gt;pNtHeaders&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;reinterpret_cast&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;PIMAGE_NT_HEADERS&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
        &lt;span class="k"&gt;reinterpret_cast&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;BYTE&lt;/span&gt;&lt;span class="o"&gt;*&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;hModule&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;pDosHeader&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="n"&gt;e_lfanew&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;pNtHeaders&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="n"&gt;Signature&lt;/span&gt; &lt;span class="o"&gt;!=&lt;/span&gt; &lt;span class="n"&gt;IMAGE_NT_SIGNATURE&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

    &lt;span class="k"&gt;const&lt;/span&gt; &lt;span class="n"&gt;IMAGE_DATA_DIRECTORY&lt;/span&gt;&lt;span class="o"&gt;&amp;amp;&lt;/span&gt; &lt;span class="n"&gt;certDir&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt;
        &lt;span class="n"&gt;pNtHeaders&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="n"&gt;OptionalHeader&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;DataDirectory&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;IMAGE_DIRECTORY_ENTRY_SECURITY&lt;/span&gt;&lt;span class="p"&gt;];&lt;/span&gt;

    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;certDir&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Size&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Use the returned size to adjust your file offset before extracting or reading embedded binary data:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight cpp"&gt;&lt;code&gt;&lt;span class="n"&gt;DWORD&lt;/span&gt; &lt;span class="n"&gt;embedded_data_size&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="n"&gt;DWORD&lt;/span&gt; &lt;span class="n"&gt;offset&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;fileSize1&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;fileSize2&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="n"&gt;DWORD&lt;/span&gt; &lt;span class="n"&gt;signSize&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;GetAuthenticodeSignatureSize&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt; &lt;span class="c1"&gt;// Returns the Authenticode signature size from the helper function&lt;/span&gt;

&lt;span class="n"&gt;BYTE&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="n"&gt;embedded_data&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;LoadAppendedData&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;embedded_data_size&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;offset&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="n"&gt;embedded_data_size&lt;/span&gt; &lt;span class="o"&gt;-=&lt;/span&gt; &lt;span class="n"&gt;signSize&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="c1"&gt;// Exclude signature from the tail&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;blockquote&gt;
&lt;p&gt;⚠️ &lt;strong&gt;Warning&lt;/strong&gt; : When calculating the size of previous files to access a specific file in memory, you must always subtract the size of the Authenticode signature. This is true even if, technically, the Authenticode signature is located immediately after the last file appended.&lt;/p&gt;

&lt;p&gt;🔄 &lt;strong&gt;Tip&lt;/strong&gt; : If you use pointer arithmetic on the added files and define the size of each file in a dedicated variable, you will not need to subtract the length of the Authenticode digital signature unless you perform runtime tampering checks.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;This step is not mandatory but it is recommended if you want to keep everything clean and avoid working with extra useless signature, it is however advisable to subtract the size of the signature always to exclude it from the actual total size of the appended files to avoid discrepancies&lt;/p&gt;

&lt;h4&gt;
  
  
  ✅ Why This Matters
&lt;/h4&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Authenticode signatures live &lt;strong&gt;outside the PE sections&lt;/strong&gt;, in a structure called &lt;code&gt;WIN_CERTIFICATE&lt;/code&gt;, appended at the file's end.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;If you read embedded content from the end of the file without accounting for the signature, you'll include that signature garbage, corrupting your parsing logic.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;This issue is especially relevant when:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Using &lt;code&gt;copy /b stub.exe + file.bin final_stub.exe&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Loading or mapping data from the tail of a signed executable&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;/ul&gt;




&lt;h3&gt;
  
  
  How does this method work?
&lt;/h3&gt;

&lt;p&gt;The core idea is to first determine the size of the &lt;strong&gt;clean executable&lt;/strong&gt;, meaning the actual size defined by the PE structure (i.e. the end of the last section). For this, we use a function that parses the PE header and finds where the real executable content ends.&lt;/p&gt;

&lt;p&gt;Once we know the original executable size:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;The &lt;strong&gt;first appended file&lt;/strong&gt; starts exactly &lt;strong&gt;after&lt;/strong&gt; this point.&lt;/li&gt;
&lt;li&gt;To retrieve a file in the &lt;strong&gt;middle&lt;/strong&gt;, we calculate its &lt;strong&gt;offset&lt;/strong&gt; by summing the sizes of all files &lt;strong&gt;before&lt;/strong&gt; it.&lt;/li&gt;
&lt;li&gt;To determine its size, we subtract the sizes of all the files &lt;strong&gt;appended after&lt;/strong&gt; it (unless the function handles this internally).&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This logic is &lt;strong&gt;simple, scalable, and does not require any metadata&lt;/strong&gt; or markers inside the executable — just plain math using file sizes.&lt;/p&gt;




&lt;h3&gt;
  
  
  ⚖️ Pros and Cons of This Approach
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;✔️ Advantages&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Simple&lt;/strong&gt;: No need for custom file formats, headers, or metadata&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Clean&lt;/strong&gt;: No need to modify the PE structure or embed resources&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Scalable&lt;/strong&gt;: Works with any number of appended files&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Self-contained&lt;/strong&gt;: All files are bundled into a single executable&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Portable&lt;/strong&gt;: No dependencies or external tools required at runtime&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;❌ Disadvantages&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Fragile&lt;/strong&gt;: Any mismatch in size or order breaks data access&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;No autodetection&lt;/strong&gt;: You must hardcode or externally manage offsets and sizes&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;No security&lt;/strong&gt;: Appended data can be easily extracted or modified&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;No integrity checks&lt;/strong&gt;: Corruption or tampering is not detectable by default&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Sensitive to signing&lt;/strong&gt;: Authenticode signatures alter the file size and must be accounted for&lt;/li&gt;
&lt;/ul&gt;




&lt;h3&gt;
  
  
  ✅ When to Use This
&lt;/h3&gt;

&lt;p&gt;This method is ideal for:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Internal tools or portable utilities&lt;/li&gt;
&lt;li&gt;Controlled environments&lt;/li&gt;
&lt;li&gt;Self-extracting utilities or installers&lt;/li&gt;
&lt;li&gt;Situations where simplicity and size matter more than security&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;It is &lt;strong&gt;not recommended&lt;/strong&gt; for:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Untrusted or public distribution scenarios&lt;/li&gt;
&lt;li&gt;Applications that require data integrity or confidentiality&lt;/li&gt;
&lt;li&gt;Systems needing runtime discoverability or flexibility&lt;/li&gt;
&lt;/ul&gt;




&lt;h3&gt;
  
  
  🛡️ How to Make It More Robust
&lt;/h3&gt;

&lt;p&gt;To mitigate the risks and improve reliability, consider:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Adding a small metadata block (e.g. magic number, count, size table)&lt;/li&gt;
&lt;li&gt;Using hashes or checksums for each embedded file&lt;/li&gt;
&lt;li&gt;Encrypting sensitive data before appending&lt;/li&gt;
&lt;li&gt;Signing the executable &lt;strong&gt;after&lt;/strong&gt; appending data, and adjusting for signature size in the reader&lt;/li&gt;
&lt;/ul&gt;




&lt;h3&gt;
  
  
  🔐 Further Reading
&lt;/h3&gt;

&lt;p&gt;If you want to enhance this method by adding integrity checks and validation, check out the follow-up article:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;a href="https://dev.to/stefor07/how-to-append-read-only-binary-data-to-an-executable-and-validate-it-via-digital-signature-487e"&gt;🔗 How to Protect Binary Data Appended into an Executable and Validate it with a Digital Signature&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;It explains how to prevent tampering by using digital signatures, providing a much stronger foundation for production use.&lt;/p&gt;




&lt;p&gt;&lt;strong&gt;In summary&lt;/strong&gt;, this technique offers a clean, zero-overhead way to append and load multiple binary resources directly from your executable. It shines in simplicity and flexibility — but like all minimalist solutions, it comes with trade-offs in safety and robustness.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;🔁 &lt;strong&gt;Important:&lt;/strong&gt; Using markers may seem convenient for a few files, but it quickly becomes unmanageable as the number of files grows. Each file would require its own marker, resulting in increased complexity and error potential.&lt;/p&gt;

&lt;p&gt;🧠 Unlike other approaches that use metadata structures to describe embedded files (e.g., names, offsets, sizes), this method relies only on &lt;strong&gt;a priori known offsets and sizes&lt;/strong&gt;, making it simpler, more robust, and free of parsing or complex logic.&lt;/p&gt;

&lt;p&gt;This method, on the other hand, is &lt;strong&gt;scalable, deterministic, and cleaner&lt;/strong&gt;, making it ideal even for dozens of embedded files.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Adapt it wisely to your context!&lt;/p&gt;




&lt;h2&gt;
  
  
  Conclusion
&lt;/h2&gt;

&lt;p&gt;In this article we've explored a straightforward and reliable method to embed and access multiple binary files appended sequentially to a Windows executable — all &lt;strong&gt;without relying on additional markers, headers, or metadata&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;By understanding the &lt;strong&gt;real size of the executable&lt;/strong&gt; (based on PE section data) and applying simple arithmetic with the sizes of the appended files, you can calculate offsets and sizes to correctly extract each embedded file at runtime.&lt;/p&gt;

</description>
      <category>programming</category>
      <category>cpp</category>
    </item>
    <item>
      <title>How to Protect Binary Data Appended into an Executable and Validate it with a Digital Signature</title>
      <dc:creator>Stefor07</dc:creator>
      <pubDate>Thu, 19 Jun 2025 15:42:45 +0000</pubDate>
      <link>https://dev.to/stefor07/how-to-append-read-only-binary-data-to-an-executable-and-validate-it-via-digital-signature-487e</link>
      <guid>https://dev.to/stefor07/how-to-append-read-only-binary-data-to-an-executable-and-validate-it-via-digital-signature-487e</guid>
      <description>&lt;p&gt;In this article, we'll walk through a method to &lt;strong&gt;append arbitrary binary data&lt;/strong&gt; to a .exe file and protect it with a digital signature, ensuring that any tampering with the file (including the appended data) invalidates the signature.&lt;/p&gt;

&lt;p&gt;This technique is an enhancement of the &lt;strong&gt;fourth method&lt;/strong&gt; detailed in our previous article:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;a href="https://dev.to/stefor07/how-to-embed-binary-data-into-a-win32-executable-file-in-4-methods-43kp"&gt;Previous Article: How to Embed Binary Data into a Win32 Executable File in 4 Methods &lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;We’ll also implement a &lt;strong&gt;runtime integrity check&lt;/strong&gt; within the application to verify that the executable hasn't been altered after signing.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;⚠️ This guide is more effective in the fourth method explained in the last article, useful to better protect the data appended at the end of the executables&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h2&gt;
  
  
  Step 1: Creating Authenticode Signature Certificate
&lt;/h2&gt;

&lt;p&gt;Open &lt;strong&gt;PowerShell for Visual Studio Developer Command Prompt&lt;/strong&gt; and run the following command to create a self-signed certificate for local testing:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight powershell"&gt;&lt;code&gt;&lt;span class="nv"&gt;$cert&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;New-SelfSignedCertificate&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-DnsName&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"certName"&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-CertStoreLocation&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"cert:\CurrentUser\My"&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-Type&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;CodeSigning&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-KeyUsageProperty&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;Sign&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-KeyUsage&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;CertSign&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-KeySpec&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;Signature&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-KeyExportPolicy&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;Exportable&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This command will create a certificate in your user area, valid only for local testing&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;💡 Replace &lt;code&gt;certName&lt;/code&gt; with a name of your choice to easily identify the certificate.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h3&gt;
  
  
  Exporting the &lt;code&gt;.pfx&lt;/code&gt; certificate (Recommended)
&lt;/h3&gt;

&lt;p&gt;Now declare a password to export the certificate securely:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight powershell"&gt;&lt;code&gt;&lt;span class="nv"&gt;$password&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;ConvertTo-SecureString&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"yourPW"&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-AsPlainText&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-Force&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;blockquote&gt;
&lt;p&gt;🔒 Replace &lt;code&gt;yourPW&lt;/code&gt; with your actual password.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Retrieve the existing certificate from the CurrentUser store based on its Common Name (CN)&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight powershell"&gt;&lt;code&gt;&lt;span class="nv"&gt;$cert&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Get-ChildItem&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-Path&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;Cert:\CurrentUser\My&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Where-Object&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="bp"&gt;$_&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;Subject&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;-like&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"*CN=certName*"&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Export the certificate to a &lt;code&gt;.pfx&lt;/code&gt; file:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight powershell"&gt;&lt;code&gt;&lt;span class="n"&gt;Export-PfxCertificate&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-Cert&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;$cert&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;PSPath&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-FilePath&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"C:\Path\of\Your\Cert.pfx"&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-Password&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;$password&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;blockquote&gt;
&lt;p&gt;ℹ️ &lt;strong&gt;Notify:&lt;/strong&gt; Exporting the &lt;code&gt;.pfx&lt;/code&gt; certificate is not absolutely mandatory, but it is a safe way to always have a backup copy since it contains the private key to sign the executables.&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h2&gt;
  
  
  Step 2: Retrieve Certificate Thumbprint
&lt;/h2&gt;

&lt;p&gt;To get the thumbprint of your certificate, run:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight powershell"&gt;&lt;code&gt;&lt;span class="n"&gt;Get-ChildItem&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-Path&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;Cert:\CurrentUser\My&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Format-List&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;Subject&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;Thumbprint&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Example output:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight powershell"&gt;&lt;code&gt;&lt;span class="n"&gt;Subject&lt;/span&gt;&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;CN&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;certName&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="nx"&gt;Thumbprint&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;A1B2C3D4E5F67890ABCDEF1234567890ABCDEF12&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Copy the &lt;strong&gt;Thumbprint&lt;/strong&gt;, as you’ll use it later in your C++ code for validation.&lt;/p&gt;




&lt;h2&gt;
  
  
  Step 3: Implement Runtime Signature Verification in Visual C++
&lt;/h2&gt;

&lt;p&gt;Now in our application code we should import two libraries in the source file that handles the startup and declare a helper functions that will allow us to get the signature thumbprint&lt;/p&gt;

&lt;p&gt;Add the following to your main application source file:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Standard Win32 APIs Version:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight cpp"&gt;&lt;code&gt;&lt;span class="cp"&gt;#include&lt;/span&gt; &lt;span class="cpf"&gt;"windows.h"&lt;/span&gt;&lt;span class="cp"&gt;
#include&lt;/span&gt; &lt;span class="cpf"&gt;&amp;lt;wintrust.h&amp;gt;&lt;/span&gt;&lt;span class="cp"&gt;
#include&lt;/span&gt; &lt;span class="cpf"&gt;&amp;lt;softpub.h&amp;gt;&lt;/span&gt;&lt;span class="cp"&gt;
&lt;/span&gt;
&lt;span class="c1"&gt;// Link the necessary libraries&lt;/span&gt;
&lt;span class="cp"&gt;#pragma comment(lib, "crypt32.lib")
#pragma comment(lib, "wintrust.lib")
&lt;/span&gt;
&lt;span class="kt"&gt;bool&lt;/span&gt; &lt;span class="nf"&gt;VerifyAuthenticodeSHA1Signature&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;LPCWSTR&lt;/span&gt; &lt;span class="n"&gt;filePath&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="n"&gt;WINTRUST_FILE_INFO&lt;/span&gt; &lt;span class="n"&gt;fileInfo&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{};&lt;/span&gt;
    &lt;span class="n"&gt;fileInfo&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;cbStruct&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;sizeof&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;WINTRUST_FILE_INFO&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="n"&gt;fileInfo&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;pcwszFilePath&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;filePath&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

    &lt;span class="n"&gt;GUID&lt;/span&gt; &lt;span class="n"&gt;policyGUID&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;WINTRUST_ACTION_GENERIC_VERIFY_V2&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

    &lt;span class="n"&gt;WINTRUST_DATA&lt;/span&gt; &lt;span class="n"&gt;winTrustData&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{};&lt;/span&gt;
    &lt;span class="n"&gt;winTrustData&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;cbStruct&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;sizeof&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;WINTRUST_DATA&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="n"&gt;winTrustData&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;dwUIChoice&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;WTD_UI_NONE&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="n"&gt;winTrustData&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;fdwRevocationChecks&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;WTD_REVOKE_NONE&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="n"&gt;winTrustData&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;dwUnionChoice&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;WTD_CHOICE_FILE&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="n"&gt;winTrustData&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;pFile&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="n"&gt;fileInfo&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="n"&gt;winTrustData&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;dwStateAction&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;WTD_STATEACTION_IGNORE&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="n"&gt;winTrustData&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;dwProvFlags&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;WTD_REVOCATION_CHECK_NONE&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="n"&gt;winTrustData&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;dwUIContext&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

    &lt;span class="n"&gt;LONG&lt;/span&gt; &lt;span class="n"&gt;status&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;WinVerifyTrust&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;NULL&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="n"&gt;policyGUID&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="n"&gt;winTrustData&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;status&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="n"&gt;ERROR_SUCCESS&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nb"&gt;true&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;status&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="n"&gt;TRUST_E_BAD_DIGEST&lt;/span&gt; &lt;span class="o"&gt;||&lt;/span&gt; &lt;span class="n"&gt;status&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="n"&gt;TRUST_E_PROVIDER_UNKNOWN&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nb"&gt;false&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;status&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="n"&gt;CERT_E_UNTRUSTEDROOT&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nb"&gt;true&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nb"&gt;false&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="kt"&gt;bool&lt;/span&gt; &lt;span class="nf"&gt;VerifySignatureThumbprint&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;LPCWSTR&lt;/span&gt; &lt;span class="n"&gt;filePath&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="k"&gt;const&lt;/span&gt; &lt;span class="n"&gt;LPCWSTR&lt;/span&gt;&lt;span class="o"&gt;&amp;amp;&lt;/span&gt; &lt;span class="n"&gt;expectedThumbprint&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="n"&gt;DWORD&lt;/span&gt; &lt;span class="n"&gt;contentType&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="n"&gt;DWORD&lt;/span&gt; &lt;span class="n"&gt;formatType&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="n"&gt;HCERTSTORE&lt;/span&gt; &lt;span class="n"&gt;hStore&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;NULL&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="n"&gt;HCRYPTMSG&lt;/span&gt; &lt;span class="n"&gt;hMsg&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;NULL&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

    &lt;span class="n"&gt;BOOL&lt;/span&gt; &lt;span class="n"&gt;res&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;CryptQueryObject&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
        &lt;span class="n"&gt;CERT_QUERY_OBJECT_FILE&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="n"&gt;filePath&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="n"&gt;CERT_QUERY_CONTENT_FLAG_PKCS7_SIGNED_EMBED&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="n"&gt;CERT_QUERY_FORMAT_FLAG_BINARY&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="nb"&gt;nullptr&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="n"&gt;contentType&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="n"&gt;formatType&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="n"&gt;hStore&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="n"&gt;hMsg&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="nb"&gt;nullptr&lt;/span&gt;
    &lt;span class="p"&gt;);&lt;/span&gt;

    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;!&lt;/span&gt;&lt;span class="n"&gt;res&lt;/span&gt; &lt;span class="o"&gt;||&lt;/span&gt; &lt;span class="o"&gt;!&lt;/span&gt;&lt;span class="n"&gt;hStore&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;hStore&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="n"&gt;CertCloseStore&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;hStore&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
        &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;hMsg&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="n"&gt;CryptMsgClose&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;hMsg&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nb"&gt;false&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;

    &lt;span class="n"&gt;PCCERT_CONTEXT&lt;/span&gt; &lt;span class="n"&gt;pCert&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;CertEnumCertificatesInStore&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;hStore&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nb"&gt;nullptr&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;!&lt;/span&gt;&lt;span class="n"&gt;pCert&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="n"&gt;CertCloseStore&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;hStore&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
        &lt;span class="n"&gt;CryptMsgClose&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;hMsg&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nb"&gt;false&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;

    &lt;span class="n"&gt;BYTE&lt;/span&gt; &lt;span class="n"&gt;hash&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;20&lt;/span&gt;&lt;span class="p"&gt;];&lt;/span&gt; &lt;span class="c1"&gt;// SHA1 produces 20-byte hash&lt;/span&gt;
    &lt;span class="n"&gt;DWORD&lt;/span&gt; &lt;span class="n"&gt;hashSize&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;sizeof&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;hash&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;!&lt;/span&gt;&lt;span class="n"&gt;CryptHashCertificate&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
        &lt;span class="nb"&gt;NULL&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="n"&gt;CALG_SHA1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="n"&gt;pCert&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="n"&gt;pbCertEncoded&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="n"&gt;pCert&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="n"&gt;cbCertEncoded&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="n"&gt;hash&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="n"&gt;hashSize&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="n"&gt;CertFreeCertificateContext&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;pCert&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
        &lt;span class="n"&gt;CertCloseStore&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;hStore&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
        &lt;span class="n"&gt;CryptMsgClose&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;hMsg&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nb"&gt;false&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;

    &lt;span class="c1"&gt;// Convert hash to hex string (ANSI)&lt;/span&gt;
    &lt;span class="n"&gt;LPCWSTR&lt;/span&gt; &lt;span class="n"&gt;computedThumbprint&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;DWORD&lt;/span&gt; &lt;span class="n"&gt;i&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="n"&gt;i&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt; &lt;span class="n"&gt;hashSize&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="o"&gt;++&lt;/span&gt;&lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="kt"&gt;char&lt;/span&gt; &lt;span class="n"&gt;szHex&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="p"&gt;];&lt;/span&gt;
        &lt;span class="n"&gt;sprintf_s&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;szHex&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;"%02X"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;hash&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="p"&gt;]);&lt;/span&gt;
        &lt;span class="n"&gt;computedThumbprint&lt;/span&gt; &lt;span class="o"&gt;+=&lt;/span&gt; &lt;span class="n"&gt;szHex&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;

    &lt;span class="n"&gt;CertFreeCertificateContext&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;pCert&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="n"&gt;CertCloseStore&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;hStore&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="n"&gt;CryptMsgClose&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;hMsg&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;computedThumbprint&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;compare&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;expectedThumbprint&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;If you are currently using the MFC Framework, this is the same function adapted&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;MFC Version:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight cpp"&gt;&lt;code&gt;&lt;span class="cp"&gt;#include&lt;/span&gt; &lt;span class="cpf"&gt;"afxwin.h"&lt;/span&gt;&lt;span class="cp"&gt;
#include&lt;/span&gt; &lt;span class="cpf"&gt;&amp;lt;wintrust.h&amp;gt;&lt;/span&gt;&lt;span class="cp"&gt;
#include&lt;/span&gt; &lt;span class="cpf"&gt;&amp;lt;softpub.h&amp;gt;&lt;/span&gt;&lt;span class="cp"&gt;
&lt;/span&gt;
&lt;span class="c1"&gt;// Link the necessary libraries&lt;/span&gt;
&lt;span class="cp"&gt;#pragma comment(lib, "crypt32.lib")
#pragma comment(lib, "wintrust.lib")
&lt;/span&gt;
&lt;span class="kt"&gt;bool&lt;/span&gt; &lt;span class="nf"&gt;VerifyAuthenticodeSHA1Signature&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;const&lt;/span&gt; &lt;span class="n"&gt;CStringW&lt;/span&gt;&lt;span class="o"&gt;&amp;amp;&lt;/span&gt; &lt;span class="n"&gt;filePath&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="n"&gt;WINTRUST_FILE_INFO&lt;/span&gt; &lt;span class="n"&gt;fileInfo&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{};&lt;/span&gt;
    &lt;span class="n"&gt;fileInfo&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;cbStruct&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;sizeof&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;WINTRUST_FILE_INFO&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="n"&gt;fileInfo&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;pcwszFilePath&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;filePath&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

    &lt;span class="n"&gt;GUID&lt;/span&gt; &lt;span class="n"&gt;policyGUID&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;WINTRUST_ACTION_GENERIC_VERIFY_V2&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

    &lt;span class="n"&gt;WINTRUST_DATA&lt;/span&gt; &lt;span class="n"&gt;winTrustData&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{};&lt;/span&gt;
    &lt;span class="n"&gt;winTrustData&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;cbStruct&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;sizeof&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;WINTRUST_DATA&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="n"&gt;winTrustData&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;dwUIChoice&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;WTD_UI_NONE&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="n"&gt;winTrustData&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;fdwRevocationChecks&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;WTD_REVOKE_NONE&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="n"&gt;winTrustData&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;dwUnionChoice&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;WTD_CHOICE_FILE&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="n"&gt;winTrustData&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;pFile&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="n"&gt;fileInfo&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="n"&gt;winTrustData&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;dwStateAction&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;WTD_STATEACTION_IGNORE&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="n"&gt;winTrustData&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;dwProvFlags&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;WTD_REVOCATION_CHECK_NONE&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="n"&gt;winTrustData&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;dwUIContext&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

    &lt;span class="n"&gt;LONG&lt;/span&gt; &lt;span class="n"&gt;status&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;WinVerifyTrust&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;NULL&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="n"&gt;policyGUID&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="n"&gt;winTrustData&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;status&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="n"&gt;ERROR_SUCCESS&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nb"&gt;true&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;status&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="n"&gt;TRUST_E_BAD_DIGEST&lt;/span&gt; &lt;span class="o"&gt;||&lt;/span&gt; &lt;span class="n"&gt;status&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="n"&gt;TRUST_E_PROVIDER_UNKNOWN&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nb"&gt;false&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;status&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="n"&gt;CERT_E_UNTRUSTEDROOT&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nb"&gt;true&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nb"&gt;false&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="kt"&gt;bool&lt;/span&gt; &lt;span class="nf"&gt;VerifySignatureThumbprint&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;CStringW&lt;/span&gt; &lt;span class="n"&gt;filePath&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="k"&gt;const&lt;/span&gt; &lt;span class="n"&gt;CStringW&lt;/span&gt;&lt;span class="o"&gt;&amp;amp;&lt;/span&gt; &lt;span class="n"&gt;expectedThumbprint&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="n"&gt;DWORD&lt;/span&gt; &lt;span class="n"&gt;contentType&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="n"&gt;DWORD&lt;/span&gt; &lt;span class="n"&gt;formatType&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="n"&gt;HCERTSTORE&lt;/span&gt; &lt;span class="n"&gt;hStore&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;NULL&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="n"&gt;HCRYPTMSG&lt;/span&gt; &lt;span class="n"&gt;hMsg&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;NULL&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

    &lt;span class="n"&gt;BOOL&lt;/span&gt; &lt;span class="n"&gt;res&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;CryptQueryObject&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
        &lt;span class="n"&gt;CERT_QUERY_OBJECT_FILE&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="n"&gt;filePath&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;GetString&lt;/span&gt;&lt;span class="p"&gt;(),&lt;/span&gt;
        &lt;span class="n"&gt;CERT_QUERY_CONTENT_FLAG_PKCS7_SIGNED_EMBED&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="n"&gt;CERT_QUERY_FORMAT_FLAG_BINARY&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="nb"&gt;NULL&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="n"&gt;contentType&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="n"&gt;formatType&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="n"&gt;hStore&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="n"&gt;hMsg&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="nb"&gt;NULL&lt;/span&gt;
    &lt;span class="p"&gt;);&lt;/span&gt;

    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;!&lt;/span&gt;&lt;span class="n"&gt;res&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nb"&gt;false&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;

    &lt;span class="n"&gt;PCCERT_CONTEXT&lt;/span&gt; &lt;span class="n"&gt;pCert&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;CertEnumCertificatesInStore&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;hStore&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nb"&gt;NULL&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;!&lt;/span&gt;&lt;span class="n"&gt;pCert&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="n"&gt;CertCloseStore&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;hStore&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
        &lt;span class="n"&gt;CryptMsgClose&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;hMsg&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nb"&gt;false&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;

    &lt;span class="n"&gt;BYTE&lt;/span&gt; &lt;span class="n"&gt;hash&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;20&lt;/span&gt;&lt;span class="p"&gt;];&lt;/span&gt;
    &lt;span class="n"&gt;DWORD&lt;/span&gt; &lt;span class="n"&gt;hashSize&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;sizeof&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;hash&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;!&lt;/span&gt;&lt;span class="n"&gt;CryptHashCertificate&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
        &lt;span class="nb"&gt;NULL&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="n"&gt;CALG_SHA1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="n"&gt;pCert&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="n"&gt;pbCertEncoded&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="n"&gt;pCert&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="n"&gt;cbCertEncoded&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="n"&gt;hash&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="n"&gt;hashSize&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="n"&gt;CertFreeCertificateContext&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;pCert&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
        &lt;span class="n"&gt;CertCloseStore&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;hStore&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
        &lt;span class="n"&gt;CryptMsgClose&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;hMsg&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nb"&gt;false&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;

    &lt;span class="n"&gt;CStringW&lt;/span&gt; &lt;span class="n"&gt;computedThumbprint&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;DWORD&lt;/span&gt; &lt;span class="n"&gt;i&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="n"&gt;i&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt; &lt;span class="n"&gt;hashSize&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="o"&gt;++&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="n"&gt;CString&lt;/span&gt; &lt;span class="n"&gt;hexByte&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
        &lt;span class="n"&gt;hexByte&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Format&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;_T&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"%02X"&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="n"&gt;hash&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="p"&gt;]);&lt;/span&gt;
        &lt;span class="n"&gt;computedThumbprint&lt;/span&gt; &lt;span class="o"&gt;+=&lt;/span&gt; &lt;span class="n"&gt;hexByte&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;

    &lt;span class="n"&gt;CertFreeCertificateContext&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;pCert&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="n"&gt;CertCloseStore&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;hStore&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="n"&gt;CryptMsgClose&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;hMsg&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;computedThumbprint&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;CompareNoCase&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;expectedThumbprint&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Now, in the body of your application's entry point, add this to check if at least one condition is false&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;main.cpp&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight cpp"&gt;&lt;code&gt;&lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;WINAPI&lt;/span&gt; &lt;span class="nf"&gt;WinMain&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;HINSTANCE&lt;/span&gt; &lt;span class="n"&gt;hInst&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;HINSTANCE&lt;/span&gt; &lt;span class="n"&gt;hInstPrev&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;LPSTR&lt;/span&gt; &lt;span class="n"&gt;cmdline&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;cmdshow&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
   &lt;span class="kt"&gt;wchar_t&lt;/span&gt; &lt;span class="n"&gt;wExePath&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;MAX_PATH&lt;/span&gt;&lt;span class="p"&gt;];&lt;/span&gt;

   &lt;span class="n"&gt;GetModuleFileNameW&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;NULL&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;wExePath&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;MAX_PATH&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

   &lt;span class="c1"&gt;// Now using the helper functions we check if the signature has been invalidated&lt;/span&gt;

   &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;!&lt;/span&gt;&lt;span class="n"&gt;VerifySignatureThumbprint&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;wExePath&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;L"A1B2C3D4E5F67890ABCDEF1234567890ABCDEF12"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;||&lt;/span&gt; &lt;span class="o"&gt;!&lt;/span&gt;&lt;span class="n"&gt;VerifyAuthenticodeSHA1Signature&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;wExePath&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
   &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="c1"&gt;// Invalidated signature, show error message and prevent execution for security&lt;/span&gt;
      &lt;span class="n"&gt;MessageBoxA&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;"Unable to verify application integrity, click OK to terminate the application now"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;"Error"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;MB_ICONERROR&lt;/span&gt; &lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="n"&gt;MB_OK&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
      &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
   &lt;span class="p"&gt;}&lt;/span&gt;

   &lt;span class="c1"&gt;// The rest of your code here...&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;⚠️ Replace &lt;code&gt;A1B2C3D4E5F67890ABCDEF1234567890ABCDEF12&lt;/code&gt; with the Thumbprint founded previously&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;At this point, we have implemented a runtime integrity check in our application. If even a single byte is tampered with, the application will refuse to run.&lt;/p&gt;




&lt;h2&gt;
  
  
  Step 4: Append Binary Data to the Executable
&lt;/h2&gt;

&lt;p&gt;Open &lt;strong&gt;Command Prompt (not PowerShell)&lt;/strong&gt; in your build folder and run:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight powershell"&gt;&lt;code&gt;&lt;span class="n"&gt;copy&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;/b&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;original.exe&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;+&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;file.bin&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;final.exe&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;original.exe&lt;/code&gt;: your compiled executable&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;file.bin&lt;/code&gt;: binary data to append&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;final.exe&lt;/code&gt;: final executable with appended data&lt;/li&gt;
&lt;/ul&gt;

&lt;blockquote&gt;
&lt;p&gt;✅ The added data does not interfere with the PE format, and execution is unaffected.&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h2&gt;
  
  
  Step 5: Sign the Final Executable
&lt;/h2&gt;

&lt;p&gt;Once ready, run the following command from &lt;strong&gt;Powershell Developer for VS&lt;/strong&gt; and sign the &lt;code&gt;final.exe&lt;/code&gt; using the certificate:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight powershell"&gt;&lt;code&gt;&lt;span class="n"&gt;signtool&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;sign&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;/n&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;certName&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;/fd&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;SHA1&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;\final.exe&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;blockquote&gt;
&lt;p&gt;ℹ️ &lt;code&gt;certName&lt;/code&gt; should match the name used when generating the certificate.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h3&gt;
  
  
  ⚠️ Note on signtool:
&lt;/h3&gt;

&lt;blockquote&gt;
&lt;p&gt;The &lt;code&gt;signtool&lt;/code&gt; utility is part of the &lt;strong&gt;Windows SDK&lt;/strong&gt; and is not available by default in standard PowerShell or CMD. To use it:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Open a &lt;strong&gt;Developer Command Prompt for Visual Studio&lt;/strong&gt; (like &lt;em&gt;x64 Native Tools Command Prompt&lt;/em&gt;)&lt;/li&gt;
&lt;li&gt;Or manually add the path to &lt;code&gt;signtool.exe&lt;/code&gt; in your system's &lt;code&gt;PATH&lt;/code&gt; environment variable&lt;/li&gt;
&lt;/ul&gt;
&lt;/blockquote&gt;

&lt;p&gt;Now, if any part of the file is modified—including the appended data—the signature becomes invalid, and the application will reject execution.&lt;/p&gt;




&lt;h2&gt;
  
  
  Optional: Automate via Visual Studio Post-Build Events
&lt;/h2&gt;

&lt;p&gt;Save time by automating the append and signing steps after each build.&lt;/p&gt;

&lt;h3&gt;
  
  
  Steps:
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;1.&lt;/strong&gt; In Visual Studio, go to Project &amp;gt; Properties&lt;br&gt;
&lt;strong&gt;2.&lt;/strong&gt; Navigate to &lt;strong&gt;Build Events &amp;gt; Post-Build Event&lt;/strong&gt;&lt;br&gt;
&lt;strong&gt;3.&lt;/strong&gt; Add the following to the &lt;strong&gt;Command Line&lt;/strong&gt; field:&lt;/p&gt;

&lt;p&gt;Add these two command lines:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight powershell"&gt;&lt;code&gt;&lt;span class="n"&gt;copy&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;/b&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;/y&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="si"&gt;$(&lt;/span&gt;&lt;span class="n"&gt;TargetPath&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;+&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="si"&gt;$(&lt;/span&gt;&lt;span class="n"&gt;TargetDir&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="s2"&gt;file.bin"&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="si"&gt;$(&lt;/span&gt;&lt;span class="n"&gt;TargetDir&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="s2"&gt;final.exe"&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="n"&gt;signtool&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;sign&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;/n&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;certName&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;/fd&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;SHA1&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="si"&gt;$(&lt;/span&gt;&lt;span class="n"&gt;TargetDir&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="s2"&gt;final.exe"&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fwtfer89jpk9991kbznsc.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fwtfer89jpk9991kbznsc.png" alt="Visual Studio Project Properties" width="796" height="559"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Then after you will have to insert in the compilation folder, whether &lt;strong&gt;Debug&lt;/strong&gt; or &lt;strong&gt;Release&lt;/strong&gt;, the binary file that we will have to concatenate to the end of the executable&lt;/p&gt;

&lt;p&gt;Click &lt;strong&gt;Apply&lt;/strong&gt; and &lt;strong&gt;OK&lt;/strong&gt; to apply the changes&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Each time you compile, the binary data will be automatically appended and the resulting executable signed.&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h2&gt;
  
  
  🔐 Security Note: The Role of the &lt;code&gt;.pfx&lt;/code&gt; File
&lt;/h2&gt;

&lt;p&gt;Even though it’s possible to export the &lt;strong&gt;public part&lt;/strong&gt; of a certificate (as a &lt;code&gt;.cer&lt;/code&gt; file), this is &lt;strong&gt;not sufficient to re-sign the executable.&lt;/strong&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;✅ &lt;strong&gt;The &lt;code&gt;.pfx&lt;/code&gt; file contains the private key&lt;/strong&gt;, which is &lt;strong&gt;mandatory&lt;/strong&gt; to sign executables.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Without the &lt;code&gt;.pfx&lt;/code&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;You cannot apply a valid signature, even if you have the &lt;code&gt;.cer&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;An attacker &lt;strong&gt;cannot re-sign&lt;/strong&gt; a tampered executable unless they have access to the original &lt;code&gt;.pfx&lt;/code&gt;.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This guarantees that the appended data, once signed, is &lt;strong&gt;secure against external modifications.&lt;/strong&gt; If someone tries to alter the executable—even with the correct &lt;code&gt;.cer&lt;/code&gt;—they won’t be able to restore a valid signature.&lt;/p&gt;

&lt;p&gt;And even if someone manages to obtain the &lt;code&gt;.pfx&lt;/code&gt; file, they would still need to know the associated password in order to import and use it—making the certificate even more secure.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;🧷 For production, the &lt;code&gt;.pfx&lt;/code&gt; should be securely stored and access to it strictly limited.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h3&gt;
  
  
  ⚠️ About .CER Exports
&lt;/h3&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;⚠️ Important Note:&lt;/strong&gt; If you export a &lt;code&gt;.CER&lt;/code&gt; file from a signed .exe using Windows UI, it contains &lt;strong&gt;only the public certificate.&lt;/strong&gt;&lt;br&gt;
It &lt;strong&gt;cannot&lt;/strong&gt; be used to re-sign files, export a &lt;code&gt;.pfx&lt;/code&gt;, or recover the private key.&lt;br&gt;
Signing requires access to the &lt;strong&gt;original&lt;/strong&gt; &lt;code&gt;.pfx&lt;/code&gt; file created with the private key.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  Summary Table
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Format&lt;/th&gt;
&lt;th&gt;Contains Private Key?&lt;/th&gt;
&lt;th&gt;Can Be Used to Sign?&lt;/th&gt;
&lt;th&gt;Exportable from &lt;code&gt;.exe&lt;/code&gt;?&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;.cer&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;❌ No&lt;/td&gt;
&lt;td&gt;❌ No&lt;/td&gt;
&lt;td&gt;✅ Yes&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;.pfx&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;✅ Yes&lt;/td&gt;
&lt;td&gt;✅ Yes&lt;/td&gt;
&lt;td&gt;❌ No&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;




&lt;h2&gt;
  
  
  Final Notes
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;This method ensures &lt;strong&gt;data appended to an executable is tamper-proof&lt;/strong&gt; via Authenticode.

&lt;ul&gt;
&lt;li&gt;The application checks its own integrity &lt;strong&gt;at runtime&lt;/strong&gt;, stopping execution if the signature is invalid.&lt;/li&gt;
&lt;li&gt;Ideal for embedding secure files or configuration data that must not be altered after distribution.&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;/ul&gt;




&lt;h2&gt;
  
  
  Conclusion
&lt;/h2&gt;

&lt;p&gt;In this article, we demonstrated how to &lt;strong&gt;append binary data, such as ZIP archives, to a Windows executable&lt;/strong&gt; and protect it using an Authenticode digital signature. This method ensures that any modification to the file—whether to the executable code or the appended data—invalidates the digital signature, allowing the application to detect tampering at runtime.&lt;/p&gt;

&lt;p&gt;A key point concerns attached ZIP files: &lt;strong&gt;before signing, tools like 7-Zip can freely read and modify the embedded ZIP archive.&lt;/strong&gt; However, once the executable is signed, &lt;strong&gt;any modification to the file, including the attached ZIP, will invalidate the signature and prevent 7-Zip or similar tools from accessing or modifying the archive.&lt;/strong&gt; (Once the executable is signed, 7-Zip will not be able to let us modify the attached ZIP)&lt;/p&gt;

&lt;p&gt;The only way to modify the appended ZIP is to manually extract the executable and the appended ZIP separately, make changes, and then recombine them manually (for example, using &lt;code&gt;copy /b&lt;/code&gt;). But this process breaks the signature and causes the application’s integrity check to fail, rendering it unusable.&lt;/p&gt;

&lt;p&gt;This protection guarantees that the data appended to the executable remains &lt;strong&gt;intact and secure&lt;/strong&gt;, providing an effective barrier against unauthorized tampering.&lt;/p&gt;

&lt;p&gt;To maintain this security, it’s critical to carefully store the &lt;code&gt;.pfx&lt;/code&gt; file containing the private key used for signing, restricting its access strictly.&lt;/p&gt;

</description>
      <category>pfx</category>
      <category>programming</category>
      <category>cpp</category>
    </item>
    <item>
      <title>How to develop a basic MFC Application in Visual C++ using a Dialog Box</title>
      <dc:creator>Stefor07</dc:creator>
      <pubDate>Fri, 16 May 2025 19:44:27 +0000</pubDate>
      <link>https://dev.to/stefor07/how-to-develop-a-basic-win32-application-in-visual-c-using-a-dialog-box-3mp1</link>
      <guid>https://dev.to/stefor07/how-to-develop-a-basic-win32-application-in-visual-c-using-a-dialog-box-3mp1</guid>
      <description>&lt;p&gt;This guide walks you through creating a basic MFC desktop application using Visual C++, starting from scratch and using a dialog box as the main interface.&lt;/p&gt;




&lt;h2&gt;
  
  
  📦 Step 1: Create a New Project in Visual Studio
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Open Visual Studio&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;Go to &lt;strong&gt;File &amp;gt; New &amp;gt; Project...&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;In the template list, select &lt;strong&gt;Windows Desktop Wizard&lt;/strong&gt;.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fwbdwdy9cy4rcl7kbk3wg.PNG" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fwbdwdy9cy4rcl7kbk3wg.PNG" alt="Select Project Type" width="460" height="60"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Name the project and click &lt;strong&gt;OK&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;In the next screen:

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Application type&lt;/strong&gt;: select &lt;strong&gt;Desktop application&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;Check &lt;strong&gt;Empty Project&lt;/strong&gt; to start from scratch.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fhl7nrqhwwprx9zuojlet.PNG" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fhl7nrqhwwprx9zuojlet.PNG" alt="Select Application Type" width="500" height="375"&gt;&lt;/a&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  ⚙️ Step 2: Enable MFC Support
&lt;/h2&gt;

&lt;p&gt;To use MFC (Microsoft Foundation Classes):&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Right-click the project in &lt;strong&gt;Solution Explorer&lt;/strong&gt; and select &lt;strong&gt;Properties&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;Navigate to:
&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;   Project Properties &amp;gt; Configuration Properties &amp;gt; General
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ol&gt;
&lt;li&gt;Set &lt;strong&gt;Use of MFC&lt;/strong&gt; to:

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Use MFC in a Static Library&lt;/strong&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Click &lt;strong&gt;Apply&lt;/strong&gt;, then &lt;strong&gt;OK&lt;/strong&gt;.&lt;/li&gt;
&lt;/ol&gt;




&lt;h2&gt;
  
  
  🧱 Step 3: Create the Main Application Class (&lt;code&gt;Main&lt;/code&gt;)
&lt;/h2&gt;

&lt;p&gt;This class represents the entry point for the application.&lt;/p&gt;

&lt;h3&gt;
  
  
  ➤ Add the Header File
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;Right-click on &lt;strong&gt;Header Files&lt;/strong&gt; &amp;gt; &lt;strong&gt;Add &amp;gt; New Item&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;Choose &lt;strong&gt;Header File (.h)&lt;/strong&gt; and name it &lt;code&gt;Main.h&lt;/code&gt;.
&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight cpp"&gt;&lt;code&gt;   &lt;span class="cp"&gt;#pragma once
&lt;/span&gt;   &lt;span class="cp"&gt;#include&lt;/span&gt; &lt;span class="cpf"&gt;"afxwin.h"&lt;/span&gt;&lt;span class="cp"&gt;
&lt;/span&gt;
   &lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;Main&lt;/span&gt; &lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="n"&gt;CWinApp&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
   &lt;span class="nl"&gt;public:&lt;/span&gt;
       &lt;span class="n"&gt;BOOL&lt;/span&gt; &lt;span class="n"&gt;InitInstance&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
   &lt;span class="p"&gt;};&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  ➤ Add the Source File
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;Right-click on &lt;strong&gt;Source Files&lt;/strong&gt; &amp;gt; &lt;strong&gt;Add &amp;gt; New Item&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;Select &lt;strong&gt;C++ File (.cpp)&lt;/strong&gt; and name it &lt;code&gt;Main.cpp&lt;/code&gt;.
&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight cpp"&gt;&lt;code&gt;   &lt;span class="cp"&gt;#include&lt;/span&gt; &lt;span class="cpf"&gt;"afxwin.h"&lt;/span&gt;&lt;span class="cp"&gt;
&lt;/span&gt;   &lt;span class="cp"&gt;#include&lt;/span&gt; &lt;span class="cpf"&gt;"Main.h"&lt;/span&gt;&lt;span class="cp"&gt;
&lt;/span&gt;   &lt;span class="cp"&gt;#include&lt;/span&gt; &lt;span class="cpf"&gt;"CMainDlg.h"&lt;/span&gt;&lt;span class="c1"&gt;  // To be created later&lt;/span&gt;&lt;span class="cp"&gt;
&lt;/span&gt;
   &lt;span class="n"&gt;Main&lt;/span&gt; &lt;span class="n"&gt;app&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

   &lt;span class="n"&gt;BOOL&lt;/span&gt; &lt;span class="n"&gt;Main&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;InitInstance&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
       &lt;span class="n"&gt;CMainDlg&lt;/span&gt; &lt;span class="n"&gt;dlg&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
       &lt;span class="n"&gt;m_pMainWnd&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="n"&gt;dlg&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
       &lt;span class="n"&gt;dlg&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;DoModal&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
       &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;TRUE&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
   &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  🧩 Step 4: Add a Dialog Box Resource
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;Right-click &lt;strong&gt;Resource Files&lt;/strong&gt; &amp;gt; &lt;strong&gt;Add &amp;gt; Resource&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;Select &lt;strong&gt;Dialog&lt;/strong&gt; and click &lt;strong&gt;New&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;A dialog template named &lt;code&gt;IDD_DIALOG1&lt;/code&gt; will appear in the editor.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;You can customize the dialog using the toolbox, adding buttons, labels, etc.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fqaqdtqddhq0yaua8vabs.PNG" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fqaqdtqddhq0yaua8vabs.PNG" alt="add dialog" width="422" height="296"&gt;&lt;/a&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  🧾 Step 5: Create the Dialog Class
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;Right-click on the dialog template and select &lt;strong&gt;Add Class...&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;Name the class &lt;code&gt;CMainDlg&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;This will generate two files:

&lt;ul&gt;
&lt;li&gt;&lt;code&gt;CMainDlg.h&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;CMainDlg.cpp&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ft4fj7u3nvwjv3tcr5vez.PNG" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ft4fj7u3nvwjv3tcr5vez.PNG" alt="dialogbox class wizard" width="600" height="450"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  ➤ Edit &lt;code&gt;CMainDlg.h&lt;/code&gt;
&lt;/h3&gt;

&lt;p&gt;Make sure it includes the necessary header:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight cpp"&gt;&lt;code&gt;&lt;span class="cp"&gt;#pragma once
#include&lt;/span&gt; &lt;span class="cpf"&gt;"afxdialogex.h"&lt;/span&gt;&lt;span class="cp"&gt;
&lt;/span&gt;
&lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;CMainDlg&lt;/span&gt; &lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="n"&gt;CDialogEx&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;span class="nl"&gt;public:&lt;/span&gt;
    &lt;span class="n"&gt;CMainDlg&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;CWnd&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="n"&gt;pParent&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;nullptr&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt; &lt;span class="c1"&gt;// Constructor&lt;/span&gt;

&lt;span class="cp"&gt;#ifdef AFX_DESIGN_TIME
&lt;/span&gt;    &lt;span class="k"&gt;enum&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="n"&gt;IDD&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;IDD_DIALOG1&lt;/span&gt; &lt;span class="p"&gt;};&lt;/span&gt;
&lt;span class="cp"&gt;#endif
&lt;/span&gt;
&lt;span class="k"&gt;protected&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;
    &lt;span class="k"&gt;virtual&lt;/span&gt; &lt;span class="kt"&gt;void&lt;/span&gt; &lt;span class="nf"&gt;DoDataExchange&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;CDataExchange&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="n"&gt;pDX&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

    &lt;span class="n"&gt;DECLARE_MESSAGE_MAP&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="p"&gt;};&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  ➤ Edit &lt;code&gt;CMainDlg.cpp&lt;/code&gt;
&lt;/h3&gt;

&lt;p&gt;Ensure this file includes the resources header and links to the dialog ID:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight cpp"&gt;&lt;code&gt;&lt;span class="cp"&gt;#include&lt;/span&gt; &lt;span class="cpf"&gt;"resource.h"&lt;/span&gt;&lt;span class="cp"&gt;
#include&lt;/span&gt; &lt;span class="cpf"&gt;"CMainDlg.h"&lt;/span&gt;&lt;span class="cp"&gt;
&lt;/span&gt;
&lt;span class="n"&gt;IMPLEMENT_DYNAMIC&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;CMainDlg&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;CDialogEx&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="n"&gt;CMainDlg&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;CMainDlg&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;CWnd&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="n"&gt;pParent&lt;/span&gt; &lt;span class="cm"&gt;/*=nullptr*/&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="n"&gt;CDialogEx&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;IDD_DIALOG1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;pParent&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{}&lt;/span&gt;

&lt;span class="kt"&gt;void&lt;/span&gt; &lt;span class="n"&gt;CMainDlg&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;DoDataExchange&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;CDataExchange&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="n"&gt;pDX&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="n"&gt;CDialogEx&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;DoDataExchange&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;pDX&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="n"&gt;BEGIN_MESSAGE_MAP&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;CMainDlg&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;CDialogEx&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;END_MESSAGE_MAP&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  🎨 Step 6: (Optional) Enable Windows Visual Styles
&lt;/h2&gt;

&lt;p&gt;To make your application use modern Windows controls:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Right-click the project and select &lt;strong&gt;Add &amp;gt; New Item&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;Choose &lt;strong&gt;XML File&lt;/strong&gt;, name it &lt;code&gt;app.manifest&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Paste the following into the file:
&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight xml"&gt;&lt;code&gt;   &lt;span class="cp"&gt;&amp;lt;?xml version="1.0" encoding="UTF-8" standalone="yes"?&amp;gt;&lt;/span&gt;
   &lt;span class="nt"&gt;&amp;lt;assembly&lt;/span&gt; &lt;span class="na"&gt;xmlns=&lt;/span&gt;&lt;span class="s"&gt;"urn:schemas-microsoft-com:asm.v1"&lt;/span&gt; &lt;span class="na"&gt;manifestVersion=&lt;/span&gt;&lt;span class="s"&gt;"1.0"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
     &lt;span class="nt"&gt;&amp;lt;dependency&amp;gt;&lt;/span&gt;
       &lt;span class="nt"&gt;&amp;lt;dependentAssembly&amp;gt;&lt;/span&gt;
         &lt;span class="nt"&gt;&amp;lt;assemblyIdentity&lt;/span&gt; 
           &lt;span class="na"&gt;type=&lt;/span&gt;&lt;span class="s"&gt;"win32"&lt;/span&gt; 
           &lt;span class="na"&gt;name=&lt;/span&gt;&lt;span class="s"&gt;"Microsoft.Windows.Common-Controls"&lt;/span&gt; 
           &lt;span class="na"&gt;version=&lt;/span&gt;&lt;span class="s"&gt;"6.0.0.0"&lt;/span&gt; 
           &lt;span class="na"&gt;processorArchitecture=&lt;/span&gt;&lt;span class="s"&gt;"*"&lt;/span&gt; 
           &lt;span class="na"&gt;publicKeyToken=&lt;/span&gt;&lt;span class="s"&gt;"6595b64144ccf1df"&lt;/span&gt; 
           &lt;span class="na"&gt;language=&lt;/span&gt;&lt;span class="s"&gt;"*"&lt;/span&gt; &lt;span class="nt"&gt;/&amp;gt;&lt;/span&gt;
       &lt;span class="nt"&gt;&amp;lt;/dependentAssembly&amp;gt;&lt;/span&gt;
     &lt;span class="nt"&gt;&amp;lt;/dependency&amp;gt;&lt;/span&gt;
     &lt;span class="nt"&gt;&amp;lt;trustInfo&lt;/span&gt; &lt;span class="na"&gt;xmlns=&lt;/span&gt;&lt;span class="s"&gt;"urn:schemas-microsoft-com:asm.v3"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
       &lt;span class="nt"&gt;&amp;lt;security&amp;gt;&lt;/span&gt;
         &lt;span class="nt"&gt;&amp;lt;requestedPrivileges&amp;gt;&lt;/span&gt;
           &lt;span class="nt"&gt;&amp;lt;requestedExecutionLevel&lt;/span&gt; &lt;span class="na"&gt;level=&lt;/span&gt;&lt;span class="s"&gt;"asInvoker"&lt;/span&gt; &lt;span class="na"&gt;uiAccess=&lt;/span&gt;&lt;span class="s"&gt;"false"&lt;/span&gt;&lt;span class="nt"&gt;/&amp;gt;&lt;/span&gt;
         &lt;span class="nt"&gt;&amp;lt;/requestedPrivileges&amp;gt;&lt;/span&gt;
       &lt;span class="nt"&gt;&amp;lt;/security&amp;gt;&lt;/span&gt;
     &lt;span class="nt"&gt;&amp;lt;/trustInfo&amp;gt;&lt;/span&gt;
   &lt;span class="nt"&gt;&amp;lt;/assembly&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This enables high-DPI support and modern UI styles for controls like buttons.&lt;/p&gt;




&lt;h2&gt;
  
  
  ▶️ Step 7: Run the Application
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;Build the project (&lt;strong&gt;Ctrl + Shift + B&lt;/strong&gt;).&lt;/li&gt;
&lt;li&gt;Run the application with &lt;strong&gt;Ctrl + F5&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;The dialog box should appear as the main window.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fus6z1s0zshixz003ia2c.PNG" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fus6z1s0zshixz003ia2c.PNG" alt="dialog box opened" width="466" height="318"&gt;&lt;/a&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  ✅ What's Next?
&lt;/h2&gt;

&lt;p&gt;Now that you have a basic MFC app running with a dialog, you can:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Add buttons, text boxes, combo boxes, etc.&lt;/li&gt;
&lt;li&gt;Handle events like button clicks with &lt;code&gt;ON_BN_CLICKED&lt;/code&gt; macros.&lt;/li&gt;
&lt;li&gt;Store user input using &lt;code&gt;UpdateData(TRUE/FALSE)&lt;/code&gt;.&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  📺 Related Video
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://www.youtube.com/watch?v=hi01EIUnkaE" rel="noopener noreferrer"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Foxyjlutby2y9iu8gn1d8.jpg" alt="Win32 Dialog App Tutorial" width="480" height="360"&gt;&lt;/a&gt;&lt;/p&gt;




&lt;blockquote&gt;
&lt;p&gt;💬 Questions or improvements? Fork this guide or leave a comment in your repo!&lt;/p&gt;
&lt;/blockquote&gt;

</description>
    </item>
    <item>
      <title>VirtualBox Web Installer</title>
      <dc:creator>Stefor07</dc:creator>
      <pubDate>Fri, 09 May 2025 09:37:15 +0000</pubDate>
      <link>https://dev.to/stefor07/virtualbox-web-installer-5a2m</link>
      <guid>https://dev.to/stefor07/virtualbox-web-installer-5a2m</guid>
      <description>&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fs4zb8hrxi24yc3dwi8er.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fs4zb8hrxi24yc3dwi8er.png" alt=" " width="611" height="261"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Install VirtualBox the easy way — fully automated, zero hassle.&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
VirtualBox Web Installer is a lightweight and automated alternative installer for Oracle VirtualBox, designed for Windows users who want a quick and error-free setup with no manual steps.&lt;/p&gt;




&lt;h2&gt;
  
  
  🚀 What is VirtualBox Web Installer?
&lt;/h2&gt;

&lt;p&gt;VirtualBox Web Installer is a custom-made utility that automates the process of downloading and installing the latest version of Oracle VirtualBox.&lt;br&gt;&lt;br&gt;
It uses a &lt;strong&gt;passive user interface&lt;/strong&gt;, meaning you simply run the installer, and it takes care of the rest — no dialogs, no choices, no interruptions.&lt;/p&gt;




&lt;h2&gt;
  
  
  ✨ Key Features
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;✅ &lt;strong&gt;Fully Automated Installation&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
No manual steps, configuration dialogs, or clicks required — it just works.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;🎯 &lt;strong&gt;Clean and Minimal UI&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
Designed to be straightforward and error-resistant for all user levels.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;🧠 &lt;strong&gt;Smart Compatibility Checks&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
Automatically verifies system requirements and compatibility before proceeding.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;🔄 &lt;strong&gt;Auto-Update Support&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
Detects if a newer version of VirtualBox is available and updates it automatically.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;🔐 &lt;strong&gt;Secure&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
Downloads the official installer directly from ufficial VirtualBox servers, ensuring safety.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;💡 &lt;strong&gt;Windows Compatibility&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
Supported on &lt;strong&gt;Windows Server 2016 and later&lt;/strong&gt;, including Windows 10 and 11.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  📥 How to Install
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Download the installer&lt;/strong&gt; from the link below.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Run it as administrator&lt;/strong&gt; (right-click &amp;gt; "Run as administrator").&lt;/li&gt;
&lt;li&gt;It will automatically check your system, download the latest VirtualBox version, and install it.&lt;/li&gt;
&lt;li&gt;Once finished, VirtualBox will be ready to use.&lt;/li&gt;
&lt;/ol&gt;

&lt;blockquote&gt;
&lt;p&gt;🛠️ No user interaction required — just launch and let it do the work.&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h2&gt;
  
  
  📌 Changelog
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;✔️ Added update functionality&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
Automatically installs new versions of VirtualBox when available.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;🛑 Cancel confirmation prompt&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
A confirmation dialog now appears to prevent accidental cancellation during setup.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;🧩 MSI Extraction:&lt;/strong&gt; The MSI is correctly extracted by the official VirtualBox installer and its integrity is always verified&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;❌ Removed:&lt;/strong&gt; Removed personal FTP download to comply with Oracle redistribution policies.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;✔️ Improved message window:&lt;/strong&gt; The message window has been improved by adding an extra field at the bottom that specifies the precise information of a message and adding colors for the message type.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  ⬇️ Download
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Latest version: VirtualBox 7.2.6&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;👉 &lt;strong&gt;&lt;a href="https://sorecchione07.altervista.org/Downloads-URLS/VirtualBox/Online_Installer/VirtualBoxInstaller.exe" rel="noopener noreferrer"&gt;Download VirtualBox Web Installer&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;⚠️ Make sure to run the installer with administrator privileges for a successful installation.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;The installer now fetches VirtualBox exclusively from official Oracle servers. The software is not redistributed, but simply installed automatically, in compliance with the PUEL license.&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h2&gt;
  
  
  📬 Feedback and Support
&lt;/h2&gt;

&lt;p&gt;Have a suggestion, found a bug, or want to request a new feature? Leave a comment below.&lt;/p&gt;

&lt;p&gt;Don't hesitate to contact us or file a bug report.&lt;/p&gt;




&lt;p&gt;&lt;strong&gt;Thanks for choosing VirtualBox Web Installer!&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
Making VirtualBox installation easier, faster, and more reliable.&lt;/p&gt;




</description>
    </item>
    <item>
      <title>Visual C++ MFC Dialog Application Templates for Visual Studio</title>
      <dc:creator>Stefor07</dc:creator>
      <pubDate>Wed, 30 Apr 2025 19:14:59 +0000</pubDate>
      <link>https://dev.to/stefor07/visual-c-mfc-dialog-application-templates-for-visual-studio-1gl2</link>
      <guid>https://dev.to/stefor07/visual-c-mfc-dialog-application-templates-for-visual-studio-1gl2</guid>
      <description>&lt;p&gt;Visual C++ MFC Dialog Application Templates are simple ZIP archives that are a project template to start efficiently developing an application in MFC with a dialog window already pre-configured as the main window.&lt;/p&gt;

&lt;p&gt;The templates are available for Visual Studio versions &lt;strong&gt;2019&lt;/strong&gt; and &lt;strong&gt;2022&lt;/strong&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Template Installation
&lt;/h2&gt;

&lt;p&gt;Installing these templates is very simple, first of all you need to download one of the two ZIP files for the corresponding version of Visual Studio&lt;/p&gt;

&lt;h3&gt;
  
  
  Download Links:
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;&lt;a href="https://sorecchione07.altervista.org/Downloads-URLS/MFC/VS_MFC_Dialog_Application_Templates/VS2019/MFC_Dialog_Application_VS2019.zip" rel="noopener noreferrer"&gt;Download for Visual Studio 2019&lt;/a&gt;&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;a href="https://sorecchione07.altervista.org/Downloads-URLS/MFC/VS_MFC_Dialog_Application_Templates/VS2022/MFC_Dialog_Application_VS2022.zip" rel="noopener noreferrer"&gt;Download for Visual Studio 2022&lt;/a&gt;&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;After downloading it, you simply need to copy the ZIP file into the following directory:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;If you are using Visual Studio 2019:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;C:&lt;span class="se"&gt;\U&lt;/span&gt;sers&lt;span class="se"&gt;\&amp;lt;&lt;/span&gt;Username&amp;gt;&lt;span class="se"&gt;\D&lt;/span&gt;ocuments&lt;span class="se"&gt;\V&lt;/span&gt;isual Studio 2019&lt;span class="se"&gt;\T&lt;/span&gt;emplates&lt;span class="se"&gt;\P&lt;/span&gt;rojectTemplates&lt;span class="se"&gt;\V&lt;/span&gt;isual C++
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;If you are using Visual Studio 2022:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;C:&lt;span class="se"&gt;\U&lt;/span&gt;sers&lt;span class="se"&gt;\&amp;lt;&lt;/span&gt;Username&amp;gt;&lt;span class="se"&gt;\D&lt;/span&gt;ocuments&lt;span class="se"&gt;\V&lt;/span&gt;isual Studio 2022&lt;span class="se"&gt;\T&lt;/span&gt;emplates&lt;span class="se"&gt;\P&lt;/span&gt;rojectTemplates&lt;span class="se"&gt;\V&lt;/span&gt;isual C++
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;OK, now you can open Visual Studio and see if the new project template is shown &lt;strong&gt;(to see it you will have to search for it in the search bar)&lt;/strong&gt;&lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F2ehe6z82gtc5kv11oujs.PNG" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F2ehe6z82gtc5kv11oujs.PNG" alt="screenshot1" width="800" height="531"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  ⚠️ Troubleshooting – Can’t find the template ⚠️
&lt;/h3&gt;

&lt;p&gt;If the template doesn’t appear in the list, follow these steps:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;Open the &lt;strong&gt;Developer Command Prompt&lt;/strong&gt; for your version of Visual Studio (2019 or 2022).&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Run the following command to update Visual Studio’s configuration:&lt;br&gt;
&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;devenv /updateconfiguration
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ol&gt;
&lt;li&gt;Restart Visual Studio.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;After this step you should be able to find the project template when you reopen Visual Studio&lt;/p&gt;

&lt;h2&gt;
  
  
  Template Project Preview
&lt;/h2&gt;

&lt;p&gt;When creating a new project using the template, Visual Studio will load a source file for the main application dialog:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fyfqr4v7zomy6r25pmz47.PNG" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fyfqr4v7zomy6r25pmz47.PNG" alt="screenshot2" width="800" height="436"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;To design the dialog interface, open the resource named &lt;strong&gt;IDD_Main&lt;/strong&gt;:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fp2esya2rje6b1o145euf.PNG" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fp2esya2rje6b1o145euf.PNG" alt="screenshot3" width="800" height="436"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;From here you can add controls to create your own application&lt;/p&gt;

</description>
      <category>msvc</category>
      <category>mfc</category>
      <category>programming</category>
    </item>
    <item>
      <title>How to Force Enable 3D Acceleration in VMware Workstation/Fusion</title>
      <dc:creator>Stefor07</dc:creator>
      <pubDate>Sat, 19 Apr 2025 11:01:10 +0000</pubDate>
      <link>https://dev.to/stefor07/how-to-force-enable-3d-acceleration-in-vmware-workstationfusion-37db</link>
      <guid>https://dev.to/stefor07/how-to-force-enable-3d-acceleration-in-vmware-workstationfusion-37db</guid>
      <description>&lt;p&gt;Sometimes, when installing VMware Workstation Pro/Player on slightly dated or medium-low range PCs, you may encounter an annoying warning message during installation. This message informs you that your host does not support 3D acceleration, and proceeding with the installation will result in the same warning every time a virtual machine (VM) is started, with 3D effects being disabled.&lt;/p&gt;

&lt;p&gt;This guide will show you how to resolve this issue by modifying the configuration file.&lt;/p&gt;




&lt;h2&gt;
  
  
  Problem Resolution
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Step 1: Shut Down All VMs and Close VMware
&lt;/h3&gt;

&lt;p&gt;Ensure that no virtual machines are running and that VMware Workstation/Fusion is completely closed. Modifying the configuration file while the application is running may result in changes being overwritten.&lt;/p&gt;




&lt;h3&gt;
  
  
  Step 2: Locate the &lt;strong&gt;&lt;code&gt;preferences.ini&lt;/code&gt;&lt;/strong&gt;
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Windows:&lt;/strong&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;C:&lt;span class="se"&gt;\U&lt;/span&gt;sers&lt;span class="se"&gt;\U&lt;/span&gt;SERNAME&lt;span class="se"&gt;\A&lt;/span&gt;ppData&lt;span class="se"&gt;\R&lt;/span&gt;oaming&lt;span class="se"&gt;\V&lt;/span&gt;Mware
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Replace &lt;strong&gt;&lt;code&gt;&amp;lt;USERNAME&amp;gt;&lt;/code&gt;&lt;/strong&gt; with your actual Windows username.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Linux:&lt;/strong&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;~/.config/vmware
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;MacOS:&lt;/strong&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;~/Library/Preferences/VMware
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Step 3: Edit the &lt;strong&gt;&lt;code&gt;preferences.ini&lt;/code&gt;&lt;/strong&gt; file
&lt;/h3&gt;

&lt;p&gt;Open the &lt;strong&gt;&lt;code&gt;preferences.ini&lt;/code&gt;&lt;/strong&gt; file using a text editor (e.g., Notepad on Windows, &lt;strong&gt;&lt;code&gt;nano&lt;/code&gt;&lt;/strong&gt; or &lt;strong&gt;&lt;code&gt;vim&lt;/code&gt;&lt;/strong&gt; on Linux/macOS). Add the following lines at the end of the file:&lt;/p&gt;

&lt;p&gt;Entering this directory you will find the &lt;code&gt;preferences.ini&lt;/code&gt; file, which will be the VMware Workstation/Fusion configuration&lt;/p&gt;

&lt;p&gt;Now open the file with a text editor and paste these three lines:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight ini"&gt;&lt;code&gt;&lt;span class="py"&gt;mks.enableMTLRenderer&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s"&gt;"0"&lt;/span&gt;
&lt;span class="py"&gt;mks.enableGLRenderer&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s"&gt;"1"&lt;/span&gt;
&lt;span class="py"&gt;mks.gl.allowBlacklistedDrivers&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s"&gt;"TRUE"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Explanation of Settings:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;&lt;code&gt;mks.enableMTLRenderer = "0"&lt;/code&gt;&lt;/strong&gt;: Disables the Metal renderer (used on macOS) and forces OpenGL rendering.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;&lt;code&gt;mks.enableGLRenderer = "1"&lt;/code&gt;&lt;/strong&gt;: Enables OpenGL-based rendering for 3D acceleration.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;&lt;code&gt;mks.gl.allowBlacklistedDrivers = "TRUE"&lt;/code&gt;&lt;/strong&gt;: Allows the use of blacklisted graphics drivers, which are typically unsupported or known to cause issues.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Step 4: Save and Restart VMware
&lt;/h3&gt;

&lt;p&gt;Save the changes to the preferences.ini file and restart VMware Workstation/Fusion. When you start a VM again, the warning "3D acceleration not supported by host" should no longer appear.&lt;/p&gt;




&lt;p&gt;&lt;strong&gt;Final Notes&lt;/strong&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;1. Verify 3D Acceleration&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;To ensure that 3D acceleration is working correctly:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Start a VM and test graphical applications or games that rely on 3D rendering.&lt;/li&gt;
&lt;li&gt;Check for any visual artifacts, crashes, or performance issues.&lt;/li&gt;
&lt;li&gt;In some cases, you may need to enable 3D acceleration explicitly in the VM's .vmx file by adding or ensuring the following line exists:
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight ini"&gt;&lt;code&gt;&lt;span class="py"&gt;mks.enable3d&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s"&gt;"TRUE"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  &lt;strong&gt;2. Potential Risks&lt;/strong&gt;
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Graphical Glitches:&lt;/strong&gt; You may experience screen tearing, flickering, or other rendering issues.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Performance Issues:&lt;/strong&gt;  Poorly supported hardware/drivers may degrade VM performance.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;System Crashes:&lt;/strong&gt; In extreme cases, forcing unsupported settings can cause VMware or the host system to crash.&lt;/li&gt;
&lt;/ul&gt;




&lt;h3&gt;
  
  
  &lt;strong&gt;3. Recommendations&lt;/strong&gt;
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Update Graphics Drivers:&lt;/strong&gt; Ensure your GPU drivers are up-to-date to minimize compatibility issues.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Check Host Hardware:&lt;/strong&gt; Verify that your CPU and GPU support hardware virtualization (Intel VT-x/AMD-V) and GPU passthrough features.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Backup Configuration Files:&lt;/strong&gt; Always create a backup of the &lt;strong&gt;&lt;code&gt;preferences.ini&lt;/code&gt;&lt;/strong&gt; file before making changes, so you can revert if needed.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Test Incrementally:&lt;/strong&gt; If you encounter issues, try enabling one setting at a time to identify the root cause.&lt;/li&gt;
&lt;/ul&gt;




&lt;h3&gt;
  
  
  &lt;strong&gt;4. Alternative Solutions&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;If forcing 3D acceleration does not work or causes too many issues, consider the following alternatives:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Upgrade Hardware:&lt;/strong&gt; Use a more powerful host machine with better GPU support.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Switch Hypervisors:&lt;/strong&gt; Try alternative virtualization software like VirtualBox, which may have different hardware compatibility.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Use Remote Desktop Tools:&lt;/strong&gt; For lightweight graphical tasks, remote desktop solutions might suffice without requiring 3D acceleration.&lt;/li&gt;
&lt;/ul&gt;




&lt;h3&gt;
  
  
  Conclusion
&lt;/h3&gt;

&lt;p&gt;The steps provided in this guide should help you force-enable 3D acceleration in VMware Workstation/Fusion. However, proceed with caution, as unsupported configurations can lead to instability. If the problem persists or causes significant issues, upgrading your hardware or exploring alternative solutions may be necessary.&lt;br&gt;
The steps provided in this guide should help you force-enable 3D acceleration in VMware Workstation/Fusion. However, proceed with caution, as unsupported configurations can lead to instability. If the problem persists or causes significant issues, upgrading your hardware or exploring alternative solutions may be necessary.&lt;/p&gt;

&lt;p&gt;If you encounter specific errors or need further assistance, feel free to provide details for troubleshooting!&lt;/p&gt;



&lt;p&gt;This version includes comprehensive final notes to guide users on verifying the solution, understanding potential risks, and exploring alternative approaches if needed. Let me know if you'd like further refinements! &lt;/p&gt;


&lt;h2&gt;
  
  
  ⚠️ Change in Behavior with VMware 25H2
&lt;/h2&gt;

&lt;p&gt;With the &lt;strong&gt;25H2&lt;/strong&gt; update of VMware Workstation / Fusion, VMware introduced a new command‑line utility called &lt;code&gt;dictTool&lt;/code&gt; to inspect and edit VMware configuration files (such as &lt;code&gt;.vmx&lt;/code&gt; or &lt;code&gt;preferences&lt;/code&gt;). &lt;/p&gt;

&lt;p&gt;This suggests that forcing “legacy” or otherwise unsupported driver settings via global configuration has been made more restrictive.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;⚠️ In practice: many settings that previously could be applied globally are now often ignored unless explicitly placed in the &lt;code&gt;.vmx&lt;/code&gt; file of each VM.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h3&gt;
  
  
  Example — Settings to Insert in Each VM’s &lt;code&gt;.vmx&lt;/code&gt;
&lt;/h3&gt;

&lt;p&gt;Below is an illustrative example of settings you might force (e.g. to allow blacklisted drivers).&lt;br&gt;&lt;br&gt;
&lt;strong&gt;Important&lt;/strong&gt;: use the exact option names relevant to your scenario.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight ini"&gt;&lt;code&gt;&lt;span class="c"&gt;# Allow a blacklisted graphics driver
&lt;/span&gt;&lt;span class="py"&gt;mks.gl.allowBlacklistedDrivers&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s"&gt;"TRUE"&lt;/span&gt;

&lt;span class="c"&gt;# Disable automatic detection
&lt;/span&gt;&lt;span class="py"&gt;svga.autodetect&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s"&gt;"FALSE"&lt;/span&gt;
&lt;span class="py"&gt;svga.noDrivers&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s"&gt;"TRUE"&lt;/span&gt;

&lt;span class="c"&gt;# Other legacy or custom preferences
&lt;/span&gt;&lt;span class="py"&gt;pref.someLegacyOption&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s"&gt;"TRUE"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  What Has Changed in 25H2
&lt;/h3&gt;

&lt;p&gt;In earlier VMware versions, many of these lines could be placed in a global .ini or preferences file and would apply to all virtual machines. Beginning with version 25H2, VMware’s internal validation is stricter: such settings must be declared &lt;strong&gt;inside each VM’s &lt;code&gt;.vmx&lt;/code&gt; file&lt;/strong&gt; for them to take effect — otherwise they may be ignored or rejected.&lt;/p&gt;

&lt;p&gt;Unfortunately, as newer versions of VMware Workstation / Fusion increasingly drop support for older hardware, if you aim to maximize 3D performance it may be better, &lt;strong&gt;where&lt;/strong&gt; possible, to remain on version &lt;strong&gt;17.6.4&lt;/strong&gt;, which VMware is expected to support until December 2025.&lt;/p&gt;

&lt;p&gt;In summary, while staying on VMware 17.6.4 may yield the best possible 3D performance on legacy hardware, this choice comes with increasing risk: missing future fixes, accumulating incompatibilities, and exposure to vulnerabilities. Upgrading to 25H2 or a future release offers new capabilities, tighter security, and broader hardware support — but also demands more careful per‑VM configuration and thorough testing. The optimal path depends on your hardware, performance priorities, and tolerance for risk, so adopt a hybrid strategy, test rigorously, and keep backups in hand.&lt;/p&gt;

</description>
      <category>virtualmachine</category>
      <category>vmware</category>
      <category>hypervisor</category>
    </item>
    <item>
      <title>How to Embed Binary Data into a Win32 Executable File in 4 Methods</title>
      <dc:creator>Stefor07</dc:creator>
      <pubDate>Sat, 19 Apr 2025 09:40:43 +0000</pubDate>
      <link>https://dev.to/stefor07/how-to-embed-binary-data-into-a-win32-executable-file-in-4-methods-43kp</link>
      <guid>https://dev.to/stefor07/how-to-embed-binary-data-into-a-win32-executable-file-in-4-methods-43kp</guid>
      <description>&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F425j9mxvvqqxp59wffoa.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F425j9mxvvqqxp59wffoa.png" alt="How to Embed Binary Data into a Win32 Executable File in 4 Methods" width="800" height="533"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;This guide presents &lt;strong&gt;4 methods&lt;/strong&gt; to embed arbitrary binary files (images, data, etc.) inside a Win32 executable. From standard approaches like byte arrays to low-level techniques such as binary appending (&lt;code&gt;copy /b&lt;/code&gt;), each method includes &lt;strong&gt;ready-to-use examples&lt;/strong&gt; in Visual C++ and highlights their specific advantages and disadvantages. It is aimed at C/C++ developers who want to incorporate binary data (e.g., images, configuration files, resources) within their executables. &lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Use cases&lt;/strong&gt;:  &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Single-file deployment (no external resources).
&lt;/li&gt;
&lt;li&gt;Hiding data inside .exe/.elf (no encryption).
&lt;/li&gt;
&lt;li&gt;Quick prototyping or educational purposes.
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;⚠️ &lt;strong&gt;Note&lt;/strong&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Methods 1 and 3 are clean but &lt;strong&gt;platform-specific&lt;/strong&gt; (Windows only).&lt;/li&gt;
&lt;li&gt;Method 2 (embedding as a C array) is &lt;strong&gt;both clean and portable&lt;/strong&gt; across platforms.&lt;/li&gt;
&lt;li&gt;Method 4 relies on PE overlay data: simple and effective, but may invalidate signatures or trigger AV heuristics.&lt;/li&gt;
&lt;li&gt;All examples assume an x86_64 context (they can be adapted for other architectures).&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  Method 1: Win32 Resource Files (.rc)
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Best for&lt;/strong&gt;: Native Windows executables where you want integrated resource handling  &lt;/p&gt;




&lt;h3&gt;
  
  
  Step 1: Add resource files in Visual Studio
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;Right-click project → &lt;strong&gt;Add → Resource...&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;Choose &lt;strong&gt;"Import..."&lt;/strong&gt; and select your binary file (e.g., &lt;code&gt;data.bin&lt;/code&gt;)
&lt;/li&gt;
&lt;li&gt;Set resource type as &lt;code&gt;RCDATA&lt;/code&gt; and assign an ID (e.g., &lt;code&gt;IDR_MY_DATA&lt;/code&gt;)
&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;em&gt;Visual Studio will automatically:&lt;/em&gt;  &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Generate/modify &lt;code&gt;resource.h&lt;/code&gt; with your ID
&lt;/li&gt;
&lt;li&gt;Create/update the &lt;code&gt;.rc&lt;/code&gt; file with:
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight cpp"&gt;&lt;code&gt;  &lt;span class="n"&gt;IDR_MY_DATA&lt;/span&gt; &lt;span class="n"&gt;RCDATA&lt;/span&gt; &lt;span class="s"&gt;"file.bin"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h3&gt;
  
  
  Step 2: Access the resource from code
&lt;/h3&gt;

&lt;p&gt;Here’s an example demonstrating how to load and access the embedded data in memory:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;main.cpp&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight cpp"&gt;&lt;code&gt;&lt;span class="cp"&gt;#include&lt;/span&gt; &lt;span class="cpf"&gt;&amp;lt;windows.h&amp;gt;&lt;/span&gt;&lt;span class="cp"&gt;
#include&lt;/span&gt; &lt;span class="cpf"&gt;"resource.h"&lt;/span&gt;&lt;span class="c1"&gt;  // Auto-generated by Visual Studio&lt;/span&gt;&lt;span class="cp"&gt;
&lt;/span&gt;
&lt;span class="kt"&gt;void&lt;/span&gt; &lt;span class="nf"&gt;LoadEmbeddedData&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="c1"&gt;// Find the resource handle&lt;/span&gt;
    &lt;span class="n"&gt;HRSRC&lt;/span&gt; &lt;span class="n"&gt;hRes&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;FindResource&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;nullptr&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;MAKEINTRESOURCE&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;IDR_MY_DATA&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="n"&gt;RT_RCDATA&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;!&lt;/span&gt;&lt;span class="n"&gt;hRes&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="c1"&gt;// Handle error: resource not found&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;

    &lt;span class="c1"&gt;// Get the size of the resource&lt;/span&gt;
    &lt;span class="n"&gt;DWORD&lt;/span&gt; &lt;span class="n"&gt;hResSize&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;SizeofResource&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;nullptr&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;hRes&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;hResSize&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="c1"&gt;// Handle error: resource size invalid&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;

    &lt;span class="c1"&gt;// Load the resource into memory&lt;/span&gt;
    &lt;span class="n"&gt;HGLOBAL&lt;/span&gt; &lt;span class="n"&gt;hData&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;LoadResource&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;nullptr&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;hRes&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;!&lt;/span&gt;&lt;span class="n"&gt;hData&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="c1"&gt;// Handle error: failed to load resource&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;

    &lt;span class="c1"&gt;// Lock the resource to get a pointer to the data&lt;/span&gt;
    &lt;span class="k"&gt;const&lt;/span&gt; &lt;span class="n"&gt;BYTE&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="n"&gt;pData&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;static_cast&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;LockResource&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;hData&lt;/span&gt;&lt;span class="p"&gt;));&lt;/span&gt;
    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;!&lt;/span&gt;&lt;span class="n"&gt;pData&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="c1"&gt;// Handle error: failed to lock resource&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;

    &lt;span class="c1"&gt;// At this point, pData points to the embedded binary data&lt;/span&gt;
    &lt;span class="c1"&gt;// You can process the data here, e.g., write to disk, parse, etc.&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h3&gt;
  
  
  Key Notes:
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;🔧 &lt;strong&gt;No manual compilation&lt;/strong&gt; – VS handles &lt;code&gt;.rc&lt;/code&gt; → &lt;code&gt;.res&lt;/code&gt; conversion during build
&lt;/li&gt;
&lt;li&gt;🔒 &lt;strong&gt;Data is read-only&lt;/strong&gt; in memory (safe from modification)
&lt;/li&gt;
&lt;li&gt;📦 &lt;strong&gt;Supports any binary format&lt;/strong&gt; (use &lt;code&gt;RT_RCDATA&lt;/code&gt; or custom names for raw data)
&lt;/li&gt;
&lt;li&gt;❌ &lt;strong&gt;Possible external changes&lt;/strong&gt; - Resources can be replaced by external tools&lt;/li&gt;
&lt;li&gt;⚠️ &lt;strong&gt;Large resources warning&lt;/strong&gt; - Binary resources are memory-mapped on demand and do not consume RAM until accessed. However, reading very large resources entirely at once can significantly increase physical RAM usage. Consider streaming or partial access methods to efficiently handle large data.&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  Method 2: Manual Hex Offset Array
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Best for&lt;/strong&gt;: Precise binary embedding without compiler dependencies&lt;/p&gt;

&lt;h3&gt;
  
  
  Required Tools
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://mh-nexus.de/en/hxd/" rel="noopener noreferrer"&gt;HxD Editor&lt;/a&gt; - A utility to export the binary file array offset as a C/C++ source file&lt;/p&gt;




&lt;h3&gt;
  
  
  Step 1: Export binary to C++ offset array
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;Open your binary file (&lt;code&gt;.bin&lt;/code&gt;, &lt;code&gt;.dat&lt;/code&gt;, etc.) in &lt;strong&gt;HxD Editor&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;Go to  &lt;strong&gt;File → Export → C&lt;/strong&gt; and choose a path to save the source &lt;code&gt;.cpp&lt;/code&gt; file&lt;/li&gt;
&lt;li&gt;Move the source &lt;code&gt;.cpp&lt;/code&gt; file into your project folder and include it&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;The source file should look like:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight cpp"&gt;&lt;code&gt;&lt;span class="cm"&gt;/* [FILENAME] ([DATE])
   StartOffset(h): 00000000, EndOffset(h): 000003FF, Length(h): 00000400 */&lt;/span&gt;

&lt;span class="kt"&gt;unsigned&lt;/span&gt; &lt;span class="kt"&gt;char&lt;/span&gt; &lt;span class="n"&gt;rawData&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;1024&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; 
&lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="mh"&gt;0x7F&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mh"&gt;0x45&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mh"&gt;0x4C&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mh"&gt;0x46&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mh"&gt;0x02&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mh"&gt;0x01&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mh"&gt;0x01&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mh"&gt;0x00&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="c1"&gt;// ELF magic bytes&lt;/span&gt;
    &lt;span class="mh"&gt;0x00&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mh"&gt;0x00&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mh"&gt;0x00&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mh"&gt;0x00&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mh"&gt;0x00&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mh"&gt;0x00&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mh"&gt;0x00&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mh"&gt;0x00&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="mh"&gt;0x03&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mh"&gt;0x00&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mh"&gt;0x3E&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mh"&gt;0x00&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mh"&gt;0x01&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mh"&gt;0x00&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mh"&gt;0x00&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mh"&gt;0x00&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="c1"&gt;// ... (truncated for brevity) ...&lt;/span&gt;
    &lt;span class="mh"&gt;0x00&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mh"&gt;0x00&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mh"&gt;0x00&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mh"&gt;0x00&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mh"&gt;0x00&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mh"&gt;0x00&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mh"&gt;0x00&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mh"&gt;0x00&lt;/span&gt;
&lt;span class="p"&gt;};&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h3&gt;
  
  
  Step 2: Accessing the offset from the code
&lt;/h3&gt;

&lt;p&gt;Now create a new H header file from Visual Studio and insert the following declarations:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;embedded_data.h&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight cpp"&gt;&lt;code&gt;&lt;span class="cp"&gt;#pragma once
&lt;/span&gt;
&lt;span class="k"&gt;extern&lt;/span&gt; &lt;span class="k"&gt;const&lt;/span&gt; &lt;span class="kt"&gt;size_t&lt;/span&gt; &lt;span class="n"&gt;embedded_data_size&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;extern&lt;/span&gt; &lt;span class="kt"&gt;unsigned&lt;/span&gt; &lt;span class="kt"&gt;char&lt;/span&gt; &lt;span class="n"&gt;embedded_data&lt;/span&gt;&lt;span class="p"&gt;[];&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;After remember to move the size of the bytes array into a const variable and assign it to the size of the array, do not forget to include the header with the declarations&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;embedded_data.cpp&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight cpp"&gt;&lt;code&gt;&lt;span class="cp"&gt;#pragma once
#include&lt;/span&gt; &lt;span class="cpf"&gt;"embedded_data.h"&lt;/span&gt;&lt;span class="c1"&gt; // include the header&lt;/span&gt;&lt;span class="cp"&gt;
&lt;/span&gt;
&lt;span class="k"&gt;const&lt;/span&gt; &lt;span class="kt"&gt;size_t&lt;/span&gt; &lt;span class="n"&gt;embedded_data_size&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;1024&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="c1"&gt;// this is the value of the array size offset below&lt;/span&gt;

&lt;span class="kt"&gt;unsigned&lt;/span&gt; &lt;span class="kt"&gt;char&lt;/span&gt; &lt;span class="n"&gt;embedded_data&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;embedded_data_size&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; 
&lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="mh"&gt;0x7F&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mh"&gt;0x45&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mh"&gt;0x4C&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mh"&gt;0x46&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mh"&gt;0x02&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mh"&gt;0x01&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mh"&gt;0x01&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mh"&gt;0x00&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="c1"&gt;// ELF magic bytes&lt;/span&gt;
    &lt;span class="mh"&gt;0x00&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mh"&gt;0x00&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mh"&gt;0x00&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mh"&gt;0x00&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mh"&gt;0x00&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mh"&gt;0x00&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mh"&gt;0x00&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mh"&gt;0x00&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="mh"&gt;0x03&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mh"&gt;0x00&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mh"&gt;0x3E&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mh"&gt;0x00&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mh"&gt;0x01&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mh"&gt;0x00&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mh"&gt;0x00&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mh"&gt;0x00&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="c1"&gt;// ... (truncated for brevity) ...&lt;/span&gt;
    &lt;span class="mh"&gt;0x00&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mh"&gt;0x00&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mh"&gt;0x00&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mh"&gt;0x00&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mh"&gt;0x00&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mh"&gt;0x00&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mh"&gt;0x00&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mh"&gt;0x00&lt;/span&gt;
&lt;span class="p"&gt;};&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;At this point from any part of our application code we include the header that declares our offset and declare a pointer of the binary data in the code to be able to use it in memory&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;main.cpp&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight cpp"&gt;&lt;code&gt;&lt;span class="cp"&gt;#include&lt;/span&gt; &lt;span class="cpf"&gt;"windows.h"&lt;/span&gt;&lt;span class="cp"&gt;
#include&lt;/span&gt; &lt;span class="cpf"&gt;"embedded_data.h"&lt;/span&gt;&lt;span class="cp"&gt;
&lt;/span&gt;
&lt;span class="kt"&gt;void&lt;/span&gt; &lt;span class="nf"&gt;LoadEmbeddedData&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="k"&gt;const&lt;/span&gt; &lt;span class="n"&gt;BYTE&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="n"&gt;embedded_data_ptr&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;embedded_data&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="k"&gt;const&lt;/span&gt; &lt;span class="kt"&gt;size_t&lt;/span&gt; &lt;span class="n"&gt;embedded_data_size&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;embedded_data_size&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

  &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;embedded_data_ptr&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
  &lt;span class="p"&gt;{&lt;/span&gt;
     &lt;span class="c1"&gt;// At this point, embedded_data_ptr pointer points the embedded data&lt;/span&gt;
     &lt;span class="c1"&gt;// You can do anything with the buffer and size&lt;/span&gt;
     &lt;span class="c1"&gt;// Example: processing or writing to disk&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h3&gt;
  
  
  Key Notes:
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;✅ &lt;strong&gt;Manual binary precision&lt;/strong&gt; – It allows direct embedding of binary data into source code, eliminating dependencies on automated tools.&lt;/li&gt;
&lt;li&gt;🔒 &lt;strong&gt;Data is read-only&lt;/strong&gt; in memory (safe from modification)
&lt;/li&gt;
&lt;li&gt;📦 &lt;strong&gt;Immutable data&lt;/strong&gt; Embedded data is read-only, ensuring safety and integrity during execution.&lt;/li&gt;
&lt;li&gt;❌ &lt;strong&gt;Manual updates required&lt;/strong&gt; - To change or update embedded data, you need to regenerate the offset and recompile the source code.&lt;/li&gt;
&lt;li&gt;❌ &lt;strong&gt;Avoid too large files&lt;/strong&gt; - Embedding large files can increase the size of the source code, reduce readability, and cause compilation slowdowns or even errors.&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  Method 3: COFF Object Binary Linking
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Best for:&lt;/strong&gt; Windows applications (MSVC or MinGW) that need tightly integrated, read-only binary data. &lt;/p&gt;

&lt;h3&gt;
  
  
  Required Tools
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;a href="https://sorecchione07.altervista.org/Downloads-URLS/bin2obj/bin2obj.zip" rel="noopener noreferrer"&gt;bin2obj&lt;/a&gt; -  Includes a preconfigured portable &lt;strong&gt;MinGW (ucrt64)&lt;/strong&gt; setup with &lt;code&gt;objcopy&lt;/code&gt; and a small utility GUI tool to simplify conversion.&lt;/li&gt;
&lt;/ul&gt;




&lt;h3&gt;
  
  
  Step 1: Convert Binary to COFF Object File
&lt;/h3&gt;

&lt;h4&gt;
  
  
  Option A: Manual objcopy Command
&lt;/h4&gt;

&lt;p&gt;To manually convert a binary file to a COFF object, open a terminal (CMD or Git Bash) inside the &lt;code&gt;ucrt64&lt;/code&gt; folder and run one of the following commands depending on your target architecture:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;For 32-bit COFF:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight powershell"&gt;&lt;code&gt;&lt;span class="n"&gt;objcopy&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-I&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;binary&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-O&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;pe-i386&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-B&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;i386&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;binary.bin&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;binary.obj&lt;/span&gt;&lt;span class="w"&gt; 
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;For 64-bit COFF:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight powershell"&gt;&lt;code&gt;&lt;span class="n"&gt;objcopy&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-I&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;binary&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-O&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;pe-x86-64&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-B&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;i386:x86-64&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;binary.bin&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;binary.obj&lt;/span&gt;&lt;span class="w"&gt; 
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;binary.bin&lt;/code&gt; is your input file (raw binary).&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;binary.obj&lt;/code&gt; is the output object file that you'll link into your project.&lt;/li&gt;
&lt;/ul&gt;




&lt;h4&gt;
  
  
  Option B: Use the &lt;code&gt;bin2obj&lt;/code&gt; Utility (Recommended)
&lt;/h4&gt;

&lt;p&gt;The GUI tool allows for quick conversion:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;1.&lt;/strong&gt; Select your binary file.&lt;br&gt;
&lt;strong&gt;2.&lt;/strong&gt; Choose a destination &lt;code&gt;.obj&lt;/code&gt; file.&lt;br&gt;
&lt;strong&gt;3.&lt;/strong&gt; Click &lt;strong&gt;"Convert to COFF"&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Be sure to &lt;strong&gt;leave the "Export C++ header file" checkbox enabled&lt;/strong&gt; to automatically generate a header file with symbol declarations.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F5az9jsww0smtps3mqwez.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F5az9jsww0smtps3mqwez.png" alt=" " width="619" height="364"&gt;&lt;/a&gt;&lt;/p&gt;


&lt;h3&gt;
  
  
  Generated Header Example
&lt;/h3&gt;

&lt;p&gt;The tool will generate a &lt;code&gt;binary_data.h&lt;/code&gt; like the following:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;For 32-bit:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight cpp"&gt;&lt;code&gt;&lt;span class="cp"&gt;#pragma once
#include&lt;/span&gt; &lt;span class="cpf"&gt;&amp;lt;cstdint&amp;gt;&lt;/span&gt;&lt;span class="cp"&gt;
&lt;/span&gt;
&lt;span class="c1"&gt;// include this header in your application and link the COFF as additional dependencies&lt;/span&gt;

&lt;span class="k"&gt;extern&lt;/span&gt; &lt;span class="s"&gt;"C"&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
   &lt;span class="k"&gt;extern&lt;/span&gt; &lt;span class="kt"&gt;uint8_t&lt;/span&gt; &lt;span class="n"&gt;binary_filename_start&lt;/span&gt;&lt;span class="p"&gt;[];&lt;/span&gt;

   &lt;span class="k"&gt;extern&lt;/span&gt; &lt;span class="kt"&gt;uint8_t&lt;/span&gt; &lt;span class="n"&gt;binary_filename_end&lt;/span&gt;&lt;span class="p"&gt;[];&lt;/span&gt;

   &lt;span class="k"&gt;const&lt;/span&gt; &lt;span class="kt"&gt;size_t&lt;/span&gt; &lt;span class="n"&gt;binary_filename_size&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;binary_filename_end&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="n"&gt;binary_filename_start&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;For 64-bit:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight cpp"&gt;&lt;code&gt;&lt;span class="cp"&gt;#pragma once
#include&lt;/span&gt; &lt;span class="cpf"&gt;&amp;lt;cstdint&amp;gt;&lt;/span&gt;&lt;span class="cp"&gt;
&lt;/span&gt;
&lt;span class="c1"&gt;// include this header in your application and link the COFF as additional dependencies&lt;/span&gt;

&lt;span class="k"&gt;extern&lt;/span&gt; &lt;span class="s"&gt;"C"&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
   &lt;span class="k"&gt;extern&lt;/span&gt; &lt;span class="kt"&gt;uint8_t&lt;/span&gt; &lt;span class="n"&gt;_binary_filename_start&lt;/span&gt;&lt;span class="p"&gt;[];&lt;/span&gt;

   &lt;span class="k"&gt;extern&lt;/span&gt; &lt;span class="kt"&gt;uint8_t&lt;/span&gt; &lt;span class="n"&gt;_binary_filename_end&lt;/span&gt;&lt;span class="p"&gt;[];&lt;/span&gt;

   &lt;span class="k"&gt;const&lt;/span&gt; &lt;span class="kt"&gt;size_t&lt;/span&gt; &lt;span class="n"&gt;binary_filename_size&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;_binary_filename_end&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="n"&gt;_binary_filename_start&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h3&gt;
  
  
  Step 2 (Optional): Manually Create Header Using &lt;code&gt;dumpbin&lt;/code&gt;
&lt;/h3&gt;

&lt;p&gt;If you didn’t use the utility and created the &lt;code&gt;.obj&lt;/code&gt; manually, you’ll need to retrieve symbol names:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;1.&lt;/strong&gt; Open &lt;strong&gt;Developer Command Prompt for Visual Studio&lt;/strong&gt;&lt;br&gt;
&lt;strong&gt;2.&lt;/strong&gt; Navigate to the folder with the &lt;code&gt;.obj&lt;/code&gt; file&lt;br&gt;
&lt;strong&gt;3.&lt;/strong&gt; Run:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight powershell"&gt;&lt;code&gt;&lt;span class="n"&gt;dumpbin&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;/symbols&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;binary.obj&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;You’ll see output like:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight rust"&gt;&lt;code&gt;&lt;span class="mi"&gt;000&lt;/span&gt; &lt;span class="mi"&gt;00000000&lt;/span&gt; &lt;span class="n"&gt;SECT1&lt;/span&gt;  &lt;span class="n"&gt;notype&lt;/span&gt;       &lt;span class="n"&gt;External&lt;/span&gt;     &lt;span class="p"&gt;|&lt;/span&gt; &lt;span class="n"&gt;_binary_filename_start&lt;/span&gt;
&lt;span class="mi"&gt;001&lt;/span&gt; &lt;span class="mi"&gt;000069&lt;/span&gt;&lt;span class="n"&gt;DD&lt;/span&gt; &lt;span class="n"&gt;SECT1&lt;/span&gt;  &lt;span class="n"&gt;notype&lt;/span&gt;       &lt;span class="n"&gt;External&lt;/span&gt;     &lt;span class="p"&gt;|&lt;/span&gt; &lt;span class="n"&gt;_binary_filename_end&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h4&gt;
  
  
  Header Template:
&lt;/h4&gt;

&lt;p&gt;&lt;strong&gt;For 32-bit&lt;/strong&gt; (remove underscores):&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight cpp"&gt;&lt;code&gt;&lt;span class="cp"&gt;#pragma once
#include&lt;/span&gt; &lt;span class="cpf"&gt;&amp;lt;cstdint&amp;gt;&lt;/span&gt;&lt;span class="cp"&gt;
&lt;/span&gt;
&lt;span class="k"&gt;extern&lt;/span&gt; &lt;span class="s"&gt;"C"&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
   &lt;span class="k"&gt;extern&lt;/span&gt; &lt;span class="kt"&gt;uint8_t&lt;/span&gt; &lt;span class="n"&gt;binary_filename_start&lt;/span&gt;&lt;span class="p"&gt;[];&lt;/span&gt;
   &lt;span class="k"&gt;extern&lt;/span&gt; &lt;span class="kt"&gt;uint8_t&lt;/span&gt; &lt;span class="n"&gt;binary_filename_end&lt;/span&gt;&lt;span class="p"&gt;[];&lt;/span&gt;

   &lt;span class="k"&gt;const&lt;/span&gt; &lt;span class="kt"&gt;size_t&lt;/span&gt; &lt;span class="n"&gt;binary_filename_size&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;binary_filename_end&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="n"&gt;binary_filename_start&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;For 64-bit&lt;/strong&gt; (keep underscores):&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight cpp"&gt;&lt;code&gt;&lt;span class="cp"&gt;#pragma once
#include&lt;/span&gt; &lt;span class="cpf"&gt;&amp;lt;cstdint&amp;gt;&lt;/span&gt;&lt;span class="cp"&gt;
&lt;/span&gt;
&lt;span class="k"&gt;extern&lt;/span&gt; &lt;span class="s"&gt;"C"&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
   &lt;span class="k"&gt;extern&lt;/span&gt; &lt;span class="kt"&gt;uint8_t&lt;/span&gt; &lt;span class="n"&gt;_binary_filename_start&lt;/span&gt;&lt;span class="p"&gt;[];&lt;/span&gt;
   &lt;span class="k"&gt;extern&lt;/span&gt; &lt;span class="kt"&gt;uint8_t&lt;/span&gt; &lt;span class="n"&gt;_binary_filename_end&lt;/span&gt;&lt;span class="p"&gt;[];&lt;/span&gt;

   &lt;span class="k"&gt;const&lt;/span&gt; &lt;span class="kt"&gt;size_t&lt;/span&gt; &lt;span class="n"&gt;binary_filename_size&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;_binary_filename_end&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="n"&gt;_binary_filename_start&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;ℹ️ Tip:&lt;/strong&gt; Symbol names always reflect the original file name, so using consistent filenames helps with version control and updates.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;ℹ️ Tip:&lt;/strong&gt; You can rename the &lt;code&gt;.obj&lt;/code&gt; symbols always with the GUI utility bin2obj without having too much difficulty with the command lines&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h3&gt;
  
  
  Step 3: Linking and Accessing Embedded Data
&lt;/h3&gt;

&lt;p&gt;Now that we have all the necessary COFF symbols declared we can declare from anywhere in our application code the pointer that points to the embedded data.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Move the &lt;code&gt;.obj&lt;/code&gt; file into your project.&lt;/li&gt;
&lt;li&gt;Add it to your &lt;strong&gt;linker input&lt;/strong&gt; (Additional Dependencies in Visual Studio).&lt;/li&gt;
&lt;li&gt;Include the generated &lt;code&gt;.h&lt;/code&gt; header in your source code.&lt;/li&gt;
&lt;/ul&gt;

&lt;h4&gt;
  
  
  Usage Example:
&lt;/h4&gt;

&lt;p&gt;&lt;strong&gt;main.cpp&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight cpp"&gt;&lt;code&gt;&lt;span class="cp"&gt;#include&lt;/span&gt; &lt;span class="cpf"&gt;"windows.h"&lt;/span&gt;&lt;span class="cp"&gt;
#include&lt;/span&gt; &lt;span class="cpf"&gt;"binary_data.h"&lt;/span&gt;&lt;span class="cp"&gt;
&lt;/span&gt;
&lt;span class="kt"&gt;void&lt;/span&gt; &lt;span class="nf"&gt;LoadEmbeddedData&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;const&lt;/span&gt; &lt;span class="n"&gt;BYTE&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="n"&gt;buffer&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;binary_filename_start&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="k"&gt;const&lt;/span&gt; &lt;span class="kt"&gt;size_t&lt;/span&gt; &lt;span class="n"&gt;bufferSize&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;binary_filename_size&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;buffer&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="c1"&gt;// the buffer pointer points the embedded binary data&lt;/span&gt;
        &lt;span class="c1"&gt;// You can process it in memory, decompress, write to disk, etc.&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;For 64-bit:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight cpp"&gt;&lt;code&gt;&lt;span class="k"&gt;const&lt;/span&gt; &lt;span class="n"&gt;BYTE&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="n"&gt;binary_filename_ptr&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;_binary_filename_start&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;blockquote&gt;
&lt;p&gt;⚠️Remember to compile your application in 32 bit / 64 bit depending on your COFF architecture&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h3&gt;
  
  
  Key Notes:
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;✅ &lt;strong&gt;Efficient binary embedding&lt;/strong&gt; – Converts binary data into a COFF object, allowing direct linking in Windows executables (ideal for MSVC/MinGW).&lt;/li&gt;
&lt;li&gt;🔒 &lt;strong&gt;Data is read-only&lt;/strong&gt; in memory (safe from modification)
&lt;/li&gt;
&lt;li&gt;📦 &lt;strong&gt;Immutable data&lt;/strong&gt; Embedded data is read-only, ensuring safety and integrity during execution.&lt;/li&gt;
&lt;li&gt;❌ &lt;strong&gt;Manual updates required&lt;/strong&gt; - To change or update embedded data, you need to regenerate the COFF and recompile the source code.&lt;/li&gt;
&lt;li&gt;✅ &lt;strong&gt;Symbol consistency&lt;/strong&gt; - If the binary file has the same name, the generated symbols (e.g. &lt;code&gt;binary_filename_start&lt;/code&gt;) will be identical, allowing easy updates without changes to the source code.&lt;/li&gt;
&lt;li&gt;⚙️ &lt;strong&gt;Custom section alignment possible&lt;/strong&gt; - You can specify additional options with objcopy to control the alignment of the section, which is useful for certain data types or alignment-sensitive binary structures.&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  Method 4: Binary concatenation into the executable (&lt;code&gt;copy /b&lt;/code&gt;)
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Best for:&lt;/strong&gt; self-extracting archives and standalone installers&lt;/p&gt;

&lt;p&gt;This technique appends arbitrary binary data (e.g., ZIPs, DLLs, images) to the end of a Windows executable using the &lt;code&gt;copy /b&lt;/code&gt; command. Because Windows PE executables support overlay data — i.e., data beyond all mapped sections — the appended bytes do not interfere with execution and can be accessed at runtime via file I/O or memory mapping.&lt;/p&gt;

&lt;p&gt;This approach is especially useful for self-extracting archives or installers where the payload may be large, and you want to avoid embedding it in the PE resources or sections.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;✅ Simple and effective using only the Windows command line and Win32 APIs  &lt;/p&gt;

&lt;p&gt;⚠️ Not suitable for most small assets; for GIFs, BMPs, or simple settings files, PE resources or embedding as arrays is simpler and more maintainable.&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h3&gt;
  
  
  Step 1: Declaring helper functions
&lt;/h3&gt;

&lt;p&gt;Add the following helper functions to your C++ application to:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;1.&lt;/strong&gt; Determine the real size of the executable (excluding any appended binary data).&lt;br&gt;
&lt;strong&gt;2.&lt;/strong&gt; Load the appended binary data into memory. (both with improved heap allocation and memory mapping)&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Gets the actual size of the EXE excluding appended binary data&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight cpp"&gt;&lt;code&gt;&lt;span class="n"&gt;DWORD&lt;/span&gt; &lt;span class="nf"&gt;GetRealExeSize&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;const&lt;/span&gt; &lt;span class="n"&gt;TCHAR&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="n"&gt;exePath&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="n"&gt;HANDLE&lt;/span&gt; &lt;span class="n"&gt;hFile&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;CreateFile&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;exePath&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;GENERIC_READ&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;FILE_SHARE_READ&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nb"&gt;NULL&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;OPEN_EXISTING&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;FILE_ATTRIBUTE_NORMAL&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nb"&gt;NULL&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;hFile&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="n"&gt;INVALID_HANDLE_VALUE&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

    &lt;span class="n"&gt;HANDLE&lt;/span&gt; &lt;span class="n"&gt;hMapping&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;CreateFileMapping&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;hFile&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nb"&gt;NULL&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;PAGE_READONLY&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nb"&gt;NULL&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;!&lt;/span&gt;&lt;span class="n"&gt;hMapping&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="n"&gt;CloseHandle&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;hFile&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt; &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;

    &lt;span class="n"&gt;LPBYTE&lt;/span&gt; &lt;span class="n"&gt;pBase&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;LPBYTE&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="n"&gt;MapViewOfFile&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;hMapping&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;FILE_MAP_READ&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;!&lt;/span&gt;&lt;span class="n"&gt;pBase&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="n"&gt;CloseHandle&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;hMapping&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt; &lt;span class="n"&gt;CloseHandle&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;hFile&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt; &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;

    &lt;span class="n"&gt;IMAGE_DOS_HEADER&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="n"&gt;pDosHeader&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;IMAGE_DOS_HEADER&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="n"&gt;pBase&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;pDosHeader&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="n"&gt;e_magic&lt;/span&gt; &lt;span class="o"&gt;!=&lt;/span&gt; &lt;span class="n"&gt;IMAGE_DOS_SIGNATURE&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="n"&gt;UnmapViewOfFile&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;pBase&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
        &lt;span class="n"&gt;CloseHandle&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;hMapping&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
        &lt;span class="n"&gt;CloseHandle&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;hFile&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;

    &lt;span class="n"&gt;IMAGE_NT_HEADERS&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="n"&gt;pNtHeaders&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;IMAGE_NT_HEADERS&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="p"&gt;)(&lt;/span&gt;&lt;span class="n"&gt;pBase&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;pDosHeader&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="n"&gt;e_lfanew&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;pNtHeaders&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="n"&gt;Signature&lt;/span&gt; &lt;span class="o"&gt;!=&lt;/span&gt; &lt;span class="n"&gt;IMAGE_NT_SIGNATURE&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="n"&gt;UnmapViewOfFile&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;pBase&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
        &lt;span class="n"&gt;CloseHandle&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;hMapping&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
        &lt;span class="n"&gt;CloseHandle&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;hFile&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="p"&gt;};&lt;/span&gt;

    &lt;span class="n"&gt;DWORD&lt;/span&gt; &lt;span class="n"&gt;maxEnd&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="n"&gt;IMAGE_SECTION_HEADER&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="n"&gt;pSection&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;IMAGE_FIRST_SECTION&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;pNtHeaders&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;i&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="n"&gt;i&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt; &lt;span class="n"&gt;pNtHeaders&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="n"&gt;FileHeader&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;NumberOfSections&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="o"&gt;++&lt;/span&gt;&lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="n"&gt;DWORD&lt;/span&gt; &lt;span class="n"&gt;sectionEnd&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;pSection&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="p"&gt;].&lt;/span&gt;&lt;span class="n"&gt;PointerToRawData&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;pSection&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="p"&gt;].&lt;/span&gt;&lt;span class="n"&gt;SizeOfRawData&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
        &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;sectionEnd&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;maxEnd&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="n"&gt;maxEnd&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;sectionEnd&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;


    &lt;span class="n"&gt;UnmapViewOfFile&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;pBase&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="n"&gt;CloseHandle&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;hMapping&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="n"&gt;CloseHandle&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;hFile&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;maxEnd&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Version 1: Heap allocation (for small/medium data)&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight cpp"&gt;&lt;code&gt;&lt;span class="n"&gt;BYTE&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="nf"&gt;LoadAppendedData&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;DWORD&lt;/span&gt;&lt;span class="o"&gt;&amp;amp;&lt;/span&gt; &lt;span class="n"&gt;outSize&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="n"&gt;TCHAR&lt;/span&gt; &lt;span class="n"&gt;exePath&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;MAX_PATH&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt; &lt;span class="p"&gt;};&lt;/span&gt;
    &lt;span class="n"&gt;GetModuleFileName&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;NULL&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;exePath&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;MAX_PATH&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

    &lt;span class="n"&gt;DWORD&lt;/span&gt; &lt;span class="n"&gt;exeSize&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;GetRealExeSize&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;exePath&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="n"&gt;HANDLE&lt;/span&gt; &lt;span class="n"&gt;hFile&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;CreateFile&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;exePath&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;GENERIC_READ&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;FILE_SHARE_READ&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nb"&gt;NULL&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;OPEN_EXISTING&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;FILE_ATTRIBUTE_NORMAL&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nb"&gt;NULL&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;hFile&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="n"&gt;INVALID_HANDLE_VALUE&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nb"&gt;nullptr&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

    &lt;span class="n"&gt;LARGE_INTEGER&lt;/span&gt; &lt;span class="n"&gt;fileSize&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;!&lt;/span&gt;&lt;span class="n"&gt;GetFileSizeEx&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;hFile&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="n"&gt;fileSize&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="n"&gt;CloseHandle&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;hFile&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt; &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nb"&gt;nullptr&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;

    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;fileSize&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;QuadPart&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;=&lt;/span&gt; &lt;span class="n"&gt;exeSize&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="n"&gt;CloseHandle&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;hFile&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt; &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nb"&gt;nullptr&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;

    &lt;span class="n"&gt;DWORD&lt;/span&gt; &lt;span class="n"&gt;appendedSize&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;DWORD&lt;/span&gt;&lt;span class="p"&gt;)(&lt;/span&gt;&lt;span class="n"&gt;fileSize&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;QuadPart&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="n"&gt;exeSize&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="n"&gt;BYTE&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="n"&gt;data&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="n"&gt;BYTE&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;appendedSize&lt;/span&gt;&lt;span class="p"&gt;];&lt;/span&gt;

    &lt;span class="n"&gt;SetFilePointer&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;hFile&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;exeSize&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nb"&gt;NULL&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;FILE_BEGIN&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="n"&gt;DWORD&lt;/span&gt; &lt;span class="n"&gt;bytesRead&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="n"&gt;ReadFile&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;hFile&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;data&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;appendedSize&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="n"&gt;bytesRead&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nb"&gt;NULL&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="n"&gt;CloseHandle&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;hFile&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;bytesRead&lt;/span&gt; &lt;span class="o"&gt;!=&lt;/span&gt; &lt;span class="n"&gt;appendedSize&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="k"&gt;delete&lt;/span&gt;&lt;span class="p"&gt;[]&lt;/span&gt; &lt;span class="n"&gt;data&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nb"&gt;nullptr&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;

    &lt;span class="n"&gt;outSize&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;appendedSize&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;data&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Version 2: Memory-mapped (recommended for large files)&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Before declaring the helper function, you should define a structure to store the necessary handles for releasing memory-mapped resources safely:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight cpp"&gt;&lt;code&gt;&lt;span class="k"&gt;struct&lt;/span&gt; &lt;span class="nc"&gt;MappedAppendedData&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="n"&gt;BYTE&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="n"&gt;mappedView&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;nullptr&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;   &lt;span class="c1"&gt;// Pointer to the full mapped view (used in UnmapViewOfFile)&lt;/span&gt;
    &lt;span class="n"&gt;BYTE&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="n"&gt;basePtr&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;nullptr&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;      &lt;span class="c1"&gt;// Offset to where the appended data starts&lt;/span&gt;
    &lt;span class="kt"&gt;size_t&lt;/span&gt; &lt;span class="n"&gt;totalSize&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="n"&gt;HANDLE&lt;/span&gt; &lt;span class="n"&gt;hFile&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;NULL&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="n"&gt;HANDLE&lt;/span&gt; &lt;span class="n"&gt;hMapping&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;NULL&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;};&lt;/span&gt;

&lt;span class="c1"&gt;// Declare an instance of the structure locally&lt;/span&gt;
&lt;span class="n"&gt;MappedAppendedData&lt;/span&gt; &lt;span class="n"&gt;g_mappedAppendedData&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Now, declare the helper function as follows:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight cpp"&gt;&lt;code&gt;&lt;span class="n"&gt;BYTE&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="nf"&gt;LoadAppendedData&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;MappedAppendedData&lt;/span&gt;&lt;span class="o"&gt;&amp;amp;&lt;/span&gt; &lt;span class="n"&gt;mappedDataStruct&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;DWORD&lt;/span&gt;&lt;span class="o"&gt;&amp;amp;&lt;/span&gt; &lt;span class="n"&gt;outSize&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="n"&gt;TCHAR&lt;/span&gt; &lt;span class="n"&gt;exePath&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;MAX_PATH&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt; &lt;span class="p"&gt;};&lt;/span&gt;
    &lt;span class="n"&gt;GetModuleFileName&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;NULL&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;exePath&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;MAX_PATH&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

    &lt;span class="n"&gt;DWORD&lt;/span&gt; &lt;span class="n"&gt;exeSize&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;GetRealExeSize&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;exePath&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

    &lt;span class="n"&gt;HANDLE&lt;/span&gt; &lt;span class="n"&gt;hFile&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;CreateFile&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;exePath&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;GENERIC_READ&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;FILE_SHARE_READ&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nb"&gt;NULL&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;OPEN_EXISTING&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;FILE_ATTRIBUTE_NORMAL&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nb"&gt;NULL&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;hFile&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="n"&gt;INVALID_HANDLE_VALUE&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nb"&gt;nullptr&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

    &lt;span class="n"&gt;HANDLE&lt;/span&gt; &lt;span class="n"&gt;hMapping&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;CreateFileMapping&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;hFile&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nb"&gt;NULL&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;PAGE_READONLY&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nb"&gt;NULL&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;!&lt;/span&gt;&lt;span class="n"&gt;hMapping&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="n"&gt;CloseHandle&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;hFile&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt; &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nb"&gt;nullptr&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;

    &lt;span class="n"&gt;LPBYTE&lt;/span&gt; &lt;span class="n"&gt;pBase&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;LPBYTE&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="n"&gt;MapViewOfFile&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;hMapping&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;FILE_MAP_READ&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;!&lt;/span&gt;&lt;span class="n"&gt;pBase&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="n"&gt;CloseHandle&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;hMapping&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt; &lt;span class="n"&gt;CloseHandle&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;hFile&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt; &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nb"&gt;nullptr&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;

    &lt;span class="n"&gt;LARGE_INTEGER&lt;/span&gt; &lt;span class="n"&gt;fileSize&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;!&lt;/span&gt;&lt;span class="n"&gt;GetFileSizeEx&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;hFile&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="n"&gt;fileSize&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="n"&gt;UnmapViewOfFile&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;pBase&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
        &lt;span class="n"&gt;CloseHandle&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;hMapping&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
        &lt;span class="n"&gt;CloseHandle&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;hFile&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nb"&gt;nullptr&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;

    &lt;span class="n"&gt;DWORD&lt;/span&gt; &lt;span class="n"&gt;appendedSize&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;DWORD&lt;/span&gt;&lt;span class="p"&gt;)(&lt;/span&gt;&lt;span class="n"&gt;fileSize&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;QuadPart&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="n"&gt;exeSize&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;appendedSize&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="n"&gt;UnmapViewOfFile&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;pBase&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
        &lt;span class="n"&gt;CloseHandle&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;hMapping&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
        &lt;span class="n"&gt;CloseHandle&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;hFile&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nb"&gt;nullptr&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;

    &lt;span class="n"&gt;mappedDataStruct&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;mappedView&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;pBase&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="n"&gt;mappedDataStruct&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;basePtr&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;pBase&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;exeSize&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="n"&gt;mappedDataStruct&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;hFile&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;hFile&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="n"&gt;mappedDataStruct&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;hMapping&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;hMapping&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="n"&gt;mappedDataStruct&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;totalSize&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;appendedSize&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

    &lt;span class="n"&gt;outSize&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;appendedSize&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;pBase&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;exeSize&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Then you will need another function to clean up the mapped memory:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Clean Mapped Memory&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight cpp"&gt;&lt;code&gt;&lt;span class="kt"&gt;void&lt;/span&gt; &lt;span class="nf"&gt;FreeMappedAppendedData&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;MappedAppendedData&lt;/span&gt;&lt;span class="o"&gt;&amp;amp;&lt;/span&gt; &lt;span class="n"&gt;data&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;data&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;mappedView&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="n"&gt;UnmapViewOfFile&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;data&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;mappedView&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
        &lt;span class="n"&gt;data&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;mappedView&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;nullptr&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
        &lt;span class="n"&gt;data&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;basePtr&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;nullptr&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;

    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;data&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;hMapping&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="n"&gt;CloseHandle&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;data&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;hMapping&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
        &lt;span class="n"&gt;data&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;hMapping&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;NULL&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;

    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;data&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;hFile&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="n"&gt;CloseHandle&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;data&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;hFile&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
        &lt;span class="n"&gt;data&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;hFile&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;NULL&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;

    &lt;span class="n"&gt;data&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;totalSize&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h3&gt;
  
  
  Step 2: Accessing appended data from code
&lt;/h3&gt;

&lt;p&gt;Now you can declare a pointer to the appended file from anywhere in your code and use it in memory&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;main.cpp&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight cpp"&gt;&lt;code&gt;&lt;span class="cp"&gt;#include&lt;/span&gt; &lt;span class="cpf"&gt;"windows.h"&lt;/span&gt;&lt;span class="cp"&gt;
&lt;/span&gt;
&lt;span class="kt"&gt;void&lt;/span&gt; &lt;span class="nf"&gt;LoadEmbeddedData&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="n"&gt;DWORD&lt;/span&gt; &lt;span class="n"&gt;dataSize&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="k"&gt;const&lt;/span&gt; &lt;span class="n"&gt;BYTE&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="n"&gt;data&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;LoadAppendedData&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;dataSize&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;data&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="c1"&gt;// Use the embedded binary data here&lt;/span&gt;
        &lt;span class="c1"&gt;// e.g., save to disk, decompress, process, etc.&lt;/span&gt;

        &lt;span class="c1"&gt;// When finished, call delete[] to avoid memory leaks&lt;/span&gt;
        &lt;span class="c1"&gt;// delete[] data;&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;If you are using the helper function for memory mapping you will need to specify the instance of the &lt;code&gt;MappedAppendedData&lt;/code&gt; structure to keep track of the system handles and free them later.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;main.cpp&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight cpp"&gt;&lt;code&gt;&lt;span class="cp"&gt;#include&lt;/span&gt; &lt;span class="cpf"&gt;"windows.h"&lt;/span&gt;&lt;span class="cp"&gt;
&lt;/span&gt;
&lt;span class="kt"&gt;void&lt;/span&gt; &lt;span class="nf"&gt;LoadEmbeddedData&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="n"&gt;DWORD&lt;/span&gt; &lt;span class="n"&gt;dataSize&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="k"&gt;const&lt;/span&gt; &lt;span class="n"&gt;BYTE&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="n"&gt;data&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;LoadAppendedData&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;g_mappedAppendedData&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;dataSize&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;data&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="c1"&gt;// Use the embedded binary data here&lt;/span&gt;
        &lt;span class="c1"&gt;// e.g., save to disk, decompress, process, etc.&lt;/span&gt;

        &lt;span class="c1"&gt;// Free up resources when needed with: FreeMappedAppendedData(g_mappedAppendedData);&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h3&gt;
  
  
  Step 3: Appending binary data to executable
&lt;/h3&gt;

&lt;p&gt;After completing the application compilation, open the command prompt in the build folder (Debug/Release).&lt;/p&gt;

&lt;p&gt;Use this command to append any binary file to the application in a command prompt (inside the build output folder):&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight powershell"&gt;&lt;code&gt;&lt;span class="n"&gt;copy&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;/b&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;stub.exe&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;+&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;file.bin&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;final.exe&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;blockquote&gt;
&lt;p&gt;⚠️ &lt;strong&gt;Important&lt;/strong&gt;: It is recommended that you do not overwrite the original &lt;code&gt;.exe&lt;/code&gt;. Always create a copy (&lt;code&gt;final.exe&lt;/code&gt;) with the added data.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h3&gt;
  
  
  Key Notes
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;✅ &lt;strong&gt;Easy loading of concatenated data&lt;/strong&gt; – It uses the Windows API to read data added to an executable, allowing you to manipulate combined files without additional dependencies like MFC.
&lt;/li&gt;
&lt;li&gt;✅ &lt;strong&gt;No dependencies&lt;/strong&gt; — all code uses pure WinAPI.
&lt;/li&gt;
&lt;li&gt;📦 &lt;strong&gt;Works best with a single binary file.&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;⚠️ &lt;strong&gt;Dirty method&lt;/strong&gt; – May break file integrity checks or trigger alerts in security software.&lt;/li&gt;
&lt;li&gt;❌ &lt;strong&gt;Does not support multiple files unless structured properly:&lt;/strong&gt;

&lt;ul&gt;
&lt;li&gt;Use a &lt;strong&gt;container format&lt;/strong&gt; (e.g., ZIP) to store multiple files.&lt;/li&gt;
&lt;li&gt;Alternatively, insert &lt;strong&gt;unique markers&lt;/strong&gt; (magic bytes) between files to identify boundaries.
&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;⚠️ &lt;strong&gt;Appended data must be reattached after each rebuild&lt;/strong&gt; using &lt;code&gt;copy /b&lt;/code&gt;.
&lt;/li&gt;

&lt;li&gt;🔁 &lt;strong&gt;Appended data is not part of the PE format&lt;/strong&gt; — it is placed after the last section of the executable and is ignored by the Windows loader.
This is the only method where embedded data is not stored within the PE structure.&lt;/li&gt;

&lt;/ul&gt;




&lt;p&gt;If you're interested, feel free to check out my other articles where I explore several enhancements and advanced techniques based on this method:&lt;/p&gt;

&lt;h3&gt;
  
  
  🔐 Advanced: Protect the embedded data with digital signature
&lt;/h3&gt;

&lt;p&gt;You can enhance this method by validating the appended data through the executable’s digital signature. This ensures integrity and authenticity of both the executable and the binary file.👉&lt;a href="https://dev.to/stefor07/how-to-append-read-only-binary-data-to-an-executable-and-validate-it-via-digital-signature-487e"&gt;Read: How to Protect Binary Data Appended into an Executable and Validate it with a Digital Signature&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  📦 Concatenate and manage multiple appended files in Win32 executable
&lt;/h3&gt;

&lt;p&gt;I have discovered a fairly simple method to distinguish the various files concatenated together and access them separately. 👉&lt;a href="https://dev.to/stefor07/how-to-easily-distinguish-binary-data-concatenated-to-a-win32-executable-2d4g"&gt;Read: How to Easily Distinguish Multiple Binary Data Files Concatenated to a Win32 Executable &lt;/a&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  Methods Summary
&lt;/h2&gt;

&lt;p&gt;Both methods have their pros and cons, below is the summary table for everything&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;&lt;strong&gt;Method&lt;/strong&gt;&lt;/th&gt;
&lt;th&gt;&lt;strong&gt;Best For&lt;/strong&gt;&lt;/th&gt;
&lt;th&gt;&lt;strong&gt;Pros&lt;/strong&gt;&lt;/th&gt;
&lt;th&gt;&lt;strong&gt;Cons&lt;/strong&gt;&lt;/th&gt;
&lt;th&gt;&lt;strong&gt;Example Use Cases&lt;/strong&gt;&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Method 1: Win32 Resource Files (.rc)&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Native Windows executables where integrated resource handling is preferred&lt;/td&gt;
&lt;td&gt;✅ &lt;strong&gt;No manual compilation&lt;/strong&gt; – VS handles &lt;code&gt;.rc&lt;/code&gt; → &lt;code&gt;.res&lt;/code&gt; conversion&lt;br&gt;✅ &lt;strong&gt;Data is read-only&lt;/strong&gt; (safe from modification)&lt;br&gt;✅ &lt;strong&gt;Supports any binary format&lt;/strong&gt;
&lt;/td&gt;
&lt;td&gt;❌ &lt;strong&gt;Possible external changes&lt;/strong&gt; – Resources can be replaced by external tools  ⚠️ &lt;strong&gt;Large resources warning&lt;/strong&gt; - Binary resources are memory‑mapped on demand and do not consume RAM until accessed. However, reading very large resources entirely at once can significantly increase physical RAM usage. Consider streaming or partial access methods to efficiently handle large data.&lt;/td&gt;
&lt;td&gt;Embedding configuration files, certificates, or game assets; Storing default data for single-file apps&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Method 2: Manual Hex Offset Array&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Precise binary embedding without compiler dependencies&lt;/td&gt;
&lt;td&gt;✅ &lt;strong&gt;Manual binary precision&lt;/strong&gt; – Directly embeds binary data into source code&lt;br&gt;✅ &lt;strong&gt;Data is read-only&lt;/strong&gt;&lt;br&gt;✅ &lt;strong&gt;Immutable data&lt;/strong&gt;&lt;br&gt;✅ &lt;strong&gt;No additional dependencies&lt;/strong&gt; &lt;br&gt;✅ &lt;strong&gt;Custom section alignment possible&lt;/strong&gt;
&lt;/td&gt;
&lt;td&gt;❌ &lt;strong&gt;Manual updates required&lt;/strong&gt; – Must regenerate offsets and recompile&lt;br&gt;❌ &lt;strong&gt;Avoid too large files&lt;/strong&gt; – Large files reduce readability and cause compilation slowdowns&lt;/td&gt;
&lt;td&gt;Embedding small binary data (e.g., logos, icons, or small assets) for small projects&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Method 3: COFF Object Binary Linking&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Windows executables (MSVC/MinGW) requiring direct binary embedding&lt;/td&gt;
&lt;td&gt;✅ &lt;strong&gt;Efficient binary embedding&lt;/strong&gt; – Converts binary into a COFF object for direct linking&lt;br&gt;✅ &lt;strong&gt;Symbol consistency&lt;/strong&gt; – Same file name results in identical symbols&lt;br&gt;✅ &lt;strong&gt;Custom section alignment possible&lt;/strong&gt;
&lt;/td&gt;
&lt;td&gt;❌ &lt;strong&gt;Manual updates required&lt;/strong&gt; – Regenerate the COFF and recompile for updates&lt;br&gt;❌ &lt;strong&gt;External tool dependency&lt;/strong&gt; – Requires &lt;code&gt;bin2obj&lt;/code&gt; utility or manual symbol creation&lt;/td&gt;
&lt;td&gt;Embedding large binary files in executables, such as libraries or other large assets&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Method 4: Binary Concatenation with &lt;code&gt;copy /b&lt;/code&gt;&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Self-extracting programs, or when no external files are allowed&lt;/td&gt;
&lt;td&gt;✅ &lt;strong&gt;Easy loading of concatenated data&lt;/strong&gt; – No dependencies like MFC&lt;br&gt;✅ &lt;strong&gt;Portable&lt;/strong&gt; – Doesn’t need additional external libraries&lt;br&gt;✅ &lt;strong&gt;Fast to implement&lt;/strong&gt; – Simple concatenation command&lt;/td&gt;
&lt;td&gt;❌ &lt;strong&gt;Manual updates may be required&lt;/strong&gt; – Every time you change the binary data you will need to re-run the &lt;code&gt;copy /b&lt;/code&gt; command every time after compilation&lt;br&gt;⚠️ &lt;strong&gt;Dirty method&lt;/strong&gt; – May break file integrity checks or trigger alerts in security software.&lt;/td&gt;
&lt;td&gt;Embedding data like ZIP files, DLLs, or other large data into executables for self-extraction&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h2&gt;
  
  
  Performance Comparison
&lt;/h2&gt;

&lt;p&gt;Here’s a comprehensive performance and usability comparison of the four binary embedding methods. This will help you determine the most suitable approach based on your project’s specific needs (e.g. platform, file size, performance, deployment constraints):&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Method&lt;/th&gt;
&lt;th&gt;Binary Size Impact&lt;/th&gt;
&lt;th&gt;Load Time&lt;/th&gt;
&lt;th&gt;Memory Usage&lt;/th&gt;
&lt;th&gt;Compilation Time&lt;/th&gt;
&lt;th&gt;Best Use Case&lt;/th&gt;
&lt;th&gt;Advantages&lt;/th&gt;
&lt;th&gt;Disadvantages&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Resource (.rc)&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;≈ +100%&lt;/td&gt;
&lt;td&gt;Fast&lt;/td&gt;
&lt;td&gt;
&lt;strong&gt;Medium&lt;/strong&gt; (memory‑mapped; OS lazy loads)&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;Medium&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Native Windows applications with small/medium assets&lt;/td&gt;
&lt;td&gt;Automatic lazy loading; no manual load code required&lt;/td&gt;
&lt;td&gt;Windows-specific tooling required; limited portability&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Hex Array&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;+200–300%&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;Fastest&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;
&lt;strong&gt;High&lt;/strong&gt; (full static allocation in &lt;code&gt;.data&lt;/code&gt;)&lt;/td&gt;
&lt;td&gt;
&lt;strong&gt;Slow&lt;/strong&gt; (especially for large arrays)&lt;/td&gt;
&lt;td&gt;Very small files when portability is key&lt;/td&gt;
&lt;td&gt;Highly portable; no external dependencies&lt;/td&gt;
&lt;td&gt;Large RAM usage; huge increase in binary size&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;COFF Linking&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;≈ +100%&lt;/td&gt;
&lt;td&gt;Fast&lt;/td&gt;
&lt;td&gt;
&lt;strong&gt;Medium&lt;/strong&gt; (data in &lt;code&gt;.rdata&lt;/code&gt;/&lt;code&gt;.data&lt;/code&gt;; OS may memory‑map)&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;Fast&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Medium to large assets; professional development builds&lt;/td&gt;
&lt;td&gt;Clean separation of data and code; efficient loading&lt;/td&gt;
&lt;td&gt;Less automatic than resources; requires linker support&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Binary Concatenation&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;≈ +100%&lt;/td&gt;
&lt;td&gt;Medium&lt;/td&gt;
&lt;td&gt;
&lt;strong&gt;Low&lt;/strong&gt; (supports streaming / partial reads)&lt;/td&gt;
&lt;td&gt;
&lt;strong&gt;Instant&lt;/strong&gt; (post-build step)&lt;/td&gt;
&lt;td&gt;Large files, self‑extracting apps, installers&lt;/td&gt;
&lt;td&gt;Scales to very large assets; simple build step; streaming-friendly&lt;/td&gt;
&lt;td&gt;Requires runtime code to parse/pop out data; less seamless than linker-based methods&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h3&gt;
  
  
  🔍 In-Depth: Memory Usage of the Four Methods
&lt;/h3&gt;

&lt;p&gt;Memory usage varies significantly between these four methods, especially in terms of &lt;em&gt;when&lt;/em&gt; and &lt;em&gt;how&lt;/em&gt; the binary data is loaded into memory.&lt;/p&gt;

&lt;p&gt;The &lt;strong&gt;Resource (.rc)&lt;/strong&gt; and &lt;strong&gt;Hex Array&lt;/strong&gt; methods are generally the least memory-efficient. With &lt;code&gt;.rc&lt;/code&gt; files, binary resources are embedded into the &lt;code&gt;.rsrc&lt;/code&gt; section of the executable. Although the OS technically loads resources on demand, the entire resource is usually mapped into memory when accessed. This becomes problematic with medium or large files, as the whole content must be held in RAM to be usable.&lt;/p&gt;

&lt;p&gt;The &lt;strong&gt;Hex Array&lt;/strong&gt; method is even more memory-hungry. Here, the binary data is hardcoded into the source as a static byte array, which is then stored in the &lt;code&gt;.data&lt;/code&gt; section of the executable. This data is &lt;em&gt;always&lt;/em&gt; loaded into memory when the program starts — even if it’s never used at runtime. This leads to unnecessary memory consumption and should be avoided unless the binary file is very small (e.g. under 50–100KB).&lt;/p&gt;

&lt;p&gt;In contrast, &lt;strong&gt;COFF linking&lt;/strong&gt; is significantly more efficient.&lt;br&gt;
Binary data is linked into the executable as an object file (&lt;code&gt;.obj&lt;/code&gt; or &lt;code&gt;.o&lt;/code&gt;), and, thanks to the operating system’s demand paging, only the portions of the data that are actually accessed are mapped into physical memory.&lt;br&gt;
This provides a practical form of lazy loading at the OS level, making COFF linking an excellent option for applications that handle large or multiple binary assets but don’t need them all resident in memory at once.&lt;/p&gt;

&lt;p&gt;Finally, &lt;strong&gt;Binary Concatenation&lt;/strong&gt; is by far the most memory-efficient method. In this approach, the binary data is appended directly to the end of the executable file. The program can read this data at runtime using standard file I/O (e.g. via &lt;code&gt;argv[0]&lt;/code&gt; or offset reads). Nothing is loaded into memory by default — it’s entirely under your control. This makes it ideal for working with large files or streamed content, especially in scenarios where memory constraints are critical.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Summary:&lt;/strong&gt; If minimizing memory usage is a top priority, &lt;em&gt;Binary Concatenation&lt;/em&gt; offers the best control and lowest footprint, followed by &lt;em&gt;COFF Linking&lt;/em&gt;. The &lt;em&gt;Hex Array&lt;/em&gt; and &lt;em&gt;.rc&lt;/em&gt; approaches should be reserved for small binary files or cases where convenience outweighs efficiency.&lt;/p&gt;

&lt;h3&gt;
  
  
  🧠 Detailed Performance Analysis
&lt;/h3&gt;

&lt;p&gt;Each embedding method comes with trade-offs in terms of performance, memory, and developer experience.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Windows resource files (.rc)&lt;/strong&gt; (via &lt;code&gt;.rc&lt;/code&gt; → &lt;code&gt;.res&lt;/code&gt;) Resources loaded via &lt;code&gt;LoadResource&lt;/code&gt; and &lt;code&gt;LockResource&lt;/code&gt;are usually mapped entirely into the process's virtual memory space. While this generally works well for small assets such as icons and strings, large binary resources (fonts, images, audio, video) can lead to increased memory usage and potential startup delays, since the entire resource is accessible in memory at once. For very large assets, dynamic or streaming loading approaches may be more memory-efficient.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Hex Array&lt;/strong&gt; is the fastest at runtime because the binary data is already part of the process image — statically embedded into the &lt;code&gt;.data&lt;/code&gt; segment of the executable. Access is instantaneous and requires no file I/O. However, this convenience comes at a heavy cost: the source code size balloons due to the conversion of binary data into hexadecimal (text-based) representation. This can dramatically increase compilation time — especially when embedding files over 1MB — and also leads to large executable sizes, often 2–3× the original binary. It's best used for very small and frequently accessed assets, where portability and startup speed are more important than scalability.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;COFF linking&lt;/strong&gt; is widely regarded as a professional approach in C/C++ projects. Binary data is compiled into object files, which are then linked into the application like any other static symbol. This method results in much smaller size overhead compared to hex arrays and allows for clean, symbol-based access to the data.&lt;/p&gt;

&lt;p&gt;Because the binary data resides in a proper section of the executable, it benefits from the operating system’s normal &lt;strong&gt;demand paging&lt;/strong&gt; and &lt;strong&gt;memory mapping&lt;/strong&gt; mechanisms, meaning pages are loaded only when accessed. This makes it well-suited for large files or multi-resource applications.&lt;/p&gt;

&lt;p&gt;It does require additional build configuration (e.g., using &lt;code&gt;ld&lt;/code&gt;, &lt;code&gt;objcopy&lt;/code&gt;, or &lt;code&gt;llvm-objcopy&lt;/code&gt;), but offers excellent runtime performance and efficient memory use.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Binary Concatenation&lt;/strong&gt;, the most flexible and lightweight method, deserves special attention. Unlike other approaches, it has zero impact on compilation time because the binary data is not embedded during the build process; instead, it is appended to the executable as a post-build step (for example via a script or simple &lt;code&gt;cat&lt;/code&gt;/&lt;code&gt;copy&lt;/code&gt; operations). At runtime, the application can open its own executable file and access the appended data using standard file I/O, giving full control over how much data is loaded and when. This enables efficient streaming, chunked reads, or even memory-mapped access, resulting in minimal RAM usage. The approach is particularly well suited for bundling large files such as compressed archives, installation data, language packs, or media resources, without increasing the executable’s memory footprint or requiring recompilation when the files change. The main trade-off is increased deployment complexity, as the application must manage file offsets and maintain a dedicated post-build integration step. Nevertheless, for installer executables, self-extracting archives, and other memory-sensitive or large-scale deployment tools, Binary Concatenation offers an excellent balance of flexibility, performance, and resource efficiency.&lt;/p&gt;

&lt;h3&gt;
  
  
  ✅ Final Thoughts
&lt;/h3&gt;

&lt;p&gt;Choosing the right embedding method depends on your priorities: &lt;strong&gt;ease of integration&lt;/strong&gt;, &lt;strong&gt;memory efficiency&lt;/strong&gt;, &lt;strong&gt;build complexity&lt;/strong&gt;, or &lt;strong&gt;runtime performance&lt;/strong&gt;. For small, native Windows applications, &lt;code&gt;.rc&lt;/code&gt; resources are quick and familiar. For cross-platform use with tiny binaries, Hex Arrays offer simplicity and speed. If you're embedding large assets and care about memory usage and maintainability, &lt;strong&gt;COFF Linking&lt;/strong&gt; is the most professional choice. But if you want complete control with minimal memory overhead — and can manage a simple post-build step — &lt;strong&gt;Binary Concatenation&lt;/strong&gt; is the most flexible and scalable solution. There's no one-size-fits-all answer, but understanding these trade-offs will help you pick the method that best fits your specific use case.&lt;/p&gt;

&lt;h2&gt;
  
  
  Conclusion
&lt;/h2&gt;

&lt;p&gt;In this article, we've covered &lt;strong&gt;four distinct methods&lt;/strong&gt; for embedding binary data into a Win32 executable, each offering its own strengths and trade-offs:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Method 1: Win32 Resource Files (.rc)&lt;/strong&gt;: Ideal for straightforward integration with Windows resource handling. Best for applications where the embedded data does not change often and is part of the resource management system.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Method 2: Manual Hex Offset Array&lt;/strong&gt;: Provides precise control over the embedded data but requires manual management of offsets. Best suited for small to medium binary data embedded directly within the source code.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Method 3: COFF Object Binary Linking&lt;/strong&gt;: A more sophisticated method for embedding large binary objects, ideal for developers using MSVC or MinGW who need to efficiently manage binary assets.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Method 4: Binary Concatenation with &lt;code&gt;copy /b&lt;/code&gt;&lt;/strong&gt;: A "dirty" but quick solution for appending data directly to an executable. This method is great for self-extracting applications but requires careful handling of offsets and file sizes.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Best Practices &amp;amp; Recommendations
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Keep Your Executable Small&lt;/strong&gt;: While embedding binary data can make your application self-contained, avoid adding too much data to prevent bloating the executable and affecting performance.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Use Proper Memory Management&lt;/strong&gt;: Always ensure to free any allocated memory once you're done using the embedded data to prevent memory leaks.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Consider Security&lt;/strong&gt;: If you're planning to hide sensitive data (e.g., encryption keys), be mindful that these methods are not inherently secure and can be easily extracted by someone with access to the executable. You may want to consider additional security measures, like encryption.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Avoid loading very large files entirely into memory&lt;/strong&gt;: For large binaries (e.g. ZIP archives, videos, DLLs), consider &lt;strong&gt;block processing (streaming)&lt;/strong&gt; or &lt;strong&gt;memory mapping&lt;/strong&gt; (&lt;code&gt;CreateFileMapping&lt;/code&gt; + &lt;code&gt;MapViewOfFile&lt;/code&gt;) instead of allocating a huge buffer, this can reduce RAM usage and make everything more performant&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Final Thoughts
&lt;/h3&gt;

&lt;p&gt;Each of these methods is suitable for different scenarios, and the best choice depends on your specific needs: portability, ease of use, and how frequently the embedded data needs to be updated. For quick prototyping or simple use cases, &lt;code&gt;copy /b&lt;/code&gt; might be the easiest choice, but for more robust applications, using Win32 resource files or manual hex offsets could be more effective.&lt;/p&gt;

&lt;p&gt;Feel free to experiment with these methods and choose the one that fits best with your project goals!&lt;/p&gt;

&lt;h3&gt;
  
  
  Contributions &amp;amp; Questions
&lt;/h3&gt;

&lt;p&gt;If you have any suggestions, improvements, or questions, feel free to contribute or reach out! I'm open to discussing different techniques and ways to enhance the methods presented here.&lt;/p&gt;

&lt;p&gt;Happy coding and stay creative! 🎉&lt;/p&gt;

</description>
      <category>programming</category>
      <category>cpp</category>
      <category>c</category>
      <category>win32</category>
    </item>
  </channel>
</rss>
