 |
forums.ps2dev.org Homebrew PS2, PSP & PS3 Development Discussions
|
| View previous topic :: View next topic |
| Author |
Message |
ldqmoon
Joined: 04 Dec 2007 Posts: 13
|
Posted: Sun Jul 06, 2008 7:39 pm Post subject: what is " sceKernelSearchModuleByName " |
|
|
I found this function used in hook function. but I can't find any explain of it.
it's declared like this:
extern SceUID sceKernelSearchModuleByName (const char *);
I use it in this way:
SceUID thid;
thid=sceKernelSearchModuleByName(mainHookSave[0].modname);
where mainHookSave[o].modname is "sceController_Service". the return value is -2147352365, I think this value incorrect.
I run this code under 3.71 M33, could you like give some information of it ? anythink will be ok.
TKS! |
|
| Back to top |
|
 |
Pirata Nervo
Joined: 09 Oct 2007 Posts: 409
|
|
| Back to top |
|
 |
moonlight
Joined: 26 Oct 2005 Posts: 567
|
Posted: Mon Jul 07, 2008 3:05 am Post subject: |
|
|
The searchmodulebyname searchs a module by its name :)))
Given the module name, it returns its uid... if it finds it, an error, otherwise. |
|
| Back to top |
|
 |
ldqmoon
Joined: 04 Dec 2007 Posts: 13
|
Posted: Tue Jul 08, 2008 9:20 pm Post subject: Thank you |
|
|
Thank you very much!
however, I want to hook the key, when I press LEFT, it runs RIGHT, and when I press RIGHT, it runs LEFT. Here is my code. if there no problem with sceKernelFindModuleByName, I don't know why....
this is the main.c of PRX
| Code: |
#include <pspctrl.h>
#include <psphprm.h>
#include <psppower.h>
#include <time.h>
#include <psprtc.h>
#include "main.h"
#include "hooktable.h"
char mainUmdId[16];
// *** MODULE INITIALISATION ***
PSP_MODULE_INFO("KeyHook",0x1000,1,1);
// *** FUNCTIONS PATCH ***
typedef int (*FUNC_CTRL) (SceCtrlData*, int);
typedef int (*FUNC_LATCH) (SceCtrlLatch*);
#define PAD_THRESHOLD 50
SceCtrlData dupe_pad;
struct ctrlSetup controllerConfig;
unsigned char holdingNote = 0;
unsigned char enabled = 0;
unsigned char inTurbo = 0; //Toggle every time we are called
//Macro Variables
unsigned char inMacro = 0; //0 if not in a macro, 1/2 if we are - index of macro + 1
u64 macroStartTime = 0; //Time the current macro piece started
unsigned char macroUpToIndex; //Index of current Macro Piece
//Works out how far an analog is pressed for remapping the analogs
//This returns the difference from center that the given control is, based on dupe_pad
void overrideControls(SceCtrlData *pad_data)
{
memcpy(&dupe_pad, pad_data, sizeof(SceCtrlData));
///Set up the variables for processing
inTurbo = !inTurbo; //Toggle the turbos~
//Clear off the area for the remote, some useless bits up there
dupe_pad.Buttons &= 0x00ffffff;
//Set up some extra bits in the dupe_pad.Buttons (remote and analog)
if (sceHprmIsRemoteExist()) ///Remote
{
u32 hprm = 0;
sceHprmPeekCurrentKey(&hprm);
dupe_pad.Buttons |= (hprm<<24);
}
//Digitals
pad_data->Buttons |= ((controllerConfig.digital_R.pressed & dupe_pad.Buttons) || (inTurbo && (controllerConfig.digital_R.turbo & dupe_pad.Buttons)))?PSP_CTRL_LEFT:0;
pad_data->Buttons |= ((controllerConfig.digital_L.pressed & dupe_pad.Buttons) || (inTurbo && (controllerConfig.digital_L.turbo & dupe_pad.Buttons)))?PSP_CTRL_RIGHT:0;
if (pad_data->Buttons) //if there are any keys set, send a power stay on!
scePowerTick(0);
}
int sceCtrlPeekBufferPositiveFake(SceCtrlData *pad_data, int count)
{
u32 k1;
k1 = pspSdkSetK1(0);
int res = ((FUNC_CTRL) mainHookSave[0].modfunc.addr)(pad_data, count);
overrideControls(pad_data);
pspSdkSetK1(k1);
return res;
}
int sceCtrlPeekBufferNegativeFake(SceCtrlData *pad_data, int count)
{
u32 k1;
k1 = pspSdkSetK1(0);
int res = ((FUNC_CTRL) mainHookSave[1].modfunc.addr)(pad_data, count);
overrideControls(pad_data);
pspSdkSetK1(k1);
return res;
}
int sceCtrlReadBufferPositiveFake(SceCtrlData *pad_data, int count)
{
u32 k1;
k1 = pspSdkSetK1(0);
int res = ((FUNC_CTRL) mainHookSave[2].modfunc.addr)(pad_data, count);
overrideControls(pad_data);
pspSdkSetK1(k1);
return res;
}
int sceCtrlReadBufferNegativeFake(SceCtrlData *pad_data, int count)
{
u32 k1;
k1 = pspSdkSetK1(0);
int res = ((FUNC_CTRL) mainHookSave[3].modfunc.addr)(pad_data, count);
overrideControls(pad_data);
pspSdkSetK1(k1);
return res;
}
unsigned int previousPressed;
int sceCtrlPeekLatchFake(SceCtrlLatch *latch_data)
{
SceCtrlData pad;
int res = sceCtrlPeekBufferPositiveFake(&pad, 1);
//Gen new Latch
latch_data->uiMake = (previousPressed ^ pad.Buttons) & pad.Buttons;
latch_data->uiBreak = (previousPressed ^ pad.Buttons) & previousPressed;
latch_data->uiPress = pad.Buttons;
latch_data->uiRelease = ~pad.Buttons;
previousPressed = pad.Buttons;
return res;
}
int sceCtrlReadLatchFake(SceCtrlLatch *latch_data)
{
SceCtrlData pad;
int res = sceCtrlPeekBufferPositiveFake(&pad, 1);
//For one reason or another this is no good. Makes games run too slow
//int res = sceCtrlReadBufferPositiveFake(&pad, 1);
//Gen new Latch
latch_data->uiMake = (previousPressed ^ pad.Buttons) & pad.Buttons;
latch_data->uiBreak = (previousPressed ^ pad.Buttons) & previousPressed;
latch_data->uiPress = pad.Buttons;
latch_data->uiRelease = ~pad.Buttons;
previousPressed = pad.Buttons;
return res;
}
// hook 线程,重新定义函数
int HookThread (SceSize args, void *argp)
{
//SceUID loaderid, fd;
int ret, x;
//fd = 0; //shutup about unused ;)
previousPressed = 0;
//Make sure kernel is in analog sampling mode!
sceCtrlSetSamplingMode(PSP_CTRL_MODE_ANALOG);
// Patch syscall table, here the program use jmp func in stub table, so patch not applied here but in all user modules
// u32 moduleHookFunc (ModuleFunc *modfunc, SceUID modid, const char *library, SceUID nid, void *func)
for (x=0;x<MAIN_HOOK_NBR;x++)
{
ret = moduleHookFunc(&mainHookSave[x].modfunc, sceKernelSearchModuleByName(mainHookSave[x].modname), mainHookSave[x].libname, mainHookSave[x].nid, mainHookSave[x].func);
}
sceKernelExitDeleteThread(0);
return 0;
}
///////////////////////////////////////////////////////////////////////////////////////////////
int HookStart(void)
{
SceUID thid;
int ret[MAIN_HOOK_NBR], x;
sceCtrlSetSamplingMode(PSP_CTRL_MODE_ANALOG);
for (x=0;x<MAIN_HOOK_NBR;x++)
{
ret[x] = moduleHookFunc(&mainHookSave[x].modfunc, sceKernelSearchModuleByName(mainHookSave[x].modname), mainHookSave[x].libname, mainHookSave[x].nid, mainHookSave[x].func);
}
for(x=0; x<MAIN_HOOK_NBR; x++)
{
if(ret[x]<=3)
{
return ret[x];
}
}
return 0;
}
int module_start(SceSize args, void *argp)
{
return 0;
}
/*****************************************************************************/
/* This is apparently never called when running as a VSH OE plugin. */
/*****************************************************************************/
int module_stop(SceSize args, void *argp)
{
int x;
// Restore functions
for (x = 0; x < MAIN_HOOK_NBR; x++)
moduleRestoreFunc(&mainHookSave[x].modfunc);
return 0;
}
|
this is the head file of main.c, the main.h
| Code: |
#ifndef __MAIN_H__
#define __MAIN_H__
#include <pspkernel.h>
#include <pspdisplay.h>
#include <pspctrl.h>
#include <pspumd.h>
#include <stdio.h>
#include <stdlib.h>
#include "conf.h"
#include "Utils/module.h"
extern SceUID sceKernelSearchModuleByName (const char *);
//Global for use with the menu :)
extern struct ctrlSetup controllerConfig;
typedef struct MainHook
{
ModuleFunc modfunc;
char modname[32];
char libname[32];
u32 nid;
void *func;
} MainHook;
// *** FUNCTIONS DECLARATIONS ***
int sceCtrlPeekBufferPositiveFake(SceCtrlData *pad_data, int count);
int sceCtrlPeekBufferNegativeFake(SceCtrlData *pad_data, int count);
int sceCtrlReadBufferPositiveFake(SceCtrlData *pad_data, int count);
int sceCtrlReadBufferNegativeFake(SceCtrlData *pad_data, int count);
//int vshCtrlReadBufferPositiveFake(SceCtrlData *pad_data, int count);
int sceCtrlPeekLatchFake(SceCtrlLatch *latch_data);
int sceCtrlReadLatchFake(SceCtrlLatch *latch_data);
extern unsigned char enabled;
#endif
|
and this is head file of hooktable.h
| Code: |
#ifndef HOOKTABLE_INCLUDED
#define HOOKTABLE_INCLUDED
#define MAIN_HOOK_NBR 6
MainHook mainHookSave[MAIN_HOOK_NBR] =
{
{ { 0, NULL }, "sceController_Service", "sceCtrl", 0x3A622550, sceCtrlPeekBufferPositiveFake },
{ { 0, NULL }, "sceController_Service", "sceCtrl", 0xC152080A, sceCtrlPeekBufferNegativeFake },
{ { 0, NULL }, "sceController_Service", "sceCtrl", 0x1F803938, sceCtrlReadBufferPositiveFake },
{ { 0, NULL }, "sceController_Service", "sceCtrl", 0x60B81F86, sceCtrlReadBufferNegativeFake },
{ { 0, NULL }, "sceController_Service", "sceCtrl", 0xb1d0e5cd, sceCtrlPeekLatchFake },
{ { 0, NULL }, "sceController_Service", "sceCtrl", 0x0b588501, sceCtrlReadLatchFake },
// Attempt at getting nid overloading working with menus.
// Can't get this to work: moduleHookFunc[4] return : 0x2
// Incorrect NID or something? :(
// { { 0, NULL }, "sceVshBridge_Driver", "sceVshBridge", 0xc6395c03, vshCtrlReadBufferPositiveFake },
};
#endif
|
the next is the PRX loader
| Code: |
#include <pspsdk.h>
#include <pspkernel.h>
#include <pspdebug.h>
#include <pspctrl.h>
#include <stdlib.h>
#include <string.h>
#include <pspdisplay.h>
#include "grap.h"
/* Define the module info section */
PSP_MODULE_INFO("CONTROLTEST", 0, 1, 1);
PSP_HEAP_SIZE_KB(20480);
/* Define the main thread's attribute value (optional) */
PSP_MAIN_THREAD_ATTR(THREAD_ATTR_USER | THREAD_ATTR_VFPU);
/* Define printf, just to make typing easier */
#define printf pspDebugScreenPrintf
void dump_threadstatus(void);
int HookStart(void);
int done = 0;
/* Exit callback */
int exit_callback(int arg1, int arg2, void *common)
{
done = 1;
return 0;
}
/* Callback thread */
int CallbackThread(SceSize args, void *argp)
{
int cbid;
cbid = sceKernelCreateCallback("Exit Callback", exit_callback, NULL);
sceKernelRegisterExitCallback(cbid);
sceKernelSleepThreadCB();
return 0;
}
/* Sets up the callback thread and returns its thread id */
int SetupCallbacks(void)
{
int thid = 0;
thid = sceKernelCreateThread("update_thread", CallbackThread,
0x11, 0xFA0, 0, 0);
if(thid >= 0)
{
sceKernelStartThread(thid, 0, 0);
}
return thid;
}
void DrawPic(int x, int y, int Flag, u32 color)
{
switch(Flag)
{
case 0: // 三角
DrawTri(x, y, color);
break;
case 1: // 方块
DrawRect(x, y, color);
break;
case 2: // 叉
DrawCross(x, y, color);
break;
case 3: // 圆圈
DrawCir(x, y, color);
break;
}
}
int main(void)
{
int x=200, y=100;
int flag=0;
u32 color=ARGB(255,0,255,0);
int Counter=0;
int rets;
SceCtrlData pad;
SceUID modid;
pspDebugScreenInit();
SetupCallbacks();
// mode 0, pixel format: ABGR
sceDisplaySetMode(0, SCREEN_WIDTH, SCREEN_HEIGHT);
sceCtrlSetSamplingCycle(0);
sceCtrlSetSamplingMode(PSP_CTRL_MODE_ANALOG);
modid = pspSdkLoadStartModule("keyhook.prx", PSP_MEMORY_PARTITION_KERNEL);
if (modid < 0)
{
pspDebugScreenPrintf("Error 0x%08X loading/starting keyhook.prx.\n", modid);
sceKernelDelayThread(5*1000*1000);
sceKernelExitGame();
}
pspDebugScreenPrintf("load hook\n");
rets=HookStart();
if(rets!=0)
{
pspDebugScreenPrintf("load failed. return value: %d\n", rets);
}
else
pspDebugScreenPrintf("load ok. return value: %d\n",rets);
while(!done){
pspDebugScreenSetXY(0, 2);
sceCtrlReadBufferPositive(&pad, 1);
printf("This is a PSP key test program. have fun! www.ACGclub.com \n");
printf("Analog X = %d ", pad.Lx);
printf("Analog Y = %d \n", pad.Ly);
FillRect(x-1,y-1,19,19, ARGB(255,0,0,0));
DrawPic(x,y, flag, color);
if (pad.Buttons != 0){
if (pad.Buttons & PSP_CTRL_SQUARE){
printf("Square pressed \n");
flag = 1;
}
if (pad.Buttons & PSP_CTRL_TRIANGLE){
printf("Triangle pressed \n");
flag =0;
}
if (pad.Buttons & PSP_CTRL_CIRCLE){
printf("Cicle pressed \n");
flag =3;
}
if (pad.Buttons & PSP_CTRL_CROSS){
printf("Cross pressed \n");
flag =2;
}
if (pad.Buttons & PSP_CTRL_UP){
printf("Up pressed \n");
y--;
if(y<0){
y=0;
}
}
if (pad.Buttons & PSP_CTRL_DOWN){
printf("Down pressed \n");
y++;
if(y>SCREEN_HEIGHT) y=SCREEN_HEIGHT;
}
if (pad.Buttons & PSP_CTRL_LEFT){
printf("Left pressed \n");
x--;
if(x<0) x=0;
}
if (pad.Buttons & PSP_CTRL_RIGHT){
printf("Right pressed \n");
x++;
if(x>SCREEN_WIDTH) x=SCREEN_WIDTH;
}
if (pad.Buttons & PSP_CTRL_START){
printf("Start pressed \n");
Counter++;
if(Counter>3) Counter = 0;
switch(Counter){
case 0: color=ARGB(255, 255, 0, 0); break;
case 1: color=ARGB(255, 255, 255, 0); break;
case 2: color=ARGB(255, 255, 0, 255); break;
case 3: color=ARGB(255, 0, 255, 0); break;
}
}
if (pad.Buttons & PSP_CTRL_SELECT){
printf("Select pressed \n");
}
if (pad.Buttons & PSP_CTRL_LTRIGGER){
printf("L-trigger pressed \n");
}
if (pad.Buttons & PSP_CTRL_RTRIGGER){
printf("R-trigger pressed \n");
}
}
}
sceKernelExitGame();
return 0;
}
|
I modify the code base on RemaPSP. I modify the
void overrideControls(SceCtrlData *pad_data)
function, left others. |
|
| Back to top |
|
 |
