KINGx - Das inoffizielle PlayStation Forum & News Portal

Normale Version: [Hilfe] C: Datei in den Flash Kopieren
Sie sehen gerade eine vereinfachte Darstellung unserer Inhalte. Normale Ansicht mit richtiger Formatierung.
Hallo wollte mal ein Hb machen das was in den Flash0 Kopiert und hab erst mal eins gemacht was vom ms0 was auf den ms0 kopiert hat alles geklappt.
Nun hab ich versucht was in den Flash0 zu Kopieren mit dem Kernel-Mode 0x1000. Aber es stürz immer beim Start ab es kommt auch kein Text nach dem Gameboot geht die PSP mit nem Knacken aus. <.>

Hier mein Code hoffe ihr könnt mir helfen Smile

Code:
#include <pspsdk.h>
#include <pspkernel.h>
#include <psputils.h>
#include <pspctrl.h>

#include <string.h>
#include <stdio.h>
#include <stdarg.h>

PSP_MODULE_INFO("GBMA", 0x1000, 1, 1);



//------------------------------------------------------------------------------

int done = 0;

//------------------------------------------------------------------------------

void ErrorExit(ivoid)
{
    sceKernelDelayThread(4000*1000);
    sceKernelExitGame();
}

//------------------------------------------------------------------------------

char buf[314];

void copy_test(void)
{    
    SceUID i = sceIoOpen("ms0:/PSP/GAME/GBMA/GB1/TEST.txt", PSP_O_RDONLY, 0777);

    if (i < 0)
    {
        printf("Error: Input Error.\n");
                ErrorExit();
    }

    SceUID o = sceIoOpen("flash0:/vsh/resource/TEST.txt", PSP_O_WRONLY | PSP_O_CREAT | PSP_O_TRUNC, 0777);

    if (o < 0)
    {
        printf("Error: Output Error.\n");
                ErrorExit();
    }



    sceIoWrite(o, buf, 314);
    

    sceIoClose(i);
    sceIoClose(o);
}


//------------------------------------------------------------------------------


int main()
{
    pspDebugScreenInit();
    pspDebugScreenClear();
    pspDebugScreenSetTextColor(0x0000FF00);
    
    
    printf("Drücke X um den Gameboot zu kopieren\n");
    

    while(!done)
    {
        SceCtrlData pad;

        sceCtrlReadBufferPositive(&pad, 1);


        if (pad.Buttons != 0)
        {

            if (pad.Buttons & PSP_CTRL_CROSS)
            {              
             copy_test();
             printf("Die TEST.txt wird kopiert....\n");
        
             printf("Fertig\n");    
             ErrorExit();
            }
        }        
    }
    
    return 0;
}


Habe bis jetzt immer im User-mode gemacht deswegen ist der Kernel-Mode noch Neuland Big Grin

Danke schon mal an alle die mir Helfen Big Grin

Du kannst keine EBOOT-ELFs im Kernel Mode ausführen... du musst eine externe Kernel PRX laden.
Außerdem ist die Fehlerüberprüfung in copy_test katastrophal.

HacKmaN :
Du kannst keine EBOOT-ELFs im Kernel Mode ausführen... du musst eine externe Kernel PRX laden.
Außerdem ist die Fehlerüberprüfung in copy_test katastrophal.


Ja ok Danke für die schnelle Hilfe ^^

HacKmaN :
Du kannst keine EBOOT-ELFs im Kernel Mode ausführen... du musst eine externe Kernel PRX laden.
Außerdem ist die Fehlerüberprüfung in copy_test katastrophal.


Wie könnte man es besser machen? Ich bin selber noch kein guter Programmierer und daher freue ich mich über jede Möglichkeit, etwas zu lernen...

mfg D3lta

HacKmaN hat bereits gesagt, warum dein Program nicht funktioniert. Außerdem ist der code wirklich nicht der Beste, ich verstehe z.B. den Sinn deiner Methode ErrorExit nicht.

EerrorExit: lösche die Methode und ersetze ihren Aufruf durch:

printf("Error_XXX");
sceKernelDelayThread (4000*1000);
sceKernelExitGame();


Hier noch weitere Anmerkungen:


int done = 0; //unnnötig, int done reicht aus, globale Variablen werden automatisch mit 0 initialisiert
sofern du keinen eigenen Wert reinschreibst.

Was ist überhaupt der Sinn von "done"? Die Variable ist immer 0...

pspDebugScreenInit();
pspDebugScreenClear();

Es gibt keinen Grund, hier pspDebugScreenClear() zu verwenden.

while(!done) //warum verwendest du nicht einfach while(1) oder for(;; ) (ohne Leerzeichen) anstatt unnötigen Platz für eine zweckfreie Variable zu belegen?

