forums.ps2dev.org Forum Index forums.ps2dev.org
Homebrew PS2, PSP & PS3 Development Discussions
 
 FAQFAQ   SearchSearch   MemberlistMemberlist   UsergroupsUsergroups   RegisterRegister 
 ProfileProfile   Log in to check your private messagesLog in to check your private messages   Log inLog in 

what is " sceKernelSearchModuleByName "

 
Post new topic   Reply to topic    forums.ps2dev.org Forum Index -> PSP Development
View previous topic :: View next topic  
Author Message
ldqmoon



Joined: 04 Dec 2007
Posts: 13

PostPosted: Sun Jul 06, 2008 7:39 pm    Post subject: what is " sceKernelSearchModuleByName " Reply with quote

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
View user's profile Send private message
Pirata Nervo



Joined: 09 Oct 2007
Posts: 409

PostPosted: Sun Jul 06, 2008 8:58 pm    Post subject: Reply with quote

thid is meant to be "thread ID" and that function is for modules not threads :P
However, you can give whatever name you want.

the function is:
SceModule* sceKernelFindModuleByName(const char * modname);

http://alek.dark-alex.org/pspsdkdocs/group__LoadCore.html#g3041d89b2dd273cf191738ee904fd688
_________________

Upgrade your PSP
Back to top
View user's profile Send private message
moonlight



Joined: 26 Oct 2005
Posts: 567

PostPosted: Mon Jul 07, 2008 3:05 am    Post subject: Reply with quote

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
View user's profile Send private message
ldqmoon



Joined: 04 Dec 2007
Posts: 13

PostPosted: Tue Jul 08, 2008 9:20 pm    Post subject: Thank you Reply with quote

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
View user's profile Send private message
ldqmoon



Joined: 04 Dec 2007
Posts: 13

PostPosted: Sun Jul 13, 2008 12:40 pm    Post subject: Reply with quote

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
View user's profile Send private message
Display posts from previous:   
Post new topic   Reply to topic    forums.ps2dev.org Forum Index -> PSP Development All times are GMT + 10 Hours
Page 1 of 1

 
Jump to:  
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