HostCore 1.2.1 - Используем файловую систему ПК на PSP
HostCore
HostCore - это плагин , позволяющий использовать цифровой контент на PSP с компьютера посредством USB подключения или Wi-Fi. Возможно использование аудио, видео, фото файлов, а также ISO/CSO с использованием сохранений с ПК, а также Homebrew
Внимание: ISO игры работают только со вставленым в UMD диском в режиме "Normal"
!Важно! Если у вас включен какой либо другой плагин с использованием клавиши нотка, например скриншотер, то его следует отключить либо изменить клавишу включения плагина. Об этом читайте ниже.
На компьютере запускаем usbhostfs.exe
!Важно! Если при попытке запустить файл usbhostfs.exe (пункт номер 3, главы "Приводим всё это в действие) вылазит ошибка: "Не удалось найти файл libusb0.dll", то просто копируем этот файл из папки "PSP-Type B" из архива в папку Windows).
На psp нажимаем нотку.
Жмем стрелку в право.
На компьютере появится установка драйвера для устройства "PSP TYPE B". Указываем путь к папке PSP TYPE B и устанавливаем драйвер.
На psp заходим в меню Игра => Карта памяти.
Смотрим результат =)
Файл конфигурации
В файле конфигурации вы можете менять клавишу активации плагина и настройки беспроводного подключения.
По умолчанию клавиша активации Quick Key "800000", то есть нотка. Так же можно использовать комбинации клавиш. Для этого следует умножить их Хекс-номера. Например селект(000001) и левый шифт(000100) - получаем 000101, это и следует вписывать в параметр Quick Key.
В настройках подключения есть 5 параметров:
IP компьютера (Если вы его не знаете сделайте следующее "Пуск - выполнить - cmd - ipconfig".)
karenjan99, ну берёшь PRXTool 1.1 by TyRaNiD, дизассемблишь файлы известных прошивок и ищешь там известные НИД-ы. Потом находишь в том же месте изменившиеся НИД-ы в 6.61
syspatch.c
/*
* syspatch.c is part of HostCore
* Copyright (C) 2008 Poison
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
/*
* De******ion:
* Author: Poison <hbpoison@gmail.com>
* Date Created: 2008-05-15
*/
#include <pspkernel.h>
#include <pspsdk.h>
#include <psputilsforkernel.h>
#include <pspsysmem_kernel.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "utils.h"
int fw_version = FW_371;
int model = PSP_MODEL_STANDARD;
int ( * getDevkitVersion )( void );
int initPatches( void )
{
getDevkitVersion = ( void * )findProc( "sceSystemMemoryManager", "SysMemUserForUser", 0x3FC9AE6A );
fw_version = getDevkitVersion();
model = sceKernelGetModel();
//Disable slim specific patches
model = PSP_MODEL_STANDARD;
return fw_version;
}
unsigned int getFindDriverAddr( void )
{
tSceModule * pMod = ( tSceModule * )sceKernelFindModuleByName( "sceIOFileManager" );
unsigned int addr = 0;
if ( !pMod )
return 0;
if ( fw_version == FW_371 )
addr = pMod->text_addr + 0x00002844;
else if ( fw_version == FW_380 || fw_version == FW_390 )
addr = pMod->text_addr + 0x00002808;
else if ( fw_version == FW_401 )
addr = pMod->text_addr + 0x000027EC;
else if ( fw_version == FW_500 || fw_version == FW_550 )
addr = pMod->text_addr + 0x00002838;
return addr;
}
void getCtrlNids( unsigned int * nid )
{
if ( fw_version == FW_371 )
{
nid[0] = 0x454455ac; //sceCtrlReadBufferPositive
nid[1] = 0xc4aad55f; //sceCtrlPeekBufferPositive
}
else if ( fw_version == FW_380 || fw_version == FW_390 )
{
nid[0] = 0xad0510f6;
nid[1] = 0xd65d4e9a;
}
else if ( fw_version == FW_401 )
{
nid[0] = 0xBA664B5E;
nid[1] = 0x591B3F36;
}
else if ( fw_version == FW_500 || fw_version == FW_550 )
{
nid[0] = 0x919215D7;
nid[1] = 0x6B247CCE;
}
}
void getUtilsNids( unsigned int * nid )
{
if ( fw_version == FW_371 )
{
nid[0] = 0xa3d5e142; //sceKernelExitVSHVSH
nid[1] = 0xd9739b89; //sceKernelUnregisterExitCallback
nid[2] = 0x659188e1; //sceKernelCheckExitCallback
nid[3] = 0x49C5B9E1; //sceKernelLoadModuleForLoadExecVSHMs2
nid[4] = 0xa1a78C58; //sceKernelLoadModuleForLoadExecVSHDisc
}
else if ( fw_version == FW_380 || fw_version == FW_390 )
{
nid[0] = 0x62879ad8;
nid[1] = 0xf1c99c38;
nid[2] = 0x753ef37c;
nid[3] = 0x42ED1407;
nid[4] = 0xc8f0090d;
}
else if ( fw_version == FW_401 )
{
nid[0] = 0xCA8011A2;
nid[1] = 0x5AF87B62;
nid[2] = 0x6274D0D5;
nid[3] = 0x313F2757;
nid[4] = 0x83B28C87;
}
else if ( fw_version == FW_500 || fw_version == FW_550 )
{
nid[0] = 0x94A1C627;
nid[1] = 0x71F9FB1B;
nid[2] = 0x2E96EDF8;
nid[3] = 0xB8E49712;
nid[4] = 0x7C8A2B62;
}
}
unsigned int getKillMutexNid()
{
return 0xf8170fbe;
}
void getDisplayNids( unsigned int * nid )
{
if ( fw_version == FW_371 )
{
nid[0] = 0xe56b11ba;
nid[1] = 0x7fba941a;
}
else if ( fw_version == FW_380 || fw_version == FW_390 )
{
nid[0] = 0x3749cda0;
nid[1] = 0xc89e1f1d;
}
else if ( fw_version == FW_401 )
{
nid[0] = 0xC28EFAA7;
nid[1] = 0xC922270C;
}
else if ( fw_version == FW_500 || fw_version == FW_550 )
{
nid[0] = 0xD8D2FD35;
nid[1] = 0xFBDA7A1E;
}
}
void patchMemPartitionInfo()
{
if ( model == PSP_MODEL_STANDARD ) sceKernelSetDdrMemoryProtection( ( void * )0x88300000, 0x00100000, 0xf );
else sceKernelSetDdrMemoryProtection( ( void * )0x88600000, 0x00200000, 0xf );
tSceModule * pMod = ( tSceModule * )sceKernelFindModuleByName( "sceSystemMemoryManager" );
// 0x02001021 move $v0 $s0
int offset = 0x00001304;
if ( fw_version == FW_371 || fw_version == FW_380 || fw_version == FW_390 )
{
offset = 0x00001304; //for 3.71, 3.80, 3.90
}
else if ( fw_version == FW_401 )
{
offset = 0x00003A68; //for 4.01
}
else if ( fw_version == FW_500 || fw_version == FW_550 )
{
offset = 0x00003AA8; //for 5.00
}
_sw( 0x02001021, pMod->text_addr + offset );
sceKernelIcacheInvalidateAll();
sceKernelDcacheWritebackInvalidateAll();
PspSysmemPartitionInfo info;
memset( &info, 0, sizeof( PspSysmemPartitionInfo ) );
info.size = sizeof( PspSysmemPartitionInfo );
PspSysmemPartitionInfo * p_info = ( PspSysmemPartitionInfo * )sceKernelQueryMemoryPartitionInfo( 4, &info );
if ( model == PSP_MODEL_STANDARD ) p_info->startaddr = 0x08300000;
else p_info->startaddr = 0x08600000;
p_info->attr = 0xf;
//restore
_sw( 0x00001021, pMod->text_addr + offset );
sceKernelIcacheInvalidateAll();
sceKernelDcacheWritebackInvalidateAll();
}
typedef struct PatchSav
{
unsigned int addr;
unsigned int val;
} PatchSav;
PatchSav LoadExecVSHCommon_ori[2];
void restoreLoadExecVSHCommon()
{
_sw( LoadExecVSHCommon_ori[0].val, LoadExecVSHCommon_ori[0].addr );
_sw( LoadExecVSHCommon_ori[1].val, LoadExecVSHCommon_ori[1].addr );
sceKernelIcacheInvalidateAll();
sceKernelDcacheWritebackInvalidateAll();
}
void * patchLoadExecVSHCommon( void * func )
{
tSceModule * pMod = ( tSceModule * )sceKernelFindModuleByName( "sceLoadExec" );
if ( fw_version == FW_371 )
LoadExecVSHCommon_ori[0].addr = pMod->text_addr + 0x0000121c; //same in standare/slim
else if ( fw_version == FW_380 || fw_version == FW_390 )
LoadExecVSHCommon_ori[0].addr = pMod->text_addr + 0x000014cc; //same in standare/slim
else if ( fw_version == FW_401 )
LoadExecVSHCommon_ori[0].addr = pMod->text_addr + 0x00001E1C; //same in standare/slim
else if ( fw_version == FW_500 )
LoadExecVSHCommon_ori[0].addr = pMod->text_addr + 0x00001E58; //verified in phat
else if ( fw_version == FW_550 )
LoadExecVSHCommon_ori[0].addr = pMod->text_addr + 0x00001F3C; //same on slim & phat
LoadExecVSHCommon_ori[1].addr = LoadExecVSHCommon_ori[0].addr + 4;
LoadExecVSHCommon_ori[0].val = _lw( LoadExecVSHCommon_ori[0].addr );
LoadExecVSHCommon_ori[1].val = _lw( LoadExecVSHCommon_ori[1].addr );
MAKE_JUMP( LoadExecVSHCommon_ori[0].addr, func );
_sw( NOP, LoadExecVSHCommon_ori[1].addr );
sceKernelIcacheInvalidateAll();
sceKernelDcacheWritebackInvalidateAll();
return ( void * )LoadExecVSHCommon_ori[0].addr;
}
unsigned int modulemgr_offset = 0, threadman_offset = 0;
void wifiModulesPatch1()
{
tSceModule * pMod = ( tSceModule * )sceKernelFindModuleByName( "sceThreadManager" );
//a0 = 4, change partition id to 4
if ( fw_version == FW_371 )
threadman_offset = 0x00010B30;
else if ( fw_version == FW_380 || fw_version == FW_390 )
threadman_offset = 0x00010CB8;
else if ( fw_version == FW_401 )
threadman_offset = 0x00012154;
else if ( fw_version == FW_500 || fw_version == FW_550 )
threadman_offset = 0x000121E0;
_sw( 0x34040004, pMod->text_addr + threadman_offset );
pMod = ( tSceModule * )sceKernelFindModuleByName( "sceModuleManager" );
//a3 stack size 0x40000 -> 0x10000
if ( fw_version == FW_371 )
modulemgr_offset = 0x000076A0;
else if ( fw_version == FW_380 || fw_version == FW_390 )
modulemgr_offset = 0x00007C9C;
else if ( fw_version == FW_401 )
modulemgr_offset = 0x00007C50;
else if ( fw_version == FW_500 )
modulemgr_offset = 0x00007C84;
//added for 5.50
else if ( fw_version == FW_550 )
modulemgr_offset = 0x00007F80;
_sw( 0x3C070001, pMod->text_addr + modulemgr_offset );
sceKernelIcacheInvalidateAll();
sceKernelDcacheWritebackInvalidateAll();
}
void wifiModulesPatch2()
{
if ( fw_version == FW_550 ) {
//module renamed to sceNet_Service in 5.50
tSceModule * pMod = ( tSceModule * )sceKernelFindModuleByName( "sceNet_Service" );
//a2 partid = 4 of ifhandle
_sw( 0x34050004, pMod->text_addr + 0x000014D8 ); //for 5.50
} else {
tSceModule * pMod = ( tSceModule * )sceKernelFindModuleByName( "sceNetInterface_Service" );
_sw( 0x34050004, pMod->text_addr + 0x00001440 ); //for 3.71, 3.80, 3.90, 4.01, 5.00
}
tSceModule * pMod = ( tSceModule * )sceKernelFindModuleByName( "sceNet_Library" );
unsigned int net_offset = 0;
if ( fw_version == FW_371 || fw_version == FW_380 || fw_version == FW_390 )
net_offset = 0x00001800;
else if ( fw_version == FW_401 )
net_offset = 0x00002320;
else if ( fw_version == FW_500 || fw_version == FW_550 )
net_offset = 0x00002348;
_sw( 0x34020002, pMod->text_addr + net_offset );
_sw( 0xAFA20000, pMod->text_addr + net_offset + 0x4 );
_sw( 0x3C020000, pMod->text_addr + net_offset + 0xC );
pMod = ( tSceModule * )sceKernelFindModuleByName( "sceModuleManager" );
//a3 stack size 0x10000 -> 0x4000
_sw( 0x34074000, pMod->text_addr + modulemgr_offset );
sceKernelIcacheInvalidateAll();
sceKernelDcacheWritebackInvalidateAll();
}
void wifiModulesPatch3()
{
tSceModule * pMod = ( tSceModule * )sceKernelFindModuleByName( "sceModuleManager" );
//restore
_sw( 0x02403821, pMod->text_addr + modulemgr_offset );
pMod = ( tSceModule * )sceKernelFindModuleByName( "sceThreadManager" );
//restore
_sw( 0x02402021, pMod->text_addr + threadman_offset );
sceKernelIcacheInvalidateAll();
sceKernelDcacheWritebackInvalidateAll();
}
Прошу любить и жаловать, Ваш Добро пожаловать в наш Чат в Telegram
сорри еще вопросик а для NID-ов prx надо перегнать через файл xmlfile.bat?
Нет, его (PRX) нужно дизассемблировать через 17. DISASM.bat или 22. DISASM & DISOPTS & FUNCS.bat. Я не помню, как там точно этот пункт называется в той версии, т.к. у меня раздробленная версия на более мелкие операции и названия файлов уже совсем другие. Короче, там должно быть в названии слово DISASM.
Очистка результатов работы производится батником 00. CLEAR ALL.BAT
Прошу любить и жаловать, Ваш Добро пожаловать в наш Чат в Telegram
Последний раз редактировалось ErikPshat; 14.06.2016 в 17:27.
А для поиска нужных НИД-ов юзай Replace Studio
В поле "Путь" указывай на папку:
C:\pspsdk\doc\pspsdk\silverspring.lan.st
В поле "Маска файлов" выставь *.xml (т.е. искать в файлах с любым именем и с XML расширением после точки, т.к. все НИД-ы прописаны в XML файлах)
В поле "Найти" забивай номер НИД-а без нуля в начале (0x).
Потом нажимай синий бинокль для поиска.
Будь осторожен, если случайно нажмёшь на фиолетовый бинокль, то будет происходить замена на то, что прописано в поле "Заменить", даже если там пусто, то заменится на пусто , т.е. удалится искомое. Хотя там настройки должны стоять так, что перед заменой будет выводится запрос на выполнение.
Прошу любить и жаловать, Ваш Добро пожаловать в наш Чат в Telegram
Последний раз редактировалось ErikPshat; 14.06.2016 в 18:37.
А что там получаться? Всё легко и просто. По названию функции в версии 5.00 из исходников, ты находишь её и можно догадаться название PRX файла. Потом дизассемблишь PRX и находишь через текстовый редактор этот NID. Потом дизассемблишь этот же файл от прошивки 6.61 и ищешь тоже самое место по схожему окружению и определяешь новый NID. Потом заменяешь все НИД-ы от 6.61 в исходнике и компилируешь командой "make" в той папке исходников, где находится файл "Makefile".
Правда я скачал исходники отсюда: https://code.google.com/archive/p/ho...default/source
Прошу любить и жаловать, Ваш Добро пожаловать в наш Чат в Telegram
Последний раз редактировалось ErikPshat; 14.06.2016 в 19:12.
Другие консоли: PS1, PS2, PS3, PSVITA, XBOX360, XBOX ONE
Регистрация: 07.03.2015
Возраст: 34
Сообщений: 419
Вы сказали Спасибо: 3
Поблагодарили 57 раз(а) в 43 сообщениях
Сила репутации: 1
Репутация: 57 
(скоро придёт к известности)
компилятор поставил дальше с архива папку pspsdk полностью копировать в папку doc? эти файлы md5 html map всё надо копировать туда?
karenjan99 добавил 14.06.2016 в 19:01
сорри а тупость при открытии ехе Replace Studio винда требует пароль, вообще то никаког пароля я не поставил на винде что делать? smartscreen предотвратил запуск бла бла бла требуется уттверждение администратором
Последний раз редактировалось karenjan99; 14.06.2016 в 19:02.
Причина: добавил, подумав
при открытии ехе Replace Studio винда требует пароль
Хех, ну так это же обычная программа, устанавливается точно так же, как и все обычные программы.
Ты когда-нибудь ставил программы?
Ну просто соглашайся на установку. Может требует не пароль, а цифровую подпись, т.к. инсталлятор же не подписан официально.
Либо запускай от имени Администратора.
Прошу любить и жаловать, Ваш Добро пожаловать в наш Чат в Telegram
Другие консоли: PS1, PS2, PS3, PSVITA, XBOX360, XBOX ONE
Регистрация: 07.03.2015
Возраст: 34
Сообщений: 419
Вы сказали Спасибо: 3
Поблагодарили 57 раз(а) в 43 сообщениях
Сила репутации: 1
Репутация: 57 
(скоро придёт к известности)
ErikPshat, не не я даже не установил просто когда открыл установщик винда требовала утверждение админа паролем отключил smartscreen на пять минут все пошло
ну а теперь
Сообщение от karenjan99
компилятор поставил дальше с архива папку pspsdk полностью копировать в папку doc? эти файлы md5 html map всё надо копировать туда?
Какой нахрен smartscreen ну ты же знаешь, когда запускаешь кейгены или любые взломанные программы, то такие вот smartscreen-ы и прочие фильтры и антивирусы обычно всегда ругаются и блокируют, т.к. разработчики программ постоянно жалуются производителям антивирусов на патчи, кейгены, взломанные программы, которые находят в сети, а те, в свою очередь, заносят сигнатуры этих программ в базу данных своих антивирусов, которые потом ругаются.
Не, ну это же ты должен сам знать и понимать. Антивирусы и всякие блокировщики smartscreen-ы, нужно отключать перед установкой программы, если они проявили такой интерес к заведомо чистой программе.
А так же понимать, что я, как админ ресурса, не буду пихать в свои сборки всякие вирусы, за чистоту своих сборок отвечаю!
Прошу любить и жаловать, Ваш Добро пожаловать в наш Чат в Telegram
Другие консоли: PS1, PS2, PS3, PSVITA, XBOX360, XBOX ONE
Регистрация: 07.03.2015
Возраст: 34
Сообщений: 419
Вы сказали Спасибо: 3
Поблагодарили 57 раз(а) в 43 сообщениях
Сила репутации: 1
Репутация: 57 
(скоро придёт к известности)
ErikPshat, да нет сам не пользуюсь антивирусами, а вот smartscreen до сех пор не знал что эт такое никогда при открытии еще не мешала. я то думал отключением defendera все проблемы ушли от меня оказывается в винде есть еще один хрен
с архива папку pspsdk полностью копировать в папку doc? эти файлы md5 html map всё надо копировать туда?
Эмм, ты архив распакуй снаружи на рабочий стол. Думаю ты должен знать, как работать с архивами. Я обычно открываю архивы в архиваторе и смотрю, что там внутри. Если там отдельная папка, то я её извлекаю. А если там сразу куча папок и файлов, то я извлекаю архив снаружи в "название папки", чтобы все файлы и папки изнутри не рассыпались по всему рабочему столу или где бы то ни было.
Потом ты сверяешь структуру каталогов этого распакованного архива со структурой каталогов в C:\pspsdk\doc
Тут думаю должно быть понятно, что структура должна сойтись точно так же, как я написал пути выше в сообщении: https://www.pspx.ru/forum/showpost.ph...8&postcount=31
Прошу любить и жаловать, Ваш Добро пожаловать в наш Чат в Telegram
Другие консоли: PS1, PS2, PS3, PSVITA, XBOX360, XBOX ONE
Регистрация: 07.03.2015
Возраст: 34
Сообщений: 419
Вы сказали Спасибо: 3
Поблагодарили 57 раз(а) в 43 сообщениях
Сила репутации: 1
Репутация: 57 
(скоро придёт к известности)
сразу не заметил что остальные присутствуют в папке pspsdk, осталось найти НИД-Ы
karenjan99 добавил 14.06.2016 в 19:52
мда уж небольшая проблемка карта памяти еще не пришла с алиекспреса с 32мб картой я точно декриптую файлы. по одному
качал файлы для 6.60 вот думаю попробовать на 6.60?
karenjan99 добавил 14.06.2016 в 19:54
если найдется время декриптуй файлы 6.61 заодно и в базе будет
karenjan99 добавил 14.06.2016 в 23:30 ErikPshat, можешь выложить конфиг редактора? я чет не мог разобратся и сделать так чтоб оффсеты подсвечивались
karenjan99 добавил 15.06.2016 в 00:45
так вот нашел пока двое.
в syspatch 0x919215D7 (строка87) 0x6B247CCE(строка88) нашел в файле от 5.00 ctrl.prx открыл DISASM & DISOPTS & FUNCS создались несколько текстовиков один из них 17_DISASM_wiXDRSMW размер у него самый большой искать надо в нем? я искал в другом и нашел
потом тоже самое сделал с ctrl.prx от 6.60 в нем нашел ту же строку scepeekbuffer и т.д
надеюсь все правильно?
Последний раз редактировалось karenjan99; 15.06.2016 в 00:47.
Причина: добавил, подумав