VS2005控制台程序修改nb0文件
VS2005控制臺程序修改nb0文件
?
我們要實現(xiàn)的功能就是通過CMD傳遞進(jìn)來的值來在nb0文件末尾增加版本信息,新建控制臺程序,自動生成的main函數(shù)如下,默認(rèn)的代碼非常簡單:
int _tmain(int argc, _TCHAR * argv[]) {return0; }為了實現(xiàn)此功能,我們發(fā)現(xiàn)有兩種實現(xiàn)的辦法,差別在于使用TCHAR還是char,下面分別給出這兩種方式的實現(xiàn)代碼,這兩種實現(xiàn)方式CMD端傳遞的參數(shù)都一樣,如下:
圖1
?
1.??????采用TCHAR
?
(1)????main函數(shù)
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結(jié)構(gòu)體的定義
typedef struct _IMG_CHECK_VERSION_ {TCHARImageVersion[VERSION_LEN]; }IMG_CHECK_VERSION,*PIMG_CHECK_VERSION;見main函數(shù)的printf函數(shù),我們的本意是輸出傳遞進(jìn)來參數(shù)的所有字符串內(nèi)容的,但自己的輸出卻是:
圖2
可見只輸出對應(yīng)參數(shù)的第一個字符,比如argv[2]是傳遞“stepldr.nb0”進(jìn)來的,但只輸出s,雖然我們想要的功能能夠達(dá)到,但是調(diào)試起來如果想看這些信息比較不方便。
?
修改之前stepldr.nb0文件最后一段全部為0,我們用UltraEdit文件打開如下:
圖3
修改之后如下:
圖4
由圖4可知stepldr.nb0從0x1ff8到0x1fff這8個字節(jié)的數(shù)據(jù)由之前的0x00改為0x31、0x00、0x32、0x00、0x33、0x00、0x34、0x00,這對應(yīng)于圖1中傳遞進(jìn)來的1234,為什么1個字符會占用兩個字節(jié)呢?是因為我們的IMG_CHECK_VERSION結(jié)構(gòu)體成員ImageVersion類型是TCHAR(相當(dāng)于wchar_t),是寬字符,也就是說一個字符占用2個字節(jié)。
2.??????采用char
?
(1)????main函數(shù)
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函數(shù)
?
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函數(shù)的第1個參數(shù)類型要求是LPCTSTR,如果我們直接采用(LPCTSTR)tFilePath強(qiáng)制類型轉(zhuǎn)換,GetLastError()返回值是2(ERROR_FILE_NOT_FOUND),表示找不到文件,采用MultiByteToWideChar函數(shù)轉(zhuǎn)換為寬字符后就OK了。
?
(3)????IMG_CHECK_VERSION結(jié)構(gòu)體
typedef struct _IMG_CHECK_VERSION_ {charImageVersion[VERSION_LEN]; }IMG_CHECK_VERSION,*PIMG_CHECK_VERSION;采用這樣的方式修改stepldr.nb0后,如下:
圖5
可見char占用一個字節(jié),綜合比較具體是采用哪種,根據(jù)需要來選擇。
?
遇到一個很奇怪的問題,我在A電腦上用VS2005創(chuàng)建的這個控制臺程序,編譯出來后在B電腦上運行是提示不能運行這個程序,然后我在B電腦上編譯A電腦的這個工程,重新生成控制臺程序就可以,然后我用B電腦上編譯的在A電腦上也OK,目前不知道原因,先備注下。
總結(jié)
以上是生活随笔為你收集整理的VS2005控制台程序修改nb0文件的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: nand flash 扇区的管理以及初始
- 下一篇: 当汇错款时该怎么办?