// 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;
}
#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;
}