BIOS Aufruf zum System Reset - Geht das in C++



  • Hi,

    ich hab mal just for fun einen Treiber geschrieben, der mein OS vom Protected Mode in den Real Mode holt:-) War sehr lustig. Vorallem weil nicht mal mehr ein Bluescreen kam. Ob er dabei wirklich in den Real Mode(was glaube ich nicht so ist da ein Prozessor nur in den Protected Mode und nicht wieder zurück geschaltet werden kann) schaltet weiß ich nicht aber der Rechner wird SOFORT neu gestartet. Was da genau abgeht weiß ich nicht. Allerdings liegt die Funktion in einem Treiber.

    Ich kann nachher ja mal gucken ob ich den noch finde. ALso wenn es dir was bringt. Für alles andere musst du meiner Meinung nach auch einen Treiber schreiben oder du bemühst mal IDA und schmeißt das oben gennante Programm rein und guckst wie die es machen. Ich selber habe das Programm aber nicht ausprobiert und weiß auch nicht ob es wirklich funktioniert.





  • Aber ich habs gerade mal unter Windows 7 ausprobiert, bei SuperFast Shutdown und dem Demo-Programm vom Artikel auf codeproject, geht der PC nicht direkt aus sondern braucht noch 2-3 Sekunden. Also für dich dann wahrscheinlich unbrauchbar, weil also doch noch irgendwas runtergefahren wird.



  • secondsun schrieb:

    Ob er dabei wirklich in den Real Mode(was glaube ich nicht so ist da ein Prozessor nur in den Protected Mode und nicht wieder zurück geschaltet werden kann) schaltet weiß ich nicht aber der Rechner wird SOFORT neu gestartet.

    Ich glaube mich zu erinnern, dass es da einen Trick mit dem Keyboard-Controller gab.
    Also dass man den Keyboard-Controller irgendwie verwenden kann, um die CPU zu resetten (und dadurch zurück in den Real-Mode zu holen), ohne dass dabei der ganze Rechner resettet werden muss.
    Ich glaube diese Technik haben auch diverse DOS-Extender verwendet.

    Ist aber alles schon seeeehr lange her, und selbst programmiert hab' ich sowas auch noch nie.

    EDIT: OK, hab gerade ein wenig gegoogelt. Den Keyboard-Controller-Trick braucht man anscheinend nur beim 286er, ab dem 386er kann man - laut der allwissenden digitalen Müllkippe - einfach ein Bit in einem Control-Register auf Null setzen um den Protected-Mode zu verlassen.

    (siehe z.B. hier, vorletzter Absatz: http://www.rcollins.org/articles/pmbasics/tspec_a1_doc.html)

    Wie zuverlässig die Info ist weiss ich aber nicht 🙂



  • AN: secondsun

    Ich kann nachher ja mal gucken ob ich den noch finde. ALso wenn es dir was bringt. Für alles andere musst du meiner Meinung nach auch einen Treiber schreiben oder du bemühst mal IDA und schmeißt das oben gennante Programm rein und guckst wie die es machen. Ich selber habe das Programm aber nicht ausprobiert und weiß auch nicht ob es wirklich funktioniert.

    Da mit dem Treiber ist leider nicht so die Lösung, da ich auf dem Testrechner keine Treiber installieren will. Der soll später an einen Kunden ausgeliefert werden. Portables Programm ist daher besser. Die Messung soll je Kundenpc individuell erstellt werden...

    Aber trotzdem Danke...

    AN: NtSetSystemPowerState

    Aber ich habs gerade mal unter Windows 7 ausprobiert, bei SuperFast Shutdown und dem Demo-Programm vom Artikel auf codeproject, geht der PC nicht direkt aus sondern braucht noch 2-3 Sekunden. Also für dich dann wahrscheinlich unbrauchbar, weil also doch noch irgendwas runtergefahren wird.

    Muss ich ausprobieren. Ggf. mache ich das, was Hustbaer vorgeschlagen hat: Relais über Parallelport.



  • hustbaer schrieb:

    EDIT: OK, hab gerade ein wenig gegoogelt. Den Keyboard-Controller-Trick braucht man anscheinend nur beim 286er, ab dem 386er kann man - laut der allwissenden digitalen Müllkippe - einfach ein Bit in einem Control-Register auf Null setzen um den Protected-Mode zu verlassen.

    Da ich das schon programmiert habe, weiß ich das 😉
    Das war ein Bug in 286... ab dem 386 konnte man auch wieder zurpckschalten.
    Und BIOS des 286 gab es tatsächlich eine Möglichkeit einen Interrupt auszulösen um wieder in den Real-Mode zurückzukommen; dazu musste man vorher im BIOS einen speziellen Wert setzen, damit nicht wirklich neu gebootet wird, sondern wieder an einer definierten Stelle weitergemacht wird.



  • Kann man in Windows 7 oder Windows XP einfach so zwischen Real und Protected Mode hin und herschalten ?

    Oder müsste man dafür einen extra Treiber schreiben ?



  • In Windows (ab NT 3.51) kann man nicht umschalten... auch nicht mit einem Treiber... zumindest nicht so, dass man wieder zurpck kommt 😉

    Für was sollte sowas gut sein?



  • Irgendwie sind die Resultate noch nicht so, wie ich es mir vorstelle.
    Wahrscheinlich gehe ich irgendwie den falschen Weg bisher.

    Mal ein anderer Versuch:

    Gibt es eine Möglichkeit, per API einen RESET auszulösen? D.h. den gleichen Effekt, als ob man den Reset Knopf am PC drückt? Theoretisch müsste dieses doch direkt den Cache in Windows löschen und ggf. auch den Hardware Cache der Festplatte?

    Bei Microsoft habe ich nichts gefunen, das einen direkten Reset Befehl auslöst...

    Auch wenn es "Off Topic" ist: wäre das unter Linux einfacher zu gestalten? 😕

    Danke im voraus.



  • Du willst doch einen Stromausfall simulieren, was willst du da mit dem Reset Knopf, mach doch einfach einen Stromausfall, aka Stecker ziehen!?



  • Du willst doch einen Stromausfall simulieren, was willst du da mit dem Reset Knopf, mach doch einfach einen Stromausfall, aka Stecker ziehen!?

    Das bring nichts für meinen Einsatzzweck!

    Wie ich am Anfang geschrieben habe:

    Da ich über den Abschaltzeitpunkt weiss, was für Daten geschrieben wurden, kann ich nachher feststellen, wieviel Daten so verloren gingen.

    Schreibe ich mit der entsprechenden Software eine bestimmte Menge an Daten auf die Festplatte. Gleichzeitig läuft auf dem entsprechenden PC noch einiges an anderer Software, was auch auf die Festplatte zugreift. Zu einem fest definierten Zeitpunkt will ich eine Abschaltung bzw. Reset auslösen. Da ich diesen Zeitpunkt kenne und weiss, wieviel Daten eigentlich auf die Festplatte geschrieben werden sollten, kann ich feststellen, wieviel Daten durch den Cache verloren gingen.
    Diese Daten brauche ich dann pro Kundenpc, auf dem unsere komplette Software drauf läuft (ältere System, neuere System, Intel, AMD, etc.).

    Mittels "Stecker ziehen" kann ich keinen fest definierten Zeitpunkt erstellen und somit auch keine auswertbaren Messergebnisse.



  • @Annon Nemo:
    Was du da schreibst klingt nach bestenfalls Voodoo, schlimmstenfalls Pfusch.

    Auch verstehe ich nicht ganz was du damit erreichen willst.
    Wenn du Platten verwendest die korrekt flushen und Software die korrekt Flush Kommandos abschickt, dann ist das ganze Thema gegessen.

    Wenn du den Write-Cache der Platte und vom OS abdrehst im Prinzip genau so.

    Und wenn beides nicht geht, dann macht es IMO immer noch keinen Sinn da etwas zu "messen", weil du bloss irgendwelche Hausnummern rausbekommen wirst.

    Du kannst einfach nicht sicher sagen welche Daten wann geschrieben werden. Aussagen wie "es können max. die letzten 20 MB fehlen" sind daher auch nicht möglich.

    Bzw. falls es nicht um eine Messung/Aussage dieser Art geht, worum geht es dann?

    Also ich halte es für Unsinn, aber egal. Kann dir ja trotzdem deine Fragen beantworten 🙂

    Also. Nein, es gibt keinen solchen API Call. Es sollte allerdings möglich sein einen Triple-Fault zu erzwingen, der dann die CPU resettet. Ist allerdings auch nicht so einfach, und vor allem auch nicht ohne Treiber hinzubekommen. Und dann gibt es natürlich noch KeBugCheckEx und ähnliche Funktionen.
    Nichts von dem wird allerdings dazu führen dass die HDD ihre Caches flusht - wieso sollte sie das auch tun, wäre für sämtliche normalen Anwendungen total kontraproduktiv. Die Platte *soll* ja *nicht* Daten verlieren wenn man den PC resettet oder abschaltet.

    Was allerdings funktionieren sollte...

    Bau die Lösung über Relais das den Strom abschaltet.
    Dein Programm das die Daten schreibt sagt dann irgendwann "jetzt". Eine kurze Zeit später ist dann der Strom weg.

    Und um genau zu bestimmen wann, lässt du dein Programm einfach laufend Nachrichten an einen anderen PC schicken, wo ein anderes Programm diese aufzeichnet. Entweder übers Netz oder über ne serielle Schnittstelle oder was auch immer. Was du da verschickst bleibt dir überlassen - könnte die Systemzeit sein, oder auch die Anzahl der Bytes die das Programm momantan gerade in die Kontrolldatei geschrieben hast -- was du halt an Daten brauchst um diesen Zeitpunkt festnageln zu können.

    Sowohl Ethernet (eigene Verbindung vorausgesetzt wo nix los ist bis auf deine Datenpakete) als auch ne serielle Schnittstelle sind schnell genug dass du den Zeitpunkt auf wenige Millisekunden (einstellig) genau festnageln kannst.



  • Auch verstehe ich nicht ganz was du damit erreichen willst.
    Wenn du Platten verwendest die korrekt flushen und Software die korrekt Flush Kommandos abschickt, dann ist das ganze Thema gegessen.

    Wir verbauen eine Software in ein Produktionssystem. Überwachung der produzierten Waren auf Qualität. Die Software kaufen wir von einem Partnerunternehmen hinzu. Was die mit den Schreibzugriffen machen wissen wir nicht, interessiert uns auch nicht, da wir nicht in diesem Bereich der Entwicklung involviert sind.d.h. keine Möglichkeit Änderungen zu erreichen...

    Du kannst einfach nicht sicher sagen welche Daten wann geschrieben werden. Aussagen wie "es können max. die letzten 20 MB fehlen" sind daher auch nicht möglich.

    Bzw. falls es nicht um eine Messung/Aussage dieser Art geht, worum geht es dann?

    Auf die Festplatte werden die Ergebnisse der Überwachungssoftware geschrieben. Ein anderes Programm greift auf diese Logdateien zu. Je nach Ergebniss wir das Podukt zu Verpackung, Nachbearbeitung oder Vernichtung zugeführt.
    Da in dem System keine USV Verbaut werden kann, muss sichergestellt sein, dass bei einer Stomabschaltung der Maschine (externes Sicherheitssystem dass bei Fehlern den Strom abschaltet) alle ungeprüften Produkte neu überprüft werden.

    Der Endkunde hat nun die Anforderung, dass man den Zeitraum, für wieviele Produkte bei einer Stromabschaltung keine Logdaten mehr vorhanden sind.

    Da der Datenabgriff von unserem Kontrollsystem auf das Verteilungs-/Verpackungssystem von einem Kundenprogramm erfolgt haben wir auch hier keine Ahnung, was die Software genau macht. Übertragen werden die Daten per Netzwerk.

    Näheres kann/darf ich auch nicht dazu sagen. Abschließend nur eines: Industriekunden sind etwas anderes als kaufmännische Kunden. Wenn in deren Pflichtenheft steht, dass ein bestimmter Wert anzugeben ist (hier: wieviel Daten gehen bei einer Stromabschaltung verloren und wieviel muss daher neu Überpüft werden) dann ist dieses anzugeben. Keine Angabe == Kein Auftrag. Diskussionsvolumen: Nein, wenn keiner die Anforderung erfüllen kann, wird das gesamte Projekt neu geplant. Ob man dann nochmal bieten kann ist nicht planbar. Bei kaufmännischen Kunden kann man noch über Kleinigkeiten sprechen. Bei Industriekunden nicht.

    Daher auch das Problem mit einer Treiber Lösung: Stimmen die Werte auch, wenn der Treiber nicht installiert ist? Verändert der Treiber das Messverhalten? Was sagt die Versicherungen hierzu? etc.

    Ausserdem reden wir hier über grössere Beträge. Die Software/PC macht vieleicht 15% vom Gesamtvolumen aus.

    Danke für die Informationen. Ich werde das mit dem Parallel Relais verwenden.

    Moderator: Schliessen bitte... 😃



  • Du kannst das ganze ganz einfach mit einem Treiber lösen. Der Treiber startet dann den Rechner neu. Das geht... oder einfach ein BSOD im Treiber auslösen...

    Oder Du verwendest einfach das NotMyFault Proramm:
    http://download.sysinternals.com/Files/Notmyfault.zip (sogar mit Source).

    Damit kannst Du dann bequem einen Restart auslösen, wenn Du auf "Do Bug" drückst...



  • @Jochen:
    Was hat ein BSOD mit der Festplatte zu tun? Die hört ja deswegen nicht auf "heisse" Daten aus ihrem Writeback Cache auf die Platter zu schreiben.

    @Annon Nemo:

    Daher auch das Problem mit einer Treiber Lösung: Stimmen die Werte auch, wenn der Treiber nicht installiert ist? Verändert der Treiber das Messverhalten? Was sagt die Versicherungen hierzu? etc.

    Die Werte stimmen so oder so nicht, bzw. sind bestenfalls Annäherungen, ermöglichen allerdings keine Aussage über irgendwelche Maximal-/Minimalwerte.

    Was den Treiber angeht: ob ein Treiber der im Prinzip nix tut (bis zu dem Zeitpunkt wo man ihm sagt "jetzt tu mal resetten") installiert ist oder nicht ändert schonmal nix. Nur wirst du mit "Reset über den Treiber" eben nicht unbedingt die gleichen Werte bekommen wie mit "Strom aus".



  • @hustbaer: Ich verstehe ja immer noch nicht ganz was er will... aber belassen wir es jetzt dabei... so wirre Aussagen hab ich schon lange nicht mehr gehört...


Anmelden zum Antworten