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 

OSK hook for PSPZ/piKey/...[doesn't work]

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



Joined: 05 Jan 2008
Posts: 489

PostPosted: Sun Aug 10, 2008 9:13 pm    Post subject: OSK hook for PSPZ/piKey/...[doesn't work] Reply with quote

I admit it...even if i wrote a document on PSP architecture (in italian language, someone willing to host??) i never got into that little idiosyncrasies around PSP_MODULE_INFO or into user-kernel wars. Long ago I wrote a (very coarse) [vsh module]/[pikey plugin] to hook sony's OSK, because i think THAT's the way things are to be done to add an input periferal to non-predisposed software. Not faking presses. But it never worked, despite its simplicity: maybe i'm missing something very stupid. Since i usually start 1000 projects together and rarely finish one, i'll publish this so one of you can make it work (it would be nice to make it work with jube's touchscreen)
Here's the sample: please don't argue on coding style...continuous changes and cut'npaste to test things quite deteriorated it. You can compile it as a pikey plugin or as a standalone vsh plugin. It should put "OSK Hook Test" string every time OSK gets called (without showing you anything) creating a small log file called jLog.txt on MS root.
Here's the code:
oskHookOut.c:
Code:

// don't know if i'm really using all this stuff, but..hey, it's a test, who cares?
#include <pspkernel.h>
#include <pspdebug.h>
#include <pspdisplay.h>
#include <pspctrl.h>
#include <pspsdk.h>
#include <psputility.h>
#include <psppower.h>
#include <stdio.h>
#include <string.h>
#include <pspreg.h>
#include "../sdk/outputdriver.h"
#include "../sdk/outputframework.h"

#include <psputility_osk.h>

//PSP_MODULE_INFO("piKeyOSKHookOut", 0x1000, 1, 1); // for pikey module usage
PSP_MODULE_INFO("piKeyOSKHookOut", 0x1006, 1, 1); // for stand-alone usage

#define   DRIVERVER   "1"
#define REQUIREDVER   1

SceUID mainthread;

typedef struct MainHook
{
 u32  hookid;
 char modname[32];
 char libname[32];
 u32 nid;
 void *func;
} MainHook;

int sceUtilityOskInitStart_Hook(SceUtilityOskParams* params);
int sceUtilityOskShutdownStart_Hook(void);
int sceUtilityOskUpdate_Hook(int n);
int sceUtilityOskGetStatus_Hook(void);

void jLog(char * text);

MainHook mainHookSave[] =
{
   { 0, "sceUtility_Driver", "sceUtility",      0xF6269B82, sceUtilityOskInitStart_Hook },    // maybe NIDs are wrong????
   { 0, "sceUtility_Driver", "sceUtility",      0x3DFAEBA9, sceUtilityOskShutdownStart_Hook },
   { 0, "sceUtility_Driver", "sceUtility",      0x4B85C861, sceUtilityOskUpdate_Hook },
   { 0, "sceUtility_Driver", "sceUtility",      0xF3F76017, sceUtilityOskGetStatus_Hook },
   { 0, "", "", 0, NULL }
};

int getDriverInfo(DRIVERINFO *infostruct){ // required if you wish to use this as a pikey module

   unsigned int k1 = pspSdkSetK1(0);

   strcpy(infostruct->driverVersion, DRIVERVER);
   if(infostruct->apiVersion < REQUIREDVER) {
      pspSdkSetK1(k1);    
      return PIKEY_ERROR_VERSION;
   } else {
      strcpy(infostruct->driverName, "OSK");
      infostruct->apiVersion = PIKEY_THIS_VERSION;
      infostruct->unicodeSupported = FALSE;
      pspSdkSetK1(k1);
      return PIKEY_SUCCESS;
   }
   pspSdkSetK1(k1); //never reached....again, who cares?
}

int oskoutMain(SceSize args, void *argp) {

   jLog("\r\njModule starting\r\n");

   int x;
   
   jLog("waiting for OSK module to load...\r\n");
   waitForModule("sceUtility_Driver");
   jLog("OSK module loaded\r\n");

   sceCtrlSetSamplingMode(PSP_CTRL_MODE_ANALOG); // don't really need this

   jLog("Patching syscall table...\r\n");

   for (x=0;mainHookSave[x].func != NULL;x++)
   {
     mainHookSave[x].hookid = apiHookByNid(mainHookSave[x].modname,   mainHookSave[x].libname,
                                                         mainHookSave[x].nid,
                                                         mainHookSave[x].func);
         if (mainHookSave[x].hookid == -1)
            jLog("-no good\r\n");
         else
            jLog("-ok\r\n");
   }

   jLog("Finished patching. ready\r\n\r\n\r\n");
   
   sceKernelSleepThreadCB();

   jLog("!!!END REACHED!!!\r\n\r\n\r\n");

   return 0;
}

int main(void) {
   mainthread = sceKernelCreateThread("oskHookOut", oskoutMain, 16, 0x800, 0, NULL);
   if (mainthread >= 0)
      sceKernelStartThread(mainthread, 0, NULL);
   
   return 0;
}

void module_stop(void)
{
   // should un-hook fns
}

void* getModuleInfo(void) {
   return (void *) &module_info;
}

int module_start(SceSize args, void *argp) __attribute__((alias("_start")));

int _start(SceSize args, void *argp)
{
   return main();
}

//---------------------------- hook functions ------------------------

int sceUtilityOskInitStart_Hook(SceUtilityOskParams* params) // please notice that in all hook functions i'm avoiding calls to original fns...
{
   unsigned char test[] = { 'O','S','K',' ','H','o','o','k',' ','T','e','s','t', 0 }; // test string to place in outtext
   unsigned char * p = (unsigned char *)params->data->outtext;
   
   int len = params->data->outtextlength;
   
   int i=0;
   while (test[i] && i<len)
   {
      *p = test[i];
      p++;
      i++;
   }
   *p = 0; // make sure string is terminated

   jLog("* called sceUtilityOskInitStart\r\n");

   return 0; // all OK!
}

int sceUtilityOskShutdownStart_Hook(void)
{
   jLog("* called sceUtilityOskShutdownStart\r\n");
   // ignore for now   
   return 0; // all OK!
}

int sceUtilityOskUpdate_Hook(int n)
{
   jLog("* called sceUtilityOskUpdate\r\n");
   // ignore for now
   return 0; // all OK!
}

int sceUtilityOskGetStatus_Hook(void)
{
   jLog("* called sceUtilityOskGetStatus\r\n");
   return PSP_UTILITY_DIALOG_FINISHED;
}

void jLog(char * text)
{
   int nChars = 0;
   int fdout = sceIoOpen("ms0:/jLog.txt", PSP_O_WRONLY | PSP_O_CREAT /*| PSP_O_TRUNC*/ | PSP_O_APPEND, 0777);   

   char * oText = text;

   while (*text)
   {
      text++;
      nChars++;
   }

   int bw = sceIoWrite(fdout, oText, nChars);   
   
   sceIoClose(fdout);

}



exports.exp:
Code:

PSP_BEGIN_EXPORTS
PSP_EXPORT_START(syslib, 0, 0x8000)
PSP_EXPORT_FUNC_HASH(module_start)
PSP_EXPORT_VAR_HASH(module_info)
PSP_EXPORT_END
PSP_EXPORT_START(piKeyOSKout, 0, 0x0001)
PSP_EXPORT_FUNC_HASH(getDriverInfo)
PSP_EXPORT_END
PSP_END_EXPORTS


Makefile:
Code:

TARGET = piKeyOSKHookOut
OBJS = oskHookOut.o

USE_KERNEL_LIBS = 1
USE_KERNEL_LIBC = 1
PSP_FW_VERSION = 390
BUILD_PRX = 1
PRX_EXPORTS = exports.exp

INCDIR =
CFLAGS = -O2 -G0 -Wall
CXXFLAGS = $(CFLAGS) -fno-exceptions -fno-rtti
ASFLAGS = $(CFLAGS)

LIBDIR =
LDFLAGS = -mno-crt0

PSPSDK=$(shell psp-config --pspsdk-path)
include $(PSPSDK)/lib/build.mak

LIBS += -lpsppower_driver -lpspreg_driver ../sdk/framework_stub.o
LDFLAGS += -specs=../sdk/prxspecs


...because of some include, should be compiled standing in pikey\src\oskHookOut (obviously of a working pikey's source like the one i posted months ago and now is down because my site no longer exists...)

Hope we'll make it work!

jean
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