文件捆绑

来源:互联网 发布:整套python教学视频 编辑:程序博客网 时间:2024/04/27 16:42
// Filesize3.cpp : Defines the entry point for the console application.


#include "stdafx.h"
#include <Windows.h>
#include <iostream>
using namespace std;
#include <sys/types.h>
#include <sys/stat.h>

#define FINDFLAG 0x12345678
//定义一个结构,fileFlag为全局变量,用于记录可执行文件的长度
struct FILE_FLAG
{
    UINT nFindFlag;//查找标识
    UINT nFileLen;//文件长度
} fileFlag = {FINDFLAG, 0};


char* TCHAR2char(TCHAR* tchStr) 

    int iLen = 2*wcslen(tchStr);//CString,TCHAR汉字算一个字符,因此不用普通计算长度 
    char* chRtn = new char[iLen+1];
    wcstombs(chRtn,tchStr,iLen+1);//转换成功返回为非负值 
    return chRtn; 



int _tmain(int argc, _TCHAR* argv[])
{
    OutputDebugString(L"**********File3*********** \n");


    char szFileFullPath[MAX_PATH],szProcessName[MAX_PATH];  
    ::GetModuleFileNameA(NULL, szFileFullPath, MAX_PATH);//获取文件路径


    cout<<"文件名称:"<<szFileFullPath<<endl;


    char szFile1[MAX_PATH] = "0";
    strcpy(szFile1,szFileFullPath);
    int len = strlen(szFileFullPath);
    szFile1[len-5] = '1';
    cout<<"文件1名称:"<<szFile1<<endl;


    char szFile2[MAX_PATH] = "0";
    strcpy(szFile2,szFileFullPath);
    szFile2[len-5] = '2';
    cout<<"文件2名称:"<<szFile2<<endl;


    char Final[MAX_PATH] = "0";
    strcpy(Final,szFileFullPath);
    Final[len-5] = '3';
    cout<<"文件Final名称:"<<Final<<endl;


    FILE* pflSelf = NULL;//可执行文件自身
    FILE* pflFinal = NULL;//最终生成的可执行文件
    FILE* pflFirst = NULL;//第一个捆绑的文件
    FILE* pflSecond = NULL;//第二个捆绑的文件
    struct _stat fileState;
    //获取自身的可执行文件信息


    char* pfilepath = TCHAR2char(argv[0]); //pflSelf filesize3.exe
    char  ChFilePath[MAX_PATH];
    strcpy(ChFilePath,pfilepath);
    _stat(ChFilePath, &fileState);


    //获取文件长度
    DWORD dwFileLen = fileState.st_size;
    fileFlag.nFileLen = dwFileLen;


    //为文件分配缓冲区
    BYTE* pFileBuffer = (BYTE*) malloc(dwFileLen);
    
    //打开当前文件
    pflSelf = fopen(ChFilePath, "rb"); 
    if (pflSelf == NULL)
    {
        MessageBox(NULL, L"打开自身文件失败!",L"提示",MB_OK);
        return 0 ;
    }
    //读取文件
    DWORD dwRead = fread(pFileBuffer, sizeof(char), dwFileLen, pflSelf);
    fclose(pflSelf);
    if (dwRead != dwFileLen)
    {
        MessageBox(NULL,L"读取自身文件发生错误!", L"提示",MB_OK);
        return 0;
    }


    //写入文件的长度
    UINT nFlag  = FINDFLAG;


    //在可执行文件中查找FINDFLAG常量值,目的是定位到全局变量fileFlag的数据存储位置
    int i=0;
    for(i=0; i<dwFileLen-sizeof(UINT); i+=sizeof(UINT))
    {
        //在自身可执行文件中查找FINDFLAG即0x12345678,因为全局变量fileFlag中包含有0x12345678
        int j=0;
        for(j=0; j<sizeof(UINT); j++)
        {
            if (pFileBuffer[i+j] != ((BYTE*)&nFlag)[j])
                break;
            else
            {
                continue;
            }
        }
        if (j == sizeof(UINT)) //在可执行文件中发现了0x12345678数据
        {
            //修改可执行文件中fileFlag的数据存储位置上的文件长度数据
            memcpy(pFileBuffer+i, &fileFlag, sizeof(FILE_FLAG));
            break;
        }
    }


    if (i >= dwFileLen-sizeof(UINT)) //在可执行文件中没有发现0x12345678数据
    {
        free(pFileBuffer);
        MessageBox(NULL,L"定义可执行文件错误!", L"提示",MB_OK);
        return 0;
    }


    //开始写入第一个可执行文件
    if (_stat(szFile1, &fileState) != 0 || fileState.st_size ==0)
    {
        free(pFileBuffer);
        MessageBox(NULL,L"读取第一个绑定的文件失败!", L"提示",MB_OK);
        return 0;
    }
    //创建最终的可执行文件
    pflFinal = fopen(Final, "wb");
    if (pflFinal == NULL)
    {
        free(pFileBuffer);
        MessageBox(NULL,L"创建可执行文件失败!", L"提示",MB_OK);
        return 0;
    }


    //1. 首先写入file1自身文件到最终的可执行文件中
    fwrite(pFileBuffer, sizeof(char), dwFileLen, pflFinal);


    //-----------------------------------------------------------
    //2. 读取第一个可执行文件的大小...............
    if (_stat(szFile1, &fileState) != 0 || fileState.st_size ==0)
    {
        free(pFileBuffer);
        MessageBox(NULL,L"读取第一个绑定的文件失败!",L"提示",MB_OK);
        return 0;
    }


    //3. 打开第一个可执行文件
    pflFirst = fopen(szFile1, "rb");
    if (pflFirst == NULL)
    {
        fclose(pflFinal);
        //删除生成的文件


        free(pFileBuffer);
        MessageBox(NULL,L"打开第一个绑定的文件失败!", L"提示",MB_OK);
        return 0;
    }


    //3. 写入第一个要捆绑的文件长度
    fwrite(&fileState.st_size, sizeof(char), sizeof(fileState.st_size), pflFinal);


    //4. 将第一个文件写入到最终的可执行文件中。
    free(pFileBuffer);
    pFileBuffer = (BYTE*)malloc(fileState.st_size);
    fread(pFileBuffer, sizeof(char), fileState.st_size, pflFirst);
    fwrite(pFileBuffer, sizeof(char), fileState.st_size, pflFinal);
    fclose(pflFirst);
    free(pFileBuffer);


    //----------------------------------------------------------------
    //5. 写入第二个要捆绑的文件。
    if (_stat(szFile2, &fileState) != 0 || fileState.st_size ==0)
    {
        MessageBox(NULL,L"读取第二个绑定的文件失败!", L"提示",MB_OK);
        return 0;
    }
    pflSecond = fopen(szFile2, "rb");
    if (pflSecond == NULL)
    {
        MessageBox(NULL,L"打开第二个绑定的文件失败!", L"提示",MB_OK);
        return 0;
    }


    //6. 写入第2个要捆绑的文件长度。
    fwrite(&fileState.st_size, sizeof(char), sizeof(fileState.st_size), pflFinal);


    //7. 将第2个文件写入到最终的可执行文件中。
    pFileBuffer = (BYTE*)malloc(fileState.st_size);
    fread(pFileBuffer, sizeof(char), fileState.st_size, pflFirst);
    fwrite(pFileBuffer, sizeof(char), fileState.st_size, pflFinal);
    fclose(pflSecond);
    free(pFileBuffer);
    fclose(pflFinal);

    MessageBox(NULL,L"绑定完成!",L"提示",MB_OK);
    return 0;
}
0 0
原创粉丝点击