{
SceCtrlData pad;

Ebenfalls nicht gut, warum deklarierst du pad in einer while Schleife? Bei jdem Durchgang wird somit eine neue Variable pad erstellt.

Warum fragst du:

if (pad.Buttons != 0)
{

ab? Ohne einen zugehörigen else Teil unnötig, es reicht völlig aus es so zu schreiben:

if (pad.Buttons & PSP_CTRL_CROSS)
{
//blah
}

Das wären ein paar Anregungen meinerseits für zukünftige Programme.

PSP_Lord :
HacKmaN hat bereits gesagt, warum dein Program nicht funktioniert. Außerdem ist der code wirklich nicht der Beste, ich verstehe z.B. den Sinn deiner Methode ErrorExit nicht.

EerrorExit: lösche die Methode und ersetze ihren Aufruf durch:

printf("Error_XXX");
sceKernelDelayThread (4000*1000);
sceKernelExitGame();


Hier noch weitere Anmerkungen:


int done = 0; //unnnötig, int done reicht aus, globale Variablen werden automatisch mit 0 initialisiert
sofern du keinen eigenen Wert reinschreibst.

Was ist überhaupt der Sinn von "done"? Die Variable ist immer 0...

pspDebugScreenInit();
pspDebugScreenClear();

Es gibt keinen Grund, hier pspDebugScreenClear() zu verwenden.

while(!done) //warum verwendest du nicht einfach while(1) oder for(;; ) (ohne Leerzeichen) anstatt unnötigen Platz für eine zweckfreie Variable zu belegen?

{
SceCtrlData pad;

Ebenfalls nicht gut, warum deklarierst du pad in einer while Schleife? Bei jdem Durchgang wird somit eine neue Variable pad erstellt.

Warum fragst du:

if (pad.Buttons != 0)
{

ab? Ohne einen zugehörigen else Teil unnötig, es reicht völlig aus es so zu schreiben:

if (pad.Buttons & PSP_CTRL_CROSS)
{
//blah
}

Das wären ein paar Anregungen meinerseits für zukünftige Programme.


Das Thread-Modell der PSP erlaubt keine Endlosscheifen. Wenn du mit der PSP auf die Home Taste klickst und Spiel beenden wählst, wärend eine Schleife läuft, macht die PSP gar nichts mehr (das Spiel wird nicht beendet, die PSP crasht aber auch nicht). Wenn dagegen die Schleife beendet wird, bevor sceKernelExitGame ausgeführt wird, wird das Homebrew ordnungsgemäß beendet.
Inzwischen hat man eben die Lösung, im Exit-Callback erst done auf 1 zu setzen und dann sceKernelExitGame auszuführen. Mit dieser Methode wird die Schleife erst beendet, bevor das Spiel verlassen wird.
Aber in diesem Code wird gar kein Exit-Callback gestartet... deshalb ist es hier, wie du schon gesagt hast, nutzlos.
Und bei großen Codes ist ErrorExit sehr nützlich, da man dann nicht dauernd den gleichen Code schreiben muss.

Aber im Großen und Ganzen geb ich dir Recht, der code ist teilweiße schrecklich.

Achja, bitte packe deine Codes in ein [ code ] blaaa [/ code ] Feld (ohne Lehrzeichen), dann ist es viel besser lesbar Wink

Ja @PSP_Lord ich bin ja noch nicht so lange an der PSP deswegen hab ich noch Teilweise Falsche Sachen da ich die Befehle noch nicht so gut kenne ^^

Aber bei ErrorExit muss ich dir recht geben Big Grin
Ja, learning by doing Wink

HacKmaN, mir ist schon klar, dass bei viel code Code-Duplizierung zu vermeiden ist und in diesem Fall betreibt Stehn ja auch Vermeidung von Code Duplizierung, nur fand ich es im altuellen code Status eher als unnötig.

Danke aber für den Hinweis mit dem home Callback.
Ehm irgendwie versteh ich das jetzt mit der Kernel Prx net ^^

Kann mir einer meinem Gehirn (falls vorhanden x) ) auf die Sprünge helfen Big Grin

stehn :
Ehm irgendwie versteh ich das jetzt mit der Kernel Prx net ^^

Kann mir einer meinem Gehirn (falls vorhanden x) ) auf die Sprünge helfen Big Grin


Bitte verlang jetzt kein extra Sample.

http://psp.jim.sh/pspsdk-doc/group__ModuleMgr.html

Hier findest du alles was du brauchst. Außerdem wird das in so vielen Programmen gemacht, du wirst ja wohl ein Kernel Homebrew mit Source Code finden Wink

Ich helf ja gerne, aber ich finde manches sollte man einfach selber lösen.

Ja da hast du voll recht Wink

Wollte jetzt auch kein Sample Big Grin

Danke ^^
Referenz-URLs