ldqmoon
Joined: 04 Dec 2007 Posts: 13
|
Posted: Sun Jul 13, 2008 12:40 pm Post subject: |
|
|
I find out that when I call moduleHookFunc function like this:
ret = moduleHookFunc(&mainHookSave[x].modfunc, sceKernelSearchModuleByName(mainHookSave[x].modname), mainHookSave[x].libname, mainHookSave[x].nid, mainHookSave[x].func);
it always stop here( the red line next), and return 2, it seems no address found.
the moduleHookFunc function from the module.c,
u32 moduleHookFunc (ModuleFunc *modfunc, SceUID modid, const char *library, SceUID nid, void *func)
{
u32 *addr;
// Verify parameters
if ((!(modfunc)) || (!(library)) || (!(func))) return 1;
// Find address of function in entry table and get pointer in entry table
addr = moduleFindFunc(moduleFindLibrary(modid,library),nid);
// If not found
if (!(addr)) return 2;
// Copy address of function in structure
modfunc->addr = *addr;
// Find address of function in syscall table and get pointer in syscall table
modfunc->sysaddr = moduleFindSyscallFunc(modfunc->addr);
// If not found
if (!(modfunc->sysaddr)) return 3;
// Hook function (copy func address to syscall table, overwrite old func)
return moduleHookAddr(modfunc->sysaddr,(u32) func);
} |
|
| Back to top |
|
 |
|
|
You cannot post new topics in this forum You cannot reply to topics in this forum You cannot edit your posts in this forum You cannot delete your posts in this forum You cannot vote in polls in this forum
|
Powered by phpBB © 2001, 2005 phpBB Group
|