史萊姆論壇

返回   史萊姆論壇 > 教學文件資料庫 > 應用軟體使用技術文件
忘記密碼?
論壇說明 標記討論區已讀

歡迎您來到『史萊姆論壇』 ^___^

您目前正以訪客的身份瀏覽本論壇,訪客所擁有的權限將受到限制,您可以瀏覽本論壇大部份的版區與文章,但您將無法參與任何討論或是使用私人訊息與其他會員交流。若您希望擁有完整的使用權限,請註冊成為我們的一份子,註冊的程序十分簡單、快速,而且最重要的是--註冊是完全免費的!

請點擊這裡:『註冊成為我們的一份子!』

Google 提供的廣告


 
 
主題工具 顯示模式
舊 2004-05-18, 12:59 AM   #1
psac
榮譽會員
 
psac 的頭像
榮譽勳章
UID - 3662
在線等級: 級別:30 | 在線時長:1048小時 | 升級還需:37小時級別:30 | 在線時長:1048小時 | 升級還需:37小時級別:30 | 在線時長:1048小時 | 升級還需:37小時級別:30 | 在線時長:1048小時 | 升級還需:37小時級別:30 | 在線時長:1048小時 | 升級還需:37小時
註冊日期: 2002-12-07
住址: 木柵市立動物園
文章: 17381
現金: 5253 金幣
資產: 33853 金幣
預設 不能開啟CHM文件的原因分析及解決方法

[按]本文以前可在BBS發表過,但是伺服器資料損壞,相關的文章與部分都
沒了。所以想重發。如果覺得這樣做無意義,那就把文章刪掉好了。

不能開啟CHM文件的原因分析及解決方法

這次重裝了Windows系統,心想不應該再有什麼問題,沒想到居然碰上了
CHM打不開的情況。雙按一個中文命名的CHM文件例如「全唐詩.CHM」,彈出
一個對話視窗:
「不能開啟文件:mk:@MSITStore:F:\全唐詩.chm」
記得以前這種情況也發生過,當時因為事情多,沒有功夫理它,只是把
檔案名改成英文了事。現在又發生這種情況,一定要把它了結掉。

