FC2ブログ

2012 11 02
libmenu 1.6のDLリンクが切れていたようなので
ファイルを別の場所へアップロードし直しました。

http://magicsave.blog25.fc2.com/blog-entry-50.html
スポンサーサイト



MagicSave Ver 3.63 リリース

2012 11 01

MagicSave Ver 3.63 リリース


しばらくPSPから離れていた為、更新がかなり遅れましたが、
今さらながらCFW 6.60に対応しました。


更新内容
 
【基本動作部分】
・CFW 6.60系に対応した
 
【メニュー関係】
・名称を変更。("メニューオプション(MenuOption"→"オプション(Option")
・"オプション(Option)"へゲーム中に MagicSaveのセーブファイル操作関係の全機能を
 有効・無効へ変更出来る"フック(Hook)"の項目追加
 
【設定ファイル関係】
・起動時の状態からMagicSaveのセーブファイル操作関係の全機能を
一時的に無効に出来るオプションを追加
(ゲーム別 設定ファイルについて、"Hook"の項目を参照)
 
【その他】
・ソースコードを3.63へ更新


続2 > MagicSaveがCFW 6.60で動作しない件について

2012 10 30
続1 > MagicSaveがCFW 6.60で動作しない件について
この件はあれから解決出来たので、
このまま問題がなければ遅くても今週中には
CFW 6.60対応 MagicSaveをリリースします。

続1 > MagicSaveがCFW 6.60で動作しない件について

2012 10 29
MagicSave include/hook.c hookFindSyscallAddr関数 参照
1asm( "cfc0 %0, $12;" : "=r"( cop0_ctrl_register_12 ) );
MagicSaveが動かない原因はここにあって
構造体の変更によりsyscallテーブル取得がうまく出来なくなっている!?らしい。

もしくはCFW側によってプラグイン起動前にsyscall置き換えがされてしまっている。

別方法による関数フックが必要でsceChnnlsv関係のはどうにかなるかもしれないけど
sceIoReadのフックがどうも上手くいかない。
sceIoReadを含むFW6.60のiofilemgr.prxをprxtoolで
disassembleして見ると以下のようになっている。
01; Subroutine IoFileMgrForUser_6A638D83 - Address 0x000040E0 - Aliases: IoFileMgrForKernel_6A638D83
02; Exported in IoFileMgrForUser
03; Exported in IoFileMgrForKernel
04IoFileMgrForUser_6A638D83:    ; Refs: 0x00000638
05  0x000040E0: 0x27BDFFF0 '...'' - addiu      $sp, $sp, -16
06  0x000040E4: 0xAFBF0000 '....' - sw         $ra, 0($sp)
07  0x000040E8: 0x0C00134F 'O...' - jal        sub_00004D3C
08  0x000040EC: 0x00003821 '!8..' - move       $a3, $zr
09  0x000040F0: 0x8FBF0000 '....' - lw         $ra, 0($sp)
10  0x000040F4: 0x03E00008 '....' - jr         $ra
11  0x000040F8: 0x27BD0010 '...'' - addiu      $sp, $sp, 16
そこで
01#define MAKE_CALL(a, f) _sw(0x0C000000 | (((u32)(f) >> 2) & 0x03FFFFFF), a);
02 
03typedef struct SceModule2 {
04    struct SceModule2   *next;
05    unsigned short      attribute;
06    unsigned char       version[2];
07    char                modname[27];
08    char                terminal;
09    unsigned int        unknown1;
10    unsigned int        unknown2;
11    SceUID              modid;
12    unsigned int        unknown3[2];
13    u32         mpid_text;  // 0x38
14    u32         mpid_data; // 0x3C
15    void *              ent_top;
16    unsigned int        ent_size;
17    void *              stub_top;
18    unsigned int        stub_size;
19    unsigned int        unknown4[5];
20    unsigned int        entry_addr;
21    unsigned int        gp_value;
22    unsigned int        text_addr;
23    unsigned int        text_size;
24    unsigned int        data_size;
25    unsigned int        bss_size;
26    unsigned int        nsegment;
27    unsigned int        segmentaddr[4];
28    unsigned int        segmentsize[4];
29} SceModule2;
30 
31int (*_sceIoRead)(SceUID , void *, SceSize ) = NULL;
32 
33int hk_sceIoRead(SceUID fd, void *data, SceSize size)
34{
35  int k1 = pspSdkSetK1( 0 );
36     
37  int ret = _sceIoRead(fd,data,size);
38   
39  pspSdkSetK1( k1 );
40   
41  return ret;
42}
43 
44void ClearCaches(void)
45{
46  sceKernelDcacheWritebackAll();
47  sceKernelIcacheClearAll();
48}
49 
50void hook()
51{
52  SceModule2 *module = (SceModule2 *)sceKernelFindModuleByName( "sceIOFileManager" );
53  u32 tex_addr;
54 
55  if( module )
56  {
57    _sceIoRead = (void*)(module->text_addr + 0x4D3C);
58    text_addr = (u32)(module->text_addr + 0x40E8);
59 
60    MAKE_CALL(text_addr, hk_sceIoRead);
61    ClearCaches();
62  }
63}
このように一般的な方法でフックしてみても瞬時にフリーズ
うーん、間違いや別の打開法などなどあれば情報を

sceKernelQuerySystemCallを使う方法もあるけれど
それは戻り値が-1でダメなようだ。

FW6.60でのsceKernelQuerySystemCallは以下のmodname、libname、nid
1sceInterruptManager、InterruptManagerForKernel,0xF153B371

MagicSaveがCFW 6.60で動作しない件について

2012 10 24
お久しぶりです、しばらくPSPから離れていたため更新が遅れました。

MagicSaveを動作させる為に必要な関数へのHookが
CFW 6.60では何らかの原因により既存の方法では正常に行われていない模様
その為、現在は動作不可になっていました。

断言は出来ませんが別の方法で対処可能だと思われるので
しばらくお待ちください。
 | HOME | Next »