Part - 4 (Continue)

Now, we have both the header and content data file, and it is the time to merge this 2 files into a single file before proceed to compress it using the Zlib* algorithm.

PHP Code:
// Begin to merge the header and data file
if (TRUE == MergeSelfExtractData (hWnd))
{
    
// Compress the current data file to the user define location & 
    // Notify user about the process is completed
    
if (== Compress(szTmpBinFile1szTmpBinFile3))
    {
        
// Proceed to spawn the SetupEx.exe
        
        // Proceed to inject the merge data file into the spawned SetupEx.exe
    
}
}
else
    
// Notify user about the error
    
MessageBox(hWnd"Fail to compress the self-extract file!"APP_TITLEMB_OK MB_ICONSTOP); 
PHP Code:
BOOL MergeSelfExtractData (HWND hWnd)
{
    
UPDATEINFO    ui    = {NULL};

    
BOOL       bResult        FALSE;
    
    
LPBYTE     lpData         NULL;
    
HANDLE     hFile          NULL;
    
DWORD      dwSize         0;
    
DWORD      dwByteWrite    0;
    
DWORD      dwByteRead     0;

    
__try
    
{
        
// STAGE #1
        
{
            
// Read the current binary file data
            
hFile CreateFile(szTmpBinFile2,
                               
GENERIC_READ,
                               
FILE_SHARE_READ,
                               
NULL,
                               
OPEN_EXISTING,
                               
FILE_ATTRIBUTE_NORMAL,
                               
NULL);
            
// Check the return handle value
            
if (NULL != hFile && INVALID_HANDLE_VALUE != hFile)
            {
                
// Get the current file size
                
dwSize GetFileSize(hFile0);
                
// Allocate local data buffer
                
lpData = (LPBYTE)LocalAlloc(LPTRdwSize);
                
// Reset local data buffer
                
ZeroMemory(lpDatadwSize);
                
                
// Move the file pointer to the begining
                
SetFilePointer(hFile00FILE_BEGIN);
                
// Read the binary data
                
ReadFile(hFilelpDatadwSize, &dwByteReadNULL);
            }

            
// Close the open file handle
            
if (NULL != hFile) {CloseHandle(hFile);}
            
hFile NULL;
        }


        
// STAGE #2
        // Open the existing temporary data file
        
hFile CreateFile(szTmpBinFile1,
                           
GENERIC_WRITE,
                           
FILE_SHARE_WRITE,
                           
NULL,
                           
OPEN_EXISTING,
                           
FILE_ATTRIBUTE_NORMAL,
                           
NULL);

        
// Check the return handle value
        
if (NULL != hFile && INVALID_HANDLE_VALUE != hFile)
        {
            
// Setup the UPDATEINFO structure
            
ui.dwFileCount dwFileCount;
            
            
// Move the file pointer
            
SetFilePointer(hFile00FILE_BEGIN);
            
// Write the total binary data file being included
            
WriteFile(hFile,
                      &
ui,
                      
sizeof(UPDATEINFO),
                      &
dwByteWrite,
                      
NULL);

            
// Move the file pointer
            
SetFilePointer(hFile00FILE_END);
            
// Append the actual binary data from the temp file
            
WriteFile(hFile,
                      
lpData,
                      
dwSize,
                      &
dwByteWrite,
                      
NULL);

            
// Set return value
            
bResult TRUE;
        }
        else
            
// Set return value
            
bResult FALSE;


    }
    
__except (EXCEPTION_EXECUTE_HANDLER)
    {
        
// PUT YOUR ERROR HANDLING CODE HERE

        // Set default return value
        
bResult FALSE;
    }

    
// Release the allocated data buffer
    
if (NULL != lpData){LocalFree((LPBYTE)lpData);}
    
lpData NULL;

    
// Close the open file handle
    
if (NULL != hFile) {CloseHandle(hFile);}
    
hFile NULL;
    
    
// Return local result
    
return bResult;