• PS3HEN is now supporting 4.93 Firmware

    View Official Release Post for additional information HERE

PS3HEN [Support Thread] PS3HEN Bugs, Problems, and Other Issues

How to access this interface correctly, can you tell me? Like through 11 function, but I don't understand the parameters.

The function 11 are XMBML commands found in XML files like category_game.xml and other xml files used in XMB.

There is very few information about how it is used. Most of the known commands were inferred by DeViL303 and Team XMBM+

The known operators and parameters used in the queries are documented in this page.
https://www.psdevwiki.com/ps3/XMBML_Functions#xcb:.2F.2Flocalhost.2Fquery.3F

These queries are used to list the games stored in the XMB database. These entries are usually created when a game is installed or a media file is copied to the system.

If you want to learn more about XMBML, I suggest that review how Package Manager in category_game.xml and other XML menus were created. webMAN MOD and Ultimate Toolbox implement XMBML extensively.

You can use webMAN MOD's web command /xmb.ps3$<explore_plugin_command> to perform explore_plugin operations, like jump to a column, open a folder menu, scroll down, execute, close a list, etc.
https://www.psdevwiki.com/ps3/Explore_plugin#Example_XMB_Commands:

Function 23 can be tested with the web command /xmb.ps3*<xmb_plugin_command>
https://www.psdevwiki.com/ps3/Xmb_plugin#Function_23_Examples

These commands can be used in XMB menus and custom combos in webMAN MOD to automate tasks on XMB.
 
How to access this interface correctly, can you tell me? Like through 11 function, but I don't understand the parameters.
Once you have the interface loaded into an explore_interface struct in your code you should be able to use its functions, here's the header lifted from wMM:
Code:
typedef struct
{
	int (*DoUnk0)(int);                             // 1 Parameter: int value 0 - 4
	int (*DoUnk1)(void);                            // 0 Parameter: returns an interface
	int (*DoUnk2)(void);                            // 0 Parameter: returns an interface
	int (*DoUnk3)(void);                            // 0 Parameter: returns an uint[0x14 / 0x24]
	int (*DoUnk4)(void);                            // 0 Parameter
	int (*DoUnk5)(void *, int);                     // 2 Parameter: list[] {(reload_category game/network/..,reload_category_items game/...), command amount}  - send (sequences of)xmb command(s)
	int (*ExecXMBcommand)(const char *,void *,int); // 3 Parameter: char* (open_list nocheck/...), void * callback(can be 0), 0
	int (*DoUnk7)(int,int);                         // 2 Parameter:
	int (*DoUnk8)(void *,int,int);                  // 3 Parameter:
	int (*DoUnk9)(void *,int,int);                  // 3 Parameter: void *, void *, void *
	int (*DoUnk10)(int*,char *);                    // 2 Parameter: char * , int * out
	int (*DoUnk11)(char *, char *, int *);          // 3 Parameter: char * query , char * attribute? , uint8 output[]
	int (*DoUnk12)(void *);                         // 1 Parameter: struct
	int (*DoUnk13)(int);                            // return 0 / 1 Parameter: int 0-9
	int (*DoUnk14)(int);                            // return 0 / 2 Parameter: int 0-9,
	int (*DoUnk15)(int,int,int);                    // 3 Parameter: int 0-9, ,
	int (*DoUnk16)(int,int,int);                    // nullsub / 3 Parameter: int 0-9, ,
	int (*DoUnk17)(int,int,int*,int*,int*);         // 5 Parameter: int 0-9,
	int (*DoUnk18)(int);                            // 1 Parameter:
	int (*DoUnk19)(int);                            // 1 Parameter:
	int (*DoUnk20)(int,uint64_t);                   // nullsub / PlayIndicate, 2 Parameter: , int value, (0 = show?, 1=update?, -1 = hide) -  (set_playing 0x%x 0x%llx 0x%llx 0x%llx 0x%llx")
	int (*DoUnk21)(void *);                         // nullsub / 1 Parameter: uint * list (simply both parameter from 20/2 and 3rd terminating = -1)
	int (*DoUnk22)(void *);                         // 0 Parameter / 1 Parameter:
	int (*DoUnk23)(void);                           // -
	int (*DoUnk24)(void);                           // 0 Parameter:
	int (*DoUnk25)(void);                           // 0 Parameter: // get target id check
	int (*DoUnk26)(char *, char *);                 // 2 Parameter: char * (TropViewMode/backup/FaustPreview...) , char * (group/fixed/on...)
	int (*DoUnk27)(void *);                         // 1 Parameter: char *
	int (*DoUnk28)(char *, void *);                 // 2 Parameter: char * (ReloadXil/AvcRoomItem/...), uint8 xml?_parameters[]
	int (*DoUnk29)(char *, void *);                 // 2 Parameter: char * ,
} explore_plugin_interface;
 