我本來想開啟的CHM文件應該是「F:\全唐詩.chm」,為什麼錯誤報告中
提到的檔案名前面多了一串亂七八糟的「mk:@MSITStore:」?難道系統把我
本來的檔案名擅自篡改了嗎?必須觀察一下系統開啟文件的程序。我使用了
工具Filemon(http://www.sysinternals.com/ntw2k/source/filemon.shtml)
來監視系統開啟文件的程序,結果發現系統在發出「叮」的一聲報告錯誤之
前試突對以下文件取內容:
F:\全唐詩.CHI
但是RESULT為「NOT FOUND」。難道它要開啟的文件是「全唐詩.CHI」?於是
我把文件的副檔名改成CHI,結果是連文件關聯都不存在了,更別說開啟了。

用Filemon沒有解決任何問題。看來只好求助於SoftICE來追蹤了。我首
先想到的是在CreateFileA這個API上面設個斷點,這樣好監視系統究竟開啟
了什麼文件,結果發現系統試突開啟一個叫「F:\???.CHM」的文件並且失敗
了:


EAX=FFFFFFFF EBX=0000000A ECX=CF20BF50 EDX=00000001 ESI=00000080 EDI=00402C64 EBP=0056ED0C ESP=0056EBF0 EIP=5D48EEDC o d I s Z a P c CS=0187 DS=018F SS=018F ES=018F FS=1C57 GS=0000 -------------------------------------------------------------------------- 0056EC00 46 3A 5C 3F 3F 3F 2E 63-68 6D 00 00 00 00 00 00 F:\???.chm...... 0056EC10 00 00 40 00 F6 B3 F7 BF-00 00 40 00 5C EC 56 00 ..@.......@.\.V. -------------------------------------------------------------------------- 5D48EEC3 56 PUSH ESI 5D48EEC4 50 PUSH EAX 5D48EEC5 51 PUSH ECX 5D48EEC6 FF750C PUSH DWORD PTR [EBP+0C] 5D48EEC9 8D85F4FEFFFF LEA EAX,[EBP-010C] 5D48EECF FFB5F0FEFFFF PUSH DWORD PTR [EBP-0110] 5D48EED5 50 PUSH EAX ; EAX=56EC00指向檔案名???.CHM 5D48EED6 FF154410485D CALL [KERNEL32!CreateFileA] ; 開啟文件 ==> 5D48EEDC 83F8FF CMP EAX,-01 ; EAX為-1,開啟失敗了 5D48EEDF 894720 MOV [EDI+20],EAX 5D48EEE2 750E JNZ 5D48EEF2 5D48EEE4 FF154010485D CALL [KERNEL32!GetLastError] 5D48EEEA 50 PUSH EAX 5D48EEEB E8C1FEFFFF CALL 5D48EDB1 5D48EEF0 EB25 JMP 5D48EF17 5D48EEF2 8D441B02 LEA EAX,[EBX+EBX+02] 5D48EEF6 50 PUSH EAX 5D48EEF7 FF7508 PUSH DWORD PTR [EBP+08] 5D48EEFA 8D472C LEA EAX,[EDI+2C] 5D48EEFD 50 PUSH EAX ------------------------------------ITSS!.text+DEC3----------------------


看來問題就在這裡了,現在要搞清楚這個「???.chm」究竟是怎麼來的,
為什麼檔案名無端地變成了問號。繼續追蹤,發現在開啟文件之前,系統調
用一個叫WideCharToMultiByte的API把Unicode編碼的字串串轉化成Ansi字串
串,但是轉化的結果卻是錯誤的:


EAX=0000000B EBX=0000000A ECX=0056EC0A EDX=00560000 ESI=00000020 EDI=00402C64 EBP=0056ED0C ESP=0056EBF0 EIP=5D48EE90 o d I s Z a P c CS=0187 DS=018F SS=018F ES=018F FS=4D97 GS=0000 --------------------------------------------------byte--------------PROT-- -----這個是轉化之前的原始Ansi字串串(正確) ↓ 00690220 46 3A 5C C8 AB CC C6 CA-AB 2E 63 68 6D 00 00 00 F:\.......chm... 00690230 00 00 00 00 00 00 00 00-21 00 00 00 91 01 00 00 ........!....... ---------------------------------------------byte--------------PROT--?1)- -----這個是轉化之前的源Unicode字串串(正確) ↓ 0056ED98 46 00 3A 00 5C 00 68 51-10 55 D7 8B 2E 00 63 00 F.:.\.hQ.U....c. 0056EDA8 68 00 6D 00 00 00 F7 BF-E2 13 F7 BF 04 94 C0 81 h.m............. ---------------------------------------------byte--------------PROT--?2)- 0056EC00 46 3A 5C 3F 3F 3F 2E 63-68 6D 00 00 00 00 00 00 F:\???.chm...... ↑ -----這個是轉化出來的目標Ansi字串串(錯誤) -------------------------------------------------------------------------- 5D48EE67 E9AB000000 JMP 5D48EF17 5D48EE6C 6A00 PUSH 00 5D48EE6E 6A00 PUSH 00 5D48EE70 50 PUSH EAX 5D48EE71 8D85F4FEFFFF LEA EAX,[EBP-010C] 5D48EE77 50 PUSH EAX ; 56EC00指向目標Ansi字串串 5D48EE78 8D4301 LEA EAX,[EBX+01] 5D48EE7B 50 PUSH EAX 5D48EE7C FF7508 PUSH DWORD PTR [EBP+08] ; 56ED98指向源Unicode字串串 5D48EE7F 6820020000 PUSH 00000220 ; mapping flag 5D48EE84 FF35ACB1495D PUSH DWORD PTR [5D49B1AC] ; 程式碼頁=1252 5D48EE8A FF152010485D CALL [KERNEL32!WideCharToMultiByte] ==>5D48EE90 85C0 TEST EAX,EAX ; 這裡完成字串串轉化 5D48EE92 74CE JZ 5D48EE62 5D48EE94 33C9 XOR ECX,ECX 5D48EE96 394D10 CMP [EBP+10],ECX -------------------------------ITSS!.text+DE67----------------------------


現在錯誤的關鍵原因已經找到了,就是WideCharToMultiByte這個API的
使用有問題。查「Win32 Programmer's Reference」手冊或者MSDN發現,這
個API的第一個參數是程式碼頁(CodePage),而這個程式碼頁與Windows的語種有
關。例如簡體中文的CodePage是936,繁體中文是950,英文就是1252。仔細
觀察上面的跟蹤程序,我發現我機器的程式碼頁居然是1252(英文),而不是簡
體中文的936。 這下我明白了,我趕緊開啟控制台,找到「區域設定」一
看,哼唧,竟然是「英語(美國)」。立即把它改成「中文(中國)」,它說要
重新啟動,我沒理它,不重啟。重新開啟「全唐詩.CHM」,終於Ok了。
psac 目前離線  
送花文章: 3, 收花文章: 1631 篇, 收花: 3205 次
舊 2004-05-18, 01:49 AM   #2 (permalink)
註冊會員
 
酷比龍 的頭像
榮譽勳章

勳章總數
UID - 16382
在線等級: 級別:0 | 在線時長:0小時 | 升級還需:5小時
註冊日期: 2002-12-23
VIP期限: 2006-01
住址: §-無淵深海-§
文章: 337
精華: 0
現金: -3 金幣
資產: -3 金幣
預設

雖然還沒遇過~~但還素先收下來備用嚕~~
謝謝大大分享~~
酷比龍 目前離線  
送花文章: 0, 收花文章: 1 篇, 收花: 1 次
 


主題工具
顯示模式

發表規則
不可以發文
不可以回覆主題
不可以上傳附加檔案
不可以編輯您的文章

論壇啟用 BB 語法
論壇啟用 表情符號
論壇啟用 [IMG] 語法
論壇禁用 HTML 語法
Trackbacks are 禁用
Pingbacks are 禁用
Refbacks are 禁用


所有時間均為台北時間。現在的時間是 04:11 AM


Powered by vBulletin® 版本 3.6.8
版權所有 ©2000 - 2024, Jelsoft Enterprises Ltd.


SEO by vBSEO 3.6.1