|
論壇說明 |
歡迎您來到『史萊姆論壇』 ^___^ 您目前正以訪客的身份瀏覽本論壇,訪客所擁有的權限將受到限制,您可以瀏覽本論壇大部份的版區與文章,但您將無法參與任何討論或是使用私人訊息與其他會員交流。若您希望擁有完整的使用權限,請註冊成為我們的一份子,註冊的程序十分簡單、快速,而且最重要的是--註冊是完全免費的! 請點擊這裡:『註冊成為我們的一份子!』 |
|
主題工具 | 顯示模式 |
2003-12-11, 07:41 PM | #1 |
榮譽會員
|
順便帖一下讓winamp工作列滾動文字正常顯示中文
winamp工作列可以滾動顯示歌名,但如果是中文,將會時而出現亂碼,因為中文是雙字元,而winamp並沒有考慮,仍當作單字元處理。當滾過第一字元後,第二字元就無法正常顯示。
用OD載入winamp,下斷點:setwindowtexta,中斷後回到這裡: 0042EE53 LEA EAX,DWORD PTR [EBP-1000] --->[EBP-1000]為工作列中要顯示的文字 0042EE59 PUSH EAX 0042EE5A PUSH DWORD PTR DS:[453320] --->HWnd 0042EE60 CALL DWORD PTR DS:[<&USER32.SetWindo>; \SetWindowTextA 向上分析文字是怎麼滾動的: 0042ED40 PUSH ESI --->文字 0042ED41 STOS BYTE PTR ES:[EDI] 0042ED42 CALL <JMP.&MSVCRT.strlen> --->長度 0042ED47 POP ECX 0042ED48 MOV ECX,DWORD PTR DS:[451248] --->重要:取第幾字元的記數器 0042ED4E CMP ECX,EAX 0042ED50 JGE SHORT Winamp.0042EDA9 --->大於就跳,計數器重新置0 0042ED52 LEA EAX,DWORD PTR DS:[ECX+4538C0] --->[4538C0]中放置完整的文字 0042ED58 PUSH EAX 0042ED59 LEA EAX,DWORD PTR SS:[EBP-1000] 0042ED5F PUSH EAX 0042ED60 CALL <JMP.&MSVCRT.strcpy> --->取得文字複製到[EBP-1000]中 下略。 明顯程序用[451248]記憶取到第幾位數,然後取得文字複製到[EBP-1000]中讓工作列顯示,只要判斷取得的第一個文字是否中文,是則將計數器加1,就可跳過該中文的第二字元。 修改程序如下: 0042EE53 JMP Winamp.0043D4E0 --->在工作列顯示前先處理文字 0043D4E0 MOV AL,BYTE PTR SS:[EBP-1000] --->取第一字元 0043D4E6 CMP AL,9F --->中文一般大於9F?我猜的 0043D4E8 JB SHORT Winamp.0043D4F0 --->是則跳 0043D4EA INC DWORD PTR DS:[451248] --->計數器加1 0043D4F0 LEA EAX,DWORD PTR SS:[EBP-1000] --->恢復原程式碼 0043D4F6 JMP Winamp.0042EE59 --->回原程序繼續執行 |
送花文章: 3,
|