2012 11 02
libmenu 1.6のDLリンクが切れていたようなので
ファイルを別の場所へアップロードし直しました。
http://magicsave.blog25.fc2.com/blog-entry-50.html
ファイルを別の場所へアップロードし直しました。
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をリリースします。
この件はあれから解決出来たので、
このまま問題がなければ遅くても今週中には
CFW 6.60対応 MagicSaveをリリースします。
続1 > MagicSaveがCFW 6.60で動作しない件について
2012 10 29
MagicSave include/hook.c hookFindSyscallAddr関数 参照
MagicSaveが動かない原因はここにあって
構造体の変更によりsyscallテーブル取得がうまく出来なくなっている!?らしい。
もしくはCFW側によってプラグイン起動前にsyscall置き換えがされてしまっている。
別方法による関数フックが必要でsceChnnlsv関係のはどうにかなるかもしれないけど
sceIoReadのフックがどうも上手くいかない。
sceIoReadを含むFW6.60のiofilemgr.prxをprxtoolで
disassembleして見ると以下のようになっている。
そこで
このように一般的な方法でフックしてみても瞬時にフリーズ
うーん、間違いや別の打開法などなどあれば情報を
sceKernelQuerySystemCallを使う方法もあるけれど
それは戻り値が-1でダメなようだ。
FW6.60でのsceKernelQuerySystemCallは以下のmodname、libname、nid
1 | asm( "cfc0 %0, $12;" : "=r" ( cop0_ctrl_register_12 ) ); |
構造体の変更により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 |
04 | IoFileMgrForUser_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 |
03 | typedef 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 |
31 | int (*_sceIoRead)( SceUID , void *, SceSize ) = NULL; |
32 |
33 | int 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 |
44 | void ClearCaches( void ) |
45 | { |
46 | sceKernelDcacheWritebackAll (); |
47 | sceKernelIcacheClearAll (); |
48 | } |
49 |
50 | void 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
1 | sceInterruptManager、InterruptManagerForKernel,0xF153B371 |
MagicSaveがCFW 6.60で動作しない件について
2012 10 24
お久しぶりです、しばらくPSPから離れていたため更新が遅れました。
MagicSaveを動作させる為に必要な関数へのHookが
CFW 6.60では何らかの原因により既存の方法では正常に行われていない模様
その為、現在は動作不可になっていました。
断言は出来ませんが別の方法で対処可能だと思われるので
しばらくお待ちください。
MagicSaveを動作させる為に必要な関数へのHookが
CFW 6.60では何らかの原因により既存の方法では正常に行われていない模様
その為、現在は動作不可になっていました。
断言は出来ませんが別の方法で対処可能だと思われるので
しばらくお待ちください。