查看完整版本: 无解了,贴了代码,eCool斑竹请指教!

laputarei 2005-11-27 04:15

无解了,贴了代码,eCool斑竹请指教!

如题,这几天遇到一个问题,非要用Hack解决不可,下载了YAHM的SDK,在for cw9的例子(SyncInfoHack和NoBeamCW)里面研究了半天,还是没搞懂:H:。

因为我没有之前OS4编写Hack的经验,也没有写过ARM代码,所以想请教几个问题:
1、Code Warrior似乎不是最常见的OS5 Hack编写工具?是否有一个很方便的工具,能够直接编写OS5的Hack?

2、SyncInfoHack那个例子看得头昏脑胀,SDK里面也没有说清楚,那个rcp里面的HEX填写的是:
HEX "TRA5" ID 1000
00 00 00 08
00 00 08 0xf8
00 00 00 00
00 00 00 00
00 00 00 00

第一个08是怎么来的?

我想trap的是SysAppLaunch,它的HEX是7C8,那么是不是直接替换成07 0xc8就行了?

3、我把SyncInfoHack里面的Err ARMlet_Main(……)替换成SysAppLaunch的参数形式之后,为什么编译就失败,提示“函数没有声明”了?

laputarei 编辑于 2005-11-29 0:21:08

ecool 2005-11-28 21:23

1. 用prc-tools + cygwin在windows下写os5的hack就很方便了,我的fonthackv就是用这个组合写的

2. 08是一个模块的偏移量吧,在systable.txt里面,
HALTable always 0x04
SystemTable always 0x08
UITable always 0x0c

2.1 07c8 直接写成07 0xc8就行

3. 建议还是用prc-tools写吧,我没有用cw写过hack,估计你没有加入yahm带的那几个lib到工程中

ecool 编辑于 2005-11-28 13:26:06

laputarei 2005-11-29 06:42

受教,刚装好prc-tools和cygwin,研究中,写出来的hack导致俺的650死机n次,看来还要看看arm下面的各种api,似乎mem系列等各种api都不好使了~


btw:突发奇想,prc-tools+cygwin也是PODS的基础吧?这样说的话,只要写好makefile,自己搭配IDE也可以做m68k开发?

laputarei 2005-11-29 08:12

搞不定啊,看了PalmOS SDK里面的ARM部分,更糊涂了……斑竹大人,俺把我的代码贴进来,指导一下?

-----NamePatch.rcp-------------------------------
APPLICATIONICONNAME ID 3000 "NamePatchDialog"
VERSION ID 1 "1.0"

FORM 3000 AT (2 2 156 156)
MODAL
USABLE
HELPID 3000
BEGIN
 TITLE "About NamePatch"
 LABEL "NamePatch v1.0"                AUTOID AT (CENTER  20) USABLE FONT 1
 LABEL "Freeware"                                AUTOID AT (CENTER  PREVBOTTOM + 4) USABLE
 LABEL "(C) 2005, REi Laputa" AUTOID AT (CENTER  PREVBOTTOM + 4) USABLE
 BUTTON "Done" 1                                        AT (7 140 AUTO AUTO) USABLE
END

STRING ID 3000 "First arm hack."


HEX "TRA5" ID 1000
 00 00 00 08
 00 00 07 0xC8
 00 00 00 00
 00 00 00 00
 00 00 00 00

----code03e8.c-----------------
#include [Standalone.h]
#include [PceNativeCall.h]
#include "../Include/endianutils.h"
#include "../Include/palmos5.h"

#define RESID 1000
#define MY_CRID 'REiM'

STANDALONE_CODE_RESOURCE_TYPESTR_ID("armc", RESID);


/** Parameter block for addrAppLaunchCmdCallerID. */
typedef struct
{
 Char* lookupString;
 Char* formatString;   /**< Format of the output string like AddrLookupParamsPtr->formatString Example ^name ( ^phonetypelabel ) might result in "David ( work )" */
 Char* resultString; /**<  Returned heap allocated string resultStringH; */
 Boolean (*callback)(void*); /**< Call back; Returns true to stop execution */
 void* ref;  /**< Reference that gets passed to callbackFunc */
 UInt32 uniqueID; /**< Unique ID of the matching record 0 if no match */
 UInt16 flags; /**< Flags associated with the called ID */
 UInt16 recordNum; /**<record number of the matching record. */

}
AddrCallerIDParamsType, * AddrCallerIDParamsPtr;

