BIOS Aufruf zum System Reset - Geht das in C++
-
Hallo,
ich suche eine Möglichkeit, einen PC über das BIOS zu resetten, bzw. das Netzteil abzuschalten. Ein normales Abschalten über die Windows API kann ich nicht verwenden. Der ist zu langsam und ausserdem leert der den Cache für die Festplatte.
Grund ist folgender, ich schreibe auf die Festplatte mittels C eine Anzahl von Daten und will mittendrin den PC booten bzw. abschalten. Da ich über den Abschaltzeitpunkt weiss, was für Daten geschrieben wurden, kann ich nachher feststellen, wieviel Daten so verloren gingen. Das ganze soll dazu einen Stomausfall und eine defekte USV simulieren...
Gibt es irgendeine Möglichkeit das über einen Windowsaufruf zu gestalten oder kann ich irgendwie dieses direkt im Bios auslösen?
In der MSDN Doku habe ich hierrüber nichts gefunden.
Danke für Hilfe im voraus.
-
Und was bringts? In so einem Fall kann alles passieren. Das zu simulieren halte ich für eine Zeitverschwendung. Die beste Methode ist immer noch den Stecker zu ziehen. Das ist eine realitätsnahe Simulation inklusive der Chance eines Hardwaredefekts.
Mal abgesehen von den offensichtlichen Fehlermöglichkeiten, kann auch ein Fehler im Journaling der Festplatte auftreten. Kurz und knapp das Verhalten eines Rechners bei Stromausfall ist undefiniert. Er könnte zum Leben erwachen oder die Weltherrschaft an sich reißen.
-
-
...der Source Code hierfür wäre nicht schlecht...
-
Resetten geht, wenn du dir nen Hilfstreiber schreibst.
Allerdings bin ich nicht sicher, ob die Festplatten dabei nicht trotzdem noch ihre Caches flushen.Vielleicht ein über den Parallelport geschaltetes Relais?
-
hustbaer schrieb:
Vielleicht ein über den Parallelport geschaltetes Relais?
An das habe ich auch gedacht (würde sicher gehen), aber da muss es auch einfacheres geben.
-
Eigentlich bräuchte ich nur irgendwie eine Möglichkeit, aus einem Anwendungsprogramm auf das BIOS zugreifen zu können.
Entweder erzeuge ich dann dort einen INIT oder, weil das BIOS das "POWER GOOD" Signal steuert, lege ich dieses Signal lahm. Dann schaltet das Netzteil aus.
-
Dazu musst Du einen Treiber schreiben...
-
Annon Nemo schrieb:
Eigentlich bräuchte ich nur irgendwie eine Möglichkeit, aus einem Anwendungsprogramm auf das BIOS zugreifen zu können.
Entweder erzeuge ich dann dort einen INIT oder, weil das BIOS das "POWER GOOD" Signal steuert, lege ich dieses Signal lahm. Dann schaltet das Netzteil aus.
Das Netzteil liefert das Power Good Signal, das kannst du damit nicht ausschalten

-
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.
-
Hier ist ein Artikel dazu: http://www.codeproject.com/KB/winsdk/Windows_Shutdown.aspx
-
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.