VS2005控制台程序修改nb0文件
VS2005控制台程序修改nb0文件
我们要实现的功能就是通过CMD传递进来的值来在nb0文件末尾增加版本信息,新建控制台程序,自动生成的main函数如下,默认的代码非常简单:
int _tmain(int argc, _TCHAR * argv[])
{
return0;
}
为了实现此功能,我们发现有两种实现的办法,差别在于使用TCHAR还是char,下面分别给出这两种方式的实现代码,这两种实现方式CMD端传递的参数都一样,如下:
图1
1. 采用TCHAR
(1) main函数
int _tmain(int argc, _TCHAR * argv[])
{
TCHAR*pImageVersion;
TCHAR*pFileDir;
TCHAR*pFileName; pFileDir= argv[1];
pFileName= argv[2];
pImageVersion= argv[3]; PIMG_CHECK_VERSION pImg_check_version; printf("argc= %d\r\n",argc); for(inti = 0; i < argc; i++)
{
printf("argv[%d]:%s\r\n",i,argv[i]);
} wcscpy(pImg_check_version->ImageVersion,pImageVersion); AddDataToNb0File(pFileDir,pFileName,pImg_check_version);
return0;
}
(2) AddDataToNb0File
BOOL AddDataToNb0File(TCHAR *pFileDir,TCHAR *pFileName, PIMG_CHECK_VERSION pCheckVersion)
{
BOOLret = FALSE;
TCHARtFilePath[FILE_NAME_LEN];
DWORDdwSize; memset((PBYTE)tFilePath,0,sizeof(tFilePath));
wcscpy(tFilePath,pFileDir);
wcscat(tFilePath,pFileName); HANDLEhfile = CreateFile(tFilePath, GENERIC_READ | GENERIC_WRITE, FILE_SHARE_READ, 0,OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, 0);
if(hfile== INVALID_HANDLE_VALUE)
{
printf("AddDataToNb0File()GetLastError=0x%x\r\n",GetLastError());
gotoExit;
} DWORDFileSize = GetFileSize (hfile, NULL) ; if(FileSize == 0xFFFFFFFF)
{
gotoExit;
} SetFilePointer(hfile,(FileSize- sizeof(IMG_CHECK_VERSION)),NULL,FILE_BEGIN);
WriteFile(hfile,(PBYTE)pCheckVersion,sizeof(IMG_CHECK_VERSION),&dwSize,NULL);
SetFilePointer(hfile,FileSize,NULL,FILE_BEGIN);
SetEndOfFile(hfile); ret= TRUE; Exit:
if(hfile!= INVALID_HANDLE_VALUE)
{
CloseHandle(hfile);
}
returnret;
}
(3) IMG_CHECK_VERSION结构体的定义
typedef struct _IMG_CHECK_VERSION_
{
TCHARImageVersion[VERSION_LEN];
}IMG_CHECK_VERSION,*PIMG_CHECK_VERSION;
见main函数的printf函数,我们的本意是输出传递进来参数的所有字符串内容的,但自己的输出却是:
图2
可见只输出对应参数的第一个字符,比如argv[2]是传递“stepldr.nb0”进来的,但只输出s,虽然我们想要的功能能够达到,但是调试起来如果想看这些信息比较不方便。
修改之前stepldr.nb0文件最后一段全部为0,我们用UltraEdit文件打开如下:
图3
修改之后如下:
图4
由图4可知stepldr.nb0从0x1ff8到0x1fff这8个字节的数据由之前的0x00改为0x31、0x00、0x32、0x00、0x33、0x00、0x34、0x00,这对应于图1中传递进来的1234,为什么1个字符会占用两个字节呢?是因为我们的IMG_CHECK_VERSION结构体成员ImageVersion类型是TCHAR(相当于wchar_t),是宽字符,也就是说一个字符占用2个字节。
2. 采用char
(1) main函数
int main(int argc, char * argv[])
{
char*pImageVersion;
char*pFileDir;
char*pFileName; pFileDir= argv[1];
pFileName= argv[2];
pImageVersion= argv[3]; PIMG_CHECK_VERSION pImg_check_version; printf("argc= %d\r\n",argc); for(inti = 0; i < argc; i++)
{
printf("argv[%d]:%s\r\n",i,argv[i]);
} strcpy(pImg_check_version->ImageVersion,pImageVersion);
AddDataToNb0File(pFileDir,pFileName,pImg_check_version); return0;
}
(2) AddDataToNb0File函数
BOOL AddDataToNb0File(char *pFileDir, char*pFileName, PIMG_CHECK_VERSION pCheckVersion)
{
BOOLret = FALSE;
chartFilePath[FILE_NAME_LEN];
DWORDdwSize; memset((PBYTE)tFilePath,0,sizeof(tFilePath));
strcpy(tFilePath,pFileDir);
strcat(tFilePath,pFileName); DWORDdwFileDirNum = MultiByteToWideChar (CP_ACP, 0, tFilePath, -1, NULL, 0);
wchar_t*pFileDirAndName = new wchar_t[dwFileDirNum]; MultiByteToWideChar(CP_ACP, 0, tFilePath, -1, pFileDirAndName, dwFileDirNum); printf("filedir and name : %s,dwFileDirNum=%d \r\n",pFileDirAndName,dwFileDirNum); HANDLEhfile = CreateFile(pFileDirAndName, GENERIC_READ | GENERIC_WRITE,FILE_SHARE_READ, 0, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, 0);
//HANDLEhfile = CreateFile((LPCTSTR)tFilePath, GENERIC_READ |GENERIC_WRITE, FILE_SHARE_READ, 0, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, 0);
if(hfile== INVALID_HANDLE_VALUE)
{
printf("AddDataToNb0File()GetLastError=0x%x\r\n",GetLastError());
gotoExit;
} DWORDFileSize = GetFileSize (hfile, NULL) ; if(FileSize == 0xFFFFFFFF)
{
gotoExit;
} SetFilePointer(hfile,(FileSize- sizeof(IMG_CHECK_VERSION)),NULL,FILE_BEGIN);
WriteFile(hfile,(PBYTE)pCheckVersion,sizeof(IMG_CHECK_VERSION),&dwSize,NULL);
SetFilePointer(hfile,FileSize,NULL,FILE_BEGIN);
SetEndOfFile(hfile); ret= TRUE; Exit:
if(hfile!= INVALID_HANDLE_VALUE)
{
CloseHandle(hfile);
}
returnret;
}
这里要注意的是CreateFile函数的第1个参数类型要求是LPCTSTR,如果我们直接采用(LPCTSTR)tFilePath强制类型转换,GetLastError()返回值是2(ERROR_FILE_NOT_FOUND),表示找不到文件,采用MultiByteToWideChar函数转换为宽字符后就OK了。
(3) IMG_CHECK_VERSION结构体
typedef struct _IMG_CHECK_VERSION_
{
charImageVersion[VERSION_LEN];
}IMG_CHECK_VERSION,*PIMG_CHECK_VERSION;
采用这样的方式修改stepldr.nb0后,如下:
图5
可见char占用一个字节,综合比较具体是采用哪种,根据需要来选择。
遇到一个很奇怪的问题,我在A电脑上用VS2005创建的这个控制台程序,编译出来后在B电脑上运行是提示不能运行这个程序,然后我在B电脑上编译A电脑的这个工程,重新生成控制台程序就可以,然后我用B电脑上编译的在A电脑上也OK,目前不知道原因,先备注下。
VS2005控制台程序修改nb0文件的更多相关文章
- Python第十天 print >> f,和fd.write()的区别 stdout的buffer 标准输入 标准输出 从控制台重定向到文件 标准错误 重定向 输出流和输入流 捕获sys.exit()调用 optparse argparse
Python第十天 print >> f,和fd.write()的区别 stdout的buffer 标准输入 标准输出 从控制台重定向到文件 标准错误 重定向 输出流和 ...
- 用VS2005编译生成Lua库文件和解释器
TMD,本来很简单的东西,网上说的乱七八糟,说的也不明白,大家抄来抄去,估计都不自己实践的..花了半个下午研究了一下,总结一下. 1)下载lua工程文件,地址为http://www.lua.org/f ...
- ssm框架之配置日志系统打印到控制台与指定文件
前提: 0:ssm框架已经搭建并且成功运行 1.maven环境配置成功 2.tomcat配置成功,并且配置本机的tomcat环境变量 内容: 0.导入所需要的jar包 <!-- 配置log4j日 ...
- Config文件的使用:通过程序修改Config文件
对于config文件,一般情况下都是使用ConfigurationManager加载,然后通过读取相应节点的值来获取想要的数据,但是,有时候需要修改config文件的值,这时候就用到了OpenExeC ...
- 日志输出:控制台和log文件输出日志
self_log.py 中 import os import logging import time # 如果日志文件夹不存在,则创建 log_dir = "log" # 日志存放 ...
- Visual studio C++ 之空控制台工程添加文件并解决头文件包含问题
背景 之前都是用的MFC已搭好框架,今天想自己从零开始完成添加文件,编译,并解决文件包含问题,在此做个记录. 正文 首先创建一个Win32控制台应用程序,不要直接点击完成,而是点击下一步,然后选择空项 ...
- Java代码工具箱之控制台输出重定向_控制台输出到文件
1. 情形:有时候控制台输出太多,在MyEclipse显示不全. 2. 说明:本代码只会重定向 system.out 的内容, error及其它不受代码影响.其它应该类似. //自定导入必要库 //然 ...
- asp.net core-5.控制台读取json文件
1,创建控制台应用程序,应用using Microsoft.Extensions.Configuration; 2,新建一个app.json文件 然后修改app.json的属性 3,生成项目,可以看到 ...
- 使用 VS2005 通过按钮自动上传文件到Linux
首先去官网下载 winscp,官网地址:http://winscp.net/eng/download.php 因为我这里是做自动上传工具,所以我只下载了精简版的:Portable executable ...
随机推荐
- Nginx + Tomcat 动静分离实现负载均衡(转)
0.前期准备 使用Debian环境.安装Nginx(默认安装),一个web项目,安装tomcat(默认安装)等. 1.一份Nginx.conf配置文件 # 定义Nginx运行的用户 和 用户组 如果对 ...
- Notes of the scrum meeting(10/30)
meeting time:9:30~11:30p.m.,October 29th,2013 meeting place:20公寓楼前 attendees: 顾育豪 ...
- 使用parseJSON代替eval
有些程序员如果没有很好的在javascript中解析json数据,往往会直接eval把json转成js对象,这时候如果json的数据中包含了被注入的恶意数据,则可能导致代码注入的问题. 正确的做法是分 ...
- Notification用法
String message = "You should click come back now. It is time out more than 10 minutes."; / ...
- 3142:[HNOI2013]数列 - BZOJ
题目描述 Description 小T最近在学着买股票,他得到内部消息:F公司的股票将会疯涨. 股票每天的价格已知是正整数,并且由于客观上的原因,最多只能为N.在疯涨的K天中小T观察到:除第一天外每天 ...
- jquery each函数对应的continue 和 break方法
continue: return true; break: return false; $("#oGrid").each(function (i, v) { if (i == 0) ...
- 【BZOJ】【1103】【POI2007】大都市meg
dfs序 模板题,进点+1出点-1,刚好对于不在路径上的点一进一出刚好抵消,由于本题要动态修改(变成公路以后+1-1都变成0)所以在序列上套一个树状数组即可. TLE:1.递归dfs给爆了……写了个手 ...
- WCF 之 DataContract
在客户端与服务端之间传递的自定义数据类型,格式如下: [DataContract] public class User :IExtensibleDataObject { [DataMember] pu ...
- jQuery+css+div--一些细节详解
(一).首先.让我们认识一下最基本普通的alert()弹出框!(改变alert()提示弹出框的样式) 我们在写html或是jsp页面的时候,谁都不希望自己精心设计,且非常美观的页面颜色布局被破坏掉吧! ...
- Volatile 说明
Java™ 语言包含两种内在的同步机制:同步块(或方法)和 volatile 变量.这两种机制的提出都是为了实现代码线程的安全性.其中 Volatile 变量的同步性较差(但有时它更简单并且开销更低) ...