typedef enum
{
 addrAppNotificationHsLookup = sysAppLaunchCmdCustomBase + 0x2300,
 addrAppNotificationCmdCallerID,
 addrAppNotificationPhonebookApp,
 addrAppNotificationListLookupTypeGet = 'HsLL',          // Registered 2001-09-12 w/ Creator DB
 addrAppNotificationCreateNewRecord = 'HsNR',                 // Registered 2002-07-30 w/ Creator DB
 addrAppNotificationDialPrefs = 'HsDP',                        // Registered 2003-01-29 w/ Creator DB
 addrAppNotificationBeamBusinessCard = 'HsBB',                // Registered 2003-02-14 w/ Creator DB
 addrAppNotificationPhotoCallerID = 'HsPC'
}
AddrCustomNotificationCodes;

typedef Err (*pfnSysAppLaunch)(LocalID dbID, UInt16 launchFlags, UInt16 cmd, MemPtr cmdPBP, UInt32 *resultP);

Err MySysAppLaunch(LocalID dbID, UInt16 launchFlags, UInt16 cmd, MemPtr cmdPBP, UInt32 *resultP)
{
 pfnSysAppLaunch oldTrap;
 SysNotifyParamType np;
 AddrCallerIDParamsType param;
 const char * fmStr = "^name^first  ";

 FtrGet(MY_CRID, RESID, (UInt32 *)&oldTrap);
       
 if (cmd == ByteSwap16(addrAppNotificationCmdCallerID))
 {
  np = (SysNotifyParamType *)cmdPBP;
  param = * (AddrCallerIDParamsType *)np.notifyDetailsP;
  //实际还有很多字符串检测要做,不过暂时先直接替换掉,至少在短讯程序里面是可以的。
  StrCopy(param.formatString, fmStr);
 }

 return oldTrap(dbID, launchFlags, cmd, cmdPBP, resultP);
}
---编译的命令------------
pilrc -q -ro -LE32 NamePatch.rcp

arm-palmos-gcc -Wall -Wno-multichar -fshort-enums -fpack-struct -O1  -nostartfiles -D_ARM_HACK_ -c -o code03e8.o code03e8.c

arm-palmos-gcc -nostartfiles -o code03e8 code03e8.o ../lib/libarmboot.a

build-prc --no-check-resources -o NamePatch.prc -n "NamePatch" -c REiM -t 'HACK' NamePatch.ro code03e8
========================================

直接编译会失败,去掉StrCopy那句之后可以通过编译,但第3步还是有警告。实在是无解了,对ARM编程毫无概念啊,斑竹指导则个……

laputarei 编辑于 2005-11-29 15:02:01

ecool 2005-11-29 21:26

把出错信息也贴出来看看,这样我也看不出什么问题:H:

laputarei 2005-11-29 22:56

好的,出错在最后两步,这里是提示信息:
3)arm-palmos-gcc -nostartfiles -o code03e8 code03e8.0 ../lib/libarmboot.a
出错:
/user/lib/gcc-lib/arm-palmos/3.3.1/../../../../arm-palmos/bin/ld: Warning: /user/lib/gcc-lib/arm-palmos/3.3.1/../../../../arm-palmos/lib/libc.a(memcpy.o) does not support interworking, whereas code03e8 does

4)build-prc........
出错:
code03e8(.got): warning: non-empty GOT-related section ignored
code03e8(.got.plt): warning: non-empty GOT-related section ignored

ecool 2005-11-30 21:18

68KCC = m68k-palmos-gcc
ARMCC = arm-palmos-gcc
PRCBUILD = $(BINDIR)/build-prc
RESBUILD = pilrc
DEPFLAGS = -Wall -Wno-multichar -fshort-enums -fpack-struct -O1 -nostartfiles -c -o
OBJFLAGS = -nostartfiles -o

# Build Application
all: $(RESOBJS) $(ARMOBJS) $(68KOBJS)
        $(PRCBUILD) --no-check-resources -o $(PRCNAME) -n $(APPNAME) -c $(APPCREATOR) -t $(APPTYPE) $^

参考一下编译参数


laputarei 2005-12-1 03:51

:eek::eek::eek::eek:

我……我……看不懂……

页: [1]
查看完整版本: 无解了,贴了代码,eCool斑竹请指教!