C-Funktion um Rechner neu zu booten.



  • Hallo,

    ich suche eine Möglichkeit meinen Rechner an einem bestimmten Punkt in meinem C-Programm neu booten zu lassen. Was gibt es für Möglichkeiten und wie stelle ich das an? Bin für jede Hilfe sehr dankbar.

    Gruß, Onkel Sam



  • In ANSI-C kenn ich keine Funktion, die das könnte. Ich bezweifle auch, dass solch eine gibt.

    Aber es gibt eine solche Funktion in der WinAPI (für Windows). Falls du es für ein anderes Betriebssystem suchst, dann geh am besten in das entsprechende Forum hier, z. B. Linux.



  • Danke, habe ich schon gemacht. Nur ohne Erfolg!
    Mein Programm läuft unter DOS.

    Vielleicht hat ja noch jemand eine Idee! 😕



  • Unter DOS oder unter Windows-Konsole?? Da gibts einen großen Unterschied.

    Wenn es direkt unter DOS läuft, dann hast du wahrscheinlich auch einen dementsprechend "alten" Compiler, der noch 16Bit-Anwendungen compilieren kann. Wenn das so ist, dann gibts einen Interrupt dafür, den du aufrufen musst. Allerdings weiß ich jetzt leider nicht mehr welcher das ist. Aber vielleicht findest du was im Netz, wenn du nach Interrupt suchst.

    Wenn das ganze doch in der Windows-Konsole abläuft, dann musst du nach einer WinAPI suchen.



  • Hi,

    ich arbeite nicht mit der Windows-Konsole. Als Compiler benutze ich OpenWatcom! Der kann 16 bit Programme erstellen. Über Interrupts habe ich auch schon nachgedacht. Leider noch nichts entsprechende gefunden. Trotzdem Danke.



  • Es gibt 3 Möglichkeiten, neu zu starten:

    1. sehr soft: einfach Interrupt 0x19 aufrufen. Das startet ab der Stelle, an der der Bootsektor eingelesen wird. Kann schief gehen, wenn irgendwelche Interrupts durch TSR verbogen sind usw.
    2. Warmstart (entspricht Ctrl+Alt+Delete): an 0040:0072 den Wert 0x1234 speichern, und FFFF:0 anspringen.
    3. Kaltstart (entspricht Reset-Knopf): genauso wie Warmstart, nur dass statt 0x1234 dort 0x0000 gespeichert wird.


  • Die Lösung lautet:

    void main(int want_warm)
    {
     void (far* boot) (void) = (void (far*) (void)) 0xFFFF0000UL;
     unsigned far* type = (unsigned far*) 0x00400072UL;
     *type = (want_warm ? 0x1234 : 0);
     (*boot) ( );
    }
    

    Vielen Dank an allen Beteiligten! 🙂


Anmelden zum Antworten