現在讓我們嘗試著修改一個軟體的字型,其實PPC的字型函數只有一個(我知道的),就是CreateFontIndirectW函數,雖然MFC中也有個CreateFont,但這隻是CreateFontIndirectW的封裝而已。Win32中不是還有個GetStockObject嗎?可惜現在它只能產生一種字型,就是SYSTEM_FONT,並且顯示非常正常所以GetStockObject就不必考慮了。所以似乎字型問題簡單了起來……,不過PPC程式有些程式使用了動態庫如MFC庫。又沒有好用的Debug。所以好多程式的修改難度比較大,我現在也是處於摸索階段。
現在先介紹一下CreateFontIndirectW這個函數:
HFONT CreateFontIndirect(
const LOGFONT* lplf
);
Parameters
lplf
[in] Long pointer to a LOGFONT structure that defines the characteristics of the logical font.
Return Values
A handle to a logical font indicates success. NULL indicates failure. To get extended error information, call GetLastError.
上邊是PPC2003的sdk裡邊的介紹,在MSDN裡邊也有。這個函數只有一個參數,就是Logfont結構體。傳回值是一個字型的控制代碼,如果調用失敗則返回NULL。Logfont是一個結構體,是如下定義的:
This structure defines the attributes of a font.
typedef struct tagLOGFONT {
LONG lfHeight;
LONG lfWidth;
LONG lfEscapement;
LONG lfOrientation;
LONG lfWeight;
BYTE lfItalic;
BYTE lfUnderline;
BYTE lfStrikeOut;
BYTE lfCharSet;
BYTE lfOutPrecision;
BYTE lfClipPrecision;
BYTE lfQuality;
BYTE lfPitchAndFamily;
TCHAR lfFaceName[LF_FACESIZE];
} LOGFONT;
這些參數不用我介紹了吧?有用的就是第一個即字型的高度。還有就是Charset,這是設定字元集的,不過在PPC下,似乎沒啥用處。最後一個則是字型名,如“宋體”,“Tahoma”等。下邊嘗試著改一下一個軟體的字型。
第一個被動刀子的是大樹(誰是大樹?當然是風流倜儻,玉樹臨風的……還是自己到bbs.hanzify.org去問吧:)漢化的FunnySnake TKCreater這是個非常好用的主題編輯軟體。這個軟體幾乎在我的PDA上沒有一個標準字型-_-b,當然是先修改標準字型。我發現對話方塊字型全是Tahoma 8,可能是我PDA的解析度問題吧。顯示效果很差。所以我都改成了Tahoma 9就有些地方顯示效果比較好了。但介面還有許多地方字型爛,譬如說主介面:
開啟IDA Pro反組譯碼,搜尋Font字串,找到幾處:
一共找到7處,先分析第一處:
我們知道CreateFontIndirectW的參數只有一個。前面文章我們分析。前四個參數是通過寄存器傳遞。所以R0裡邊就是Logfont的地址了。看看上邊圖,IDA已經標出來了。R0裡邊的值是SP+#0xC0+var_BC。第一個參數也就是字型高度了。我們可以往上翻,找到設定字型高度的地方:
MOV R3, #0xD
STR R3, [SP,#0xC0+var_BC]
先把0d放入r3,然後把r3,放入SP+#0xC0+var_BC,這個地址。所以字型高度就是0d.我試著改成0e,其他也照樣都改成0e.只是最後一個有點麻煩:
首先我們看到參數在R4裡邊。再看前邊:
首先,字型高度是在R7裡邊,而從的第一行來看則是來源於R2。R2又是這個字函數傳入的第二個參數,所以改法即有兩種:一是把 MOV R7, R2,改成 MOV R7, 0x0E,這樣不管傳入什麼參數,得到的都是0x0E的字型,再一種改法便是到函數外邊改:
雙擊圖中的黃色部分,就到了調用處
修改這裡就可以了。全部修改完後效果如下:
但是……
菜單成了這樣字這是真麼回事呢?原來是因為本來這地方是兩行一樣的字型摞起來的。字型改大後由於不一樣了就成醬紫了。並且只要這地方改好了,主介面字型就完了,弄了好一陣子才改的像點樣子了(這個太麻煩,我就不寫了)。可惜最上邊一行時間沒法弄好了。算一個美中不足吧。還有一處美中不足的地方是關於對話方塊的那個串連,我也暫時沒找到改法。