日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

VS2005控制台程序修改nb0文件

發(fā)布時間:2025/4/16 编程问答 20 豆豆
生活随笔 收集整理的這篇文章主要介紹了 VS2005控制台程序修改nb0文件 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

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)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。