@@ -21,8 +21,8 @@ enum PspCtrlButtons PSP_CTRL_ENTER, PSP_CTRL_CANCEL;
2121BROWSE_STATE device = BROWSE_STATE_EXTERNAL;
2222int g_psp_language = PSP_SYSTEMPARAM_LANGUAGE_ENGLISH;
2323
24- extern unsigned char audio_driver_prx_start[], display_driver_prx_start[], fs_driver_prx_start[];
25- extern unsigned int audio_driver_prx_size, display_driver_prx_size, fs_driver_prx_size;
24+ extern unsigned char audio_driver_prx_start[], display_driver_prx_start[], fs_driver_prx_start[], module_driver_prx_start[] ;
25+ extern unsigned int audio_driver_prx_size, display_driver_prx_size, fs_driver_prx_size, module_driver_prx_size ;
2626
2727namespace Utils {
2828 constexpr unsigned int CTRL_DEADZONE_DELAY = 500000 ;
@@ -33,6 +33,7 @@ namespace Utils {
3333 static int last_button_tick = 0 , deadzone_tick = 0 ;
3434 static bool usb_module_loaded = false ;
3535 static bool usb_actived = false ;
36+ static SceUID module_driver_id = 0 ;
3637
3738 typedef struct {
3839 const char *path = nullptr ;
@@ -116,7 +117,7 @@ namespace Utils {
116117 }
117118
118119 // Basically removes and re-creates prx from memory -> then remove it after inital load
119- static int LoadStartModuleMem (const char *path, const void *buf, SceSize size) {
120+ static int LoadStartModuleMemInitial (const char *path, const void *buf, SceSize size) {
120121 int ret = 0 ;
121122 SceUID modID = 0 ;
122123
@@ -140,6 +141,23 @@ namespace Utils {
140141 return 0 ;
141142 }
142143
144+ static int LoadStartModuleMem (const char *path, void *buf, SceSize size) {
145+ int ret = 0 ;
146+ SceUID modID = 0 ;
147+
148+ if (R_FAILED (ret = modID = pspKernelLoadModuleBuffer (size, buf, 0 , nullptr ))) {
149+ Log::Error (" kuKernelLoadModule(%s) failed: 0x%08x\n " , path, ret);
150+ return ret;
151+ }
152+
153+ if (R_FAILED (ret = sceKernelStartModule (modID, 0 , nullptr , nullptr , nullptr ))) {
154+ Log::Error (" sceKernelStartModule(%s) failed: 0x%08x\n " , path, ret);
155+ return ret;
156+ }
157+
158+ return 0 ;
159+ }
160+
143161 static void StopUnloadModules (SceUID modID) {
144162 sceKernelStopModule (modID, 0 , nullptr , nullptr , nullptr );
145163 sceKernelUnloadModule (modID);
@@ -245,19 +263,23 @@ namespace Utils {
245263 }
246264
247265 void InitKernelDrivers (void ) {
266+ module_driver_id = LoadStartModuleMemInitial (" module_driver.prx" , module_driver_prx_start, module_driver_prx_size);
267+
248268 for (unsigned int i = 0 ; i < kernel_modules.size (); ++i)
249269 kernel_modules[i].id = Utils::LoadStartModuleMem (kernel_modules[i].path , kernel_modules[i].data , kernel_modules[i].size );
250270
251271 Utils::InitUSB ();
252272 }
253273
254274 void TermKernelDrivers (void ) {
275+ Utils::ExitUSB ();
276+
255277 for (int i = kernel_modules.size () - 1 ; i >= 0 ; --i) {
256278 Utils::StopUnloadModules (kernel_modules[i].id );
257279 kernel_modules[i].id = -1 ;
258280 }
259281
260- Utils::ExitUSB ( );
282+ Utils::StopUnloadModules (module_driver_id );
261283 }
262284
263285 void UpdateUSB (void ) {
0 commit comments