explore_plugin_interface * explore_interface;

I haven't tried to use function 11 so far but I assume you would need to do something along those lines:

Code:
extern uint32_t paf_F21655F3(const char *sprx_name);  
#define View_Find paf_F21655F3

static explore_plugin_interface *get_explore_interface(void)
{
	int view = paf_F21655F3("explore_plugin");
	if(view)
		explore_interface = (explore_plugin_interface *)plugin_GetInterface(view, 1);
	else
		explore_interface = NULL;
 
	return explore_interface;
}

explore_plugin_interface *xplore_if = get_explore_interface();
if(xplore_if){
uint8_t output[whatever output size] = {};
int ret = xplore_if->DoUnk11("xcb://localhost/query?table=MMS_MEDIA_TYPE_SYSTEM&cond=Ae+StorageMedia:StorageMedia.stat.mediaStatus %xCB_MEDIA_INSERTED+AGL+StorageMedia:StorageMedia.type %xCB_MEDIA_TYPE_PS3_BD %xCB_MEDIA_TYPE_DVDPRW+Aa+StorageMedia:StorageMedia.reserved24
", "StorageMedia:StorageMedia.reserved24", output);
....
}
 
Last edited:
Once you have the interface loaded into an explore_interface struct in your code you should be able to use its functions, here's the header lifted from wMM:
Code:
typedef struct
{
...
    int (*DoUnk11)(char *, char *, int *);          // 3 Parameter: char * query , char * attribute? , uint8 output[]
...
}

explore_plugin_interface *xplore_if = get_explore_interface();
uint8_t output[whatever output size] = {};
int ret = xplore_if->DoUnk11("xcb://localhost/query?table=MMS_MEDIA_TYPE_SYSTEM&cond=Ae+StorageMedia:StorageMedia.stat.mediaStatus %xCB_MEDIA_INSERTED+AGL+StorageMedia:StorageMedia.type %xCB_MEDIA_TYPE_PS3_BD %xCB_MEDIA_TYPE_DVDPRW+Aa+StorageMedia:StorageMedia.reserved24
", "StorageMedia:StorageMedia.reserved24", output);
In general, I wanted to execute the xmb command:
xcb://localhost/query?sort=+Game:Common.titleForSort&cond=Oe+Game:Game.titleId RELOADXMB

And I didn't quite understand how you assign a value to a char * pointer so cleverly, without allocating memory. Similar with int*
 
Last edited by a moderator:
In general, I wanted to execute the xmb command:
xcb://localhost/query?sort=+Game:Common.titleForSort&cond=Oe+Game:Game.titleId RELOADXMB

And I didn't quite understand how you assign a value to a char * pointer so cleverly, without allocating memory. Similar with int*
Well, you have your query ready, you can extract the attribute from it, afaik it should be the part after the colon character.

Memory allocation for data can be done in various ways, as you must already know, on the heap, on the stack or in your app data segments, implying different access permissions. Here are some snippets to illustrate, you can easily test all this stuff using a debugger or whatever.

On heap you must malloc and free the memory when you are done.
Code:
char* ptr = (char*)malloc(6);
memset(ptr, 0, 6);
memcpy(ptr, "hello",5);
...
free(ptr);
On stack you can declare the string locally as an array of char and get your pointer from it, using the "&" operator when appropriate.
The data is destroyed automatically with the rest of the stack.
Code:
char str[]= "hello"; // size inferred by the compiler from the initializer, conceptually array declarations without sizes are not recommended and to be avoided whenever possible 
or
char str[6]=  "hello"; // size declared explicitly, recommended when possible 
then you can get a pointer to that string like so 
char * ptr = &str[0];
and
(char*)str should also be equivalent to &str[0] in theory, personally I prefer &str[0], it's more explicit.
If the above char array declaration is done globally, not locally in a function, the str data should be located in a read/write data segment instead of stack.

Any declaration of char* pointer with a string assignment will end up in a data segment and considered const by the compiler even if it was declared without the const keyword and no matter whether the declaration is global or local.
Code:
Once compiled
char * ptr = "hello";
should be the same as 
const char * ptr = "hello";
and both should be read only.
Finally when you pass a string as argument in a function call like so
x->DoUnk11("xcb://localhost/query?sort etc..",...);
That string will be processed by the compiler as if it were declared as const char *, it will be read-only and located in a segment of your executable file.

All the principles I described apply equally to other types like integers of different sizes, floats etc..

Like I said before, I have not tried using DoUnk11 before so I am not certain but I am guessing that the query and attribute can be either read only or writable in which case you could get away with just passing the 2 strings directly as arguments like I did in the snippet I posted in my previous post. Just test it with a debugger, you will soon find out.
 
Last edited:
Well, you have your query ready, you can extract the attribute from it, afaik it should be the part after the colon character.
After the first colon or after 2? Like this?

Code:
typedef struct
{
...
    int (*ExecXMBcommand)(const char *,void *,int); // 3 Parameter: char* (open_list nocheck/...), void * callback(can be 0), 0
...
    int (*DoUnk11)(char *, char *, int *);          // 3 Parameter: char * query , char * attribute? , uint8 output[]
...
}

static void reload_xmb(void)
{
    while(!IS_ON_XMB)
    {
        sys_timer_usleep(70000);
    }
// Reload All Categories and Swap Icons if Remaped
    explore_interface->ExecXMBcommand("reload_category_items game",0,0);

// Reload All Categories for New Queries
    explore_interface->ExecXMBcommand("reload_category game",0,0);
    explore_interface->ExecXMBcommand("reload_category network",0,0);
    char q[89]= "xcb://localhost/query?sort=+Game:Common.titleForSort&cond=Oe+Game:Game.titleId RELOADXMB";
    char a[28]= "Game:Game.titleId RELOADXMB";
    char *query = &q[0];
    char *attr = &a[0];
    int o=0;
    int *output=&o;
    explore_interface->DoUnk11(query,attr,output);
}
 
Last edited:
I think the attribute might be Game:Game.titleId actually but I am not sure.
Similarly I dunno what size is required for output, whether it's just a 32 bit return value, or a bigger suite of integers.

I am not familiar with this stuff, you may need to try different things which is why if I were you I would use a debugger to test different things at runtime, ProDG is your friend here.

I would probably start with something like this and see how things go.
Code:
...
char q[]= "xcb://localhost/query?sort=+Game:Common.titleForSort&cond=Oe+Game:Game.titleId RELOADXMB";
char a[18]= "Game:Game.titleId";
int output[8]={0,0,0,0,0,0,0,0};//using 8 randomly here, maybe 1 is enough, maybe you need more, the only way to know for sure would be to reverse engineer the code but a few tests might be sufficient here 
int ret= explore_interface->DoUnk11(&q[0],&a[0],&output[0]);
if(ret){
printf ("Error 0x%X\n",ret);
}
else{
for(int i=0;i<8;i++){
printf ("Output %i = 0x%X\n", i, output[i]);
}
}
All the snippets I posted are from the top of my head to illustrate, it's all untested and there could be problems running some of them.

Please create your own thread if you need further help, this one is dedicated to HEN bugs and issues.
 
Last edited:
Where are suggestions for adding new features/improvements discussed?

If you have code to submit for a feature, you should make a pull request in the official repo on GitHub.
If you only wish to make a feature request for others to develop, you can create your own thread and mention esc0rtd3w and me however given the amount of stuff on our respective to do lists, it's wise to keep expectations low to avoid disappointment.
 
After Installing HFW 4.89.1 SO many issues i am facing
1.Games Lag.
2.Games Glitch (GOD OF WAR 3,POP 1etc..)
3.Sounds lag in games And double sounds in some games.
4.only after installing or jailbreaking this version only please fix this I trust PS3Xploit Please make it as 4.88 Version like
5.I have ps3 Super slim
6.The above mentioned problems were in the 4.88.1 HFW
7.Or please to how to go back to PS3 4.88.1 HFW Please please please
 
After Installing HFW 4.89.1 SO many issues i am facing
1.Games Lag.
2.Games Glitch (GOD OF WAR 3,POP 1etc..)
3.Sounds lag in games And double sounds in some games.
4.only after installing or jailbreaking this version only please fix this I trust PS3Xploit Please make it as 4.88 Version like
5.I have ps3 Super slim
6.The above mentioned problems were in the 4.88.1 HFW
7.Or please to how to go back to PS3 4.88.1 HFW Please please please

Blame Sony for the buggy 4.89

You cannot downgrade to 4.88 on a Super slim or Slim 25xx with min fw 3.60 or higher.
Only PS3 systems with CFW can be downgraded if you have QA flags enabled.
 
After Installing HFW 4.89.1 SO many issues i am facing
1.Games Lag.
2.Games Glitch (GOD OF WAR 3,POP 1etc..)
3.Sounds lag in games And double sounds in some games.
4.only after installing or jailbreaking this version only please fix this I trust PS3Xploit Please make it as 4.88 Version like
5.I have ps3 Super slim
6.The above mentioned problems were in the 4.88.1 HFW
7.Or please to how to go back to PS3 4.88.1 HFW Please please please

1. S#ny devs were careless and introduced a number of bugs in 4.89.

2. The HFW trick is not good on its own, you MUST always deploy the HEN support files PKG over it to overwrite the few older files packaged by default into HFW with the correct 4.89 versions. If you haven't yet deployed the files, you need to do it.

3. I am not aware of any reports (other than yours) describing game lags and game glitches on HEN 4.89 with the support files PKG correctly installed that wouldn't exist on OFW, let alone reports about "SO many issues". It does not mean there aren't any, only that I haven't read any.
You also omitted to mention whether you are talking about retail discs, mounted ISO game files etc.., if you're talking about game backups, you don't have a reference to compare to as you cannot use such backups on OFW, keep in mind that your game backups setup (files on internal HDD? External fat32 or NTFS? ps3netsrv?) could also potentially explain perf issues so it's an important detail you need to share with us.

4. You cannot downgrade the firmware on Superslims, at least not for the time being, it may become possible the day lv1 gets exploited, until then you are stuck.
 
Last edited:
After Installing HFW 4.89.1 SO many issues i am facing
1.Games Lag.
2.Games Glitch (GOD OF WAR 3,POP 1etc..)
3.Sounds lag in games And double sounds in some games.
4.only after installing or jailbreaking this version only please fix this I trust PS3Xploit Please make it as 4.88 Version like
5.I have ps3 Super slim
6.The above mentioned problems were in the 4.88.1 HFW
7.Or please to how to go back to PS3 4.88.1 HFW Please please please
you might just have a failing hdd, or another hardware problem
 
my ps3 is not downloading the 4.89.1 HFW update, it is giving the error "data is corrupt." (8002F997) (I am using translator in case something is wrong)
 
Back
Top