CMOSTimer
Der CMOSTimer dient zum programmgesteuerten Ein - und
Ausschalten eines PC's aus dem Soft-Off (ATX) Modus. Hierzu wird die
BIOS Funktion "Wake up on RTC Alarm" verwendet.
Aktuelle Version: 1.16 (ACHTUNG:
Diese Version ist nicht zur Version 1.0 kompatibel! Nach Ersetzen der
alten 1.0 Version durch eine Version > 1.0 muss CMOSConfig
ausgeführt
und die neuen Parameter gespeichert werden.)
WARNUNG
Dieses Programm schreibt direkt in das NVRAM (Non
Volatile RAM = nichtflüchtiger Speicher) welcher vom BIOS benutzt
wird um die System - Einstellungen (CMOS settings) zu speichern.
DAS IST POTENTIELL GEFÄHRLICH!
Die Verwendung erfolgt auf eigene Gefahr. Weder ich noch sonst jemand
(z.B. der BIOS Hersteller) können in irgendeiner Form für
eventuelle Schäden verantwortlich gemacht werden. (Das
"schlimmste"
was mir selbst bei der Entwicklung des Programms passiert ist, war dass
mein Rechner mit BIOS - Defaults gestartet hat - die daraus
resultierende "NeuEinstellung" hat ca. 2 min gedauert - Das heißt
aber nicht, dass nicht mehr "kaputtgehen" kann...).
Nichts desto trotz wird ein ähnliches Programm (NVRAM-WakeUP siehe
http://sourceforge.net/projects/nvram-wakeup)
unter LINUX (welches auch die Grundlage für das vorliegende
Programm geliefert hat) von vielen Leuten ohne Probleme genutzt.
Download:
CMOSTimer - downloads: 2371
(VB Runtime erforderlich)
Vorraussetzungen:
Administratorrechte und "Auto -Login" (Windows fragt
beim Start nicht nach einem Kennwort sondern lädt sofort den
Desktop)
Bildschirmschoner muss deaktiviert sein.
Alle Dateien (CMOSConfig, CMOSTimer, WinIO.sys ...) im gleichen Ordner
(z.B. ..\WinSTB\Utilities).
Prinzipieller Aufbau:
Der CMOSTimer verwendet die BIOS Funktion "Wake up on
RTC Alarm" (Die Bezeichnung kann je nach BIOS Hersteller variieren)
welche bei den meisten Mainboards vorhanden ist. Zum Eintragen einer
WakeUp Zeit wird der WinIO Treiber (WinIo v2.0 Copyright 1998-2002
Yariv
Kaplan http://www.internals.com)
verwendet, der einen Gerätetreiber für Windows implementiert
um den Zugriff auf das BIOS zu ermöglichen. Die nötigen
Parameter (BIOS - Adressen für die WakeUp Zeit) müssen
zunächst ermittelt und mit dem CMOSConfig Programm in die Windows
Registrierung eingetragen werden. Der CMOSTimer wird dann mit dem
Kommandozeilenparameter /wakeup= dd.mm.yyyy hh:mm ("langes"
Datumsformat) gestartet, womit die Eintragung in das BIOS vorgenommen
wird. Manche Mainboards speichern die Einstellungen leider erst nach
einem ReBoot korrekt ab, daher erzeugt der CMOSTimer ggf. einen
AutoStart Eintrag mit dem der Rechner neu gebootet wird und erst
anschließend abschaltet. Mit dem Kommandozeilenparameter /off
wird
der Eintrag aus dem BIOS gelöscht (respektive die Eigenschaft
"Wake
up on RTC Alarm" im BIOS auf "disabled" gesetzt).
Falls man sich um das Abschalten (und ggf. ReBoot) selbst kümmern
will/kann/muss, anstatt /wakeup=...
/wakeuponly... (bzw. /offonly) als Kommandozeilenparameter
verwenden.
Ermittlung der nötigen Parameter:
Hierzu dienen zwei Programme: CmosDos und CMOSConfig
Zunächst sollte man natürlich einen "manuellen" Test mit
Hilfe des "normalen" BIOS Setup Programms durchführen, um zu
prüfen ob es mit dem verwendeten Mainboard überhaupt
funktioniert.
Ab Version 1.15 ist eine Datenbank mit den Einstellungen für ca.
150 verschiedene Mainboards enthalten, leider sind die Einträge
nicht immer eindeutig, so dass man auf jeden Fall eigene Tests
durchführen sollte, bevor man mit den so ermittelten Einstellungen
das CMOSTimer Programm startet.
Zur Ermittlung des Mainboards wird der DMI Eintrag ausgelesen, und dann
mit den Einträgen in der Datenbank verglichen. Falls kein
gültiger DMI Eintrag gefunden wurde oder das Mainboard nicht in
der Datenbank enthalten ist, heißt das nicht zwangsläufig,
dass das Programm nicht funktioniert. In diesem Fall muss man aber die
Parameter "von Hand" bestimmen.
Nach dem Start von CMOSConfig zunächst mit "LookUpMainboard" die
Datenbanksuche starten.
Falls das Mainboard gefunden wurde (und eindeutig ist), kann man mit
"Set Config" die Einstellungen in das
CMOSConfig "Hauptfenster" übernehmen. Falls mehrere "passende"
Einträge gefunden wurden, kann man aus der Liste eines testweise
auswählen und diese Einstellungen übernehmen (wenn diese Einstellungen "falsch" sind,
kann man es mit dem nächsten probieren...). Dannach das DMI Info
Fester mit "Close" schließen. Falls gar nichts passendes gefunden
wurde, einfach nur das Fenster mit "Close" schließen und hier weiterlesen.
Um einen ersten Test zur Überprüfung der Einstellungen durchzuführen, im
CMOSConfig "Hauptfenster" auf "DumpBIOS" klicken. Damit wird das Bios
ausgelesen und entsprechend den gesetzten Einstellungen die aktuell im
BIOS eingestellte WakeUp Zeit angezeigt.
Fall man hier eine
"unmögliche" Zeit vorfindet (z.B. 35:77), sind die Einstellungen
in jedem Fall falsch. Ansonsten bitte mit der im BIOS eingestellten
Zeit vergleichen. Falls diese Zeit passt kann man die Einstellungen mit
"WriteReg" schon mal speichern und den nächsten Absatz
überspringen. Bevor man jedoch diesen Einstellungen endgültig
glaubt, sollte man mit "CreateTestFile" noch einen Simulationstest durchführen. Falls
man das dort erklärte nicht versteht, zuerst die Beschreibung der einzelnem Parameter
durchlesen.
Manuelle
Ermittlung der nötigen Parameter:
Da nach jeder Änderung im BIOS - Setup ein ReBoot
erforderlich ist
(schließlich kann man nur beim Booten das BIOS Setup starten)
sollte man für die ersten Tests eine DOS BOOT-Disk verwenden (geht
einfach schneller, als jedes mal Windows zu starten) und mit CmosDos
das
BIOS auslesen. Das CmosDos Programm hierzu auf die BootDisk kopieren
und
von dort aus starten. Die BIOS - Werte werden am Bildschirm angezeigt,
und als Datei B#.TXT gespeichert (Das # Zeichen steht für eine
Nummer, diese wird
vom Programm automatisch erhöht). Zusätzlich werden alle
Unterschiede zu den vorigen BIOSDump's ermittelt und in der B#.TXT
Datei
gespeichert. Die B#.TXT Dateien sind editierbar (um z.B. die
gewählten BIOS - Setup Einträge einzutragen), jedoch sollte
nur die erste Zeile geändert werden. Außerdem sind die
B#.TXT
Dateien kompatibel zwischen CmosDos und CMOSConfig. Einschränkung:
CmosDos unterstützt nur 128 Byte - die neuen 256 Byte Modi
können nur in CMOSConfig
angezeigt/konfiguriert werden.
Folgendes Vorgehen kann ich empfehlen: Zunächst im
BIOS den
Eintrag "Wake up on RTC Alarm" ausschalten und einen BIOSDump (mit
CmosDos oder CMOSConfig mit eingeschaltetem "ReadWriteFile")
durchführen. Dann im BIOS den Eintrag "Wake up on RTC Alarm"
einschalten (sonst nichts ändern), nächstes BIOSDump starten.
. Dann im BIOS den Eintrag "Wake up on RTC Alarm" einschalten und als
"Aufwachzeit" eine möglichst gut zu erkennende Einstellung
wählen z.B. Tag: 01 Stunde: 02 Minute: 03 (Sekunde (falls
vorhanden): 04, wird aber vom CMOSTimer sowieso nicht
unterstützt).
Erneutes BIOSDump durchführen. Als nächstes neue
"Aufwachzeit"
mit möglichst gut zu erkennenden Einstellungen wählen (z.B.
Tag: 11 Stunde: 12 Minute:13) ). Erneutes BIOSDump durchführen.
Und
so weiter... Wichtig ist noch, dass man auch "Extremwerte" verwendet,
um
die (ggf. erforderlichen) Bytes für die Checksumme zu ermitteln:
Also Tag: 01 Stunde: 00 Minute: 00 und Tag: 31 Stunde: 23 Minute: 59
Die Werte der einzelnen BIOS - Adressen werden Dezimal, Hex (&h##)
und Binär (&b########) dargestellt.
Beispiel (MSI 6570) einer B#.txt - Datei
Now: H:0
M:5 S:56 H=Byte4 M=Byte2 S=Byte0
Byte: 0= 85
&h55 &b01010101
Byte: 1=
0 &h00 &b00000000
Byte: 2=
5 &h05 &b00000101
Byte: 3=
0 &h00 &b00000000
Byte: 4=
0 &h00 &b00000000
Byte: 5=
0 &h00 &b00000000
Byte: 6=
2 &h02 &b00000010
......
Zur ersten Orientierung kann man die aktuelle Systemzeit aus dem Bios
entnehmen (wobei meist eine Sekunde Differenz besteht =
Programmlaufzeit)
Im obigen Beispiel
Byte 0 = &h55 entspricht 55 Sekunden
Byte 2 = &h05 entspricht 05 Minuten
Byte 4 = &h00 entspricht 00 Stunden
Aktuelle Systemzeit (siehe erste Zeile) 00:05:56
Woraus man erkennt, dass die Systemzeit BCD codiert ist (dazu
später mehr).
Weiteres Beispiel (zweiter Durchlauf= Eintrag "Wake up on RTC Alarm"
eingeschaltet, sonst keine Änderungen im BIOS Setup)
.....
Byte: 84=122
&h7A &b01111010
Byte: 85= 57
&h39 &b00111001
Byte: 86= 2
&h02 &b00000010
Byte: 87= 0
&h00 &b00000000
Byte: 88= 0
&h00 &b00000000
....
Byte: 123= 10
&h0A &b00001010
Byte: 124= 83
&h53 &b01010011
Byte: 125= 0
&h00 &b00000000
Byte: 126= 0
&h00 &b00000000
Byte: 127= 76
&h4C &b01001100
OldByte: 0= 85
&h55 &b01010101
NewByte: 0= 52
&h34 &b00110100
OldByte: 2=
5 &h05 &b00000101
NewByte: 2=
8 &h08 &b00001000
OldByte: 84=114
&h72 &b01110010
NewByte: 84=122
&h7A &b01111010
OldByte: 124= 75
&h4B &b01001011
NewByte: 124= 83
&h53 &b01010011
Die Unterschiede zwischen erstem und zweiten Durchlauf:
Byte0 und Byte2 sind (logischerweise) unterschiedlich, da der zweite
Aufruf von CmosDos knapp 3 Minuten später erfolgte (00:08:34).
Diese Unterschiede lasse ich im folgenden Text weg.
Interessant sind die anderen Unterschiede:
Am Byte 84 hat sich nur 1 Bit geändert (rot markiert)
Byte 124 hat sich auch geändert, und zwar um denselben Betrag (8)
=> Byte 84 scheint für das Ein - und Ausschalten der WakeUp
Funktion zuständig zu sein und zwar das 4. Bit = Bit Nr. 3 (Die
Bits werden von rechts nach links durchgezählt, also von 0 bis 7)
=> Byte 124 enthält vermutlich (einen Teil der) Checksumme.
Dritter Durchlauf: Eintrag "Wake up on RTC Alarm" eingeschaltet, WakeUp
gesetzt auf Tag=01 Stunde=02 Minute=03
.....
Byte: 84=122
&h7A &b01111010
Byte: 85= 57
&h39 &b00111001
Byte: 86= 1
&h01 &b00000001
Byte: 87= 2
&h02 &b00000010
Byte: 88= 3
&h03 &b00000011
....
Byte: 123= 10
&h0A &b00001010
Byte: 124= 87
&h57 &b01010111
Byte: 125= 0
&h00 &b00000000
Byte: 126= 0
&h00 &b00000000
Byte: 127= 76
&h4C &b01001100
OldByte: 86= 2
&h02 &b00000010
NewByte: 86= 1
&h01 &b00000001
OldByte: 87= 0
&h00 &b00000000
NewByte: 87= 2
&h02 &b00000010
OldByte: 88= 0
&h00 &b00000000
NewByte: 88= 3
&h03 &b00000011
OldByte: 124= 83
&h53 &b01010011
NewByte: 124= 87
&h57 &b01010111
Wie man unschwer erkennen kann, entspricht Byte 86 dem Tag, Byte 87 der
Stunde und Byte 88 der Minute. Der Verdacht, dass Byte 124 ein Teil der
Checksumme ist, erhärtet sich.
Vierter Durchlauf: Eintrag "Wake up on RTC Alarm" eingeschaltet, WakeUp
gesetzt auf Tag=11 Stunde=12 Minute=13
.....
Byte: 84=122
&h7A &b01111010
Byte: 85= 57
&h39 &b00111001
Byte: 86= 11
&h0B &b00001011
Byte: 87= 12
&h0C &b00001100
Byte: 88= 13
&h0D &b00001101
....
Byte: 123= 10
&h0A &b00001010
Byte: 124=117
&h75 &b01110101
Byte: 125= 0
&h00 &b00000000
Byte: 126= 0
&h00 &b00000000
Byte: 127= 76
&h4C &b01001100
OldByte: 86= 1
&h01 &b00000001
NewByte: 86= 11
&h0B &b00001011
OldByte: 87= 2
&h02 &b00000010
NewByte: 87= 12
&h0C &b00001100
OldByte: 88= 3
&h03 &b00000011
NewByte: 88= 13
&h03 &b00001101
OldByte: 124= 87
&h57 &b01010111
NewByte: 124=117
&h75 &b01110101
Wie schon vorher entspricht Byte 86 dem Tag, Byte 87 der Stunde und
Byte 88 der Minute. Außerdem kann man erkennen, dass die
Codierung
dieser Werte dezimal erfolgt (und nicht BCD (~Hex) codiert ist wie bei
der RTC (Echtzeituhr) auf den Bytes 00, 02 und 04). Der Verdacht, dass
Byte 124 ein Teil der Checksumme ist, erhärtet sich weiter.
Fünfter Durchlauf: Eintrag "Wake up on RTC Alarm" eingeschaltet,
WakeUp gesetzt auf Tag=31 Stunde=23 Minute=59
....
Byte: 84=122
&h7A &b01111010
Byte: 85= 57
&h39 &b00111001
Byte: 86= 31
&h1F &b00011111
Byte: 87= 23
&h17 &b00010111
Byte: 88= 59
&h3B &b00111011
.....
Byte: 123= 10
&h0A &b00001010
Byte: 124=194
&hC2 &b11000010
Byte: 125= 0
&h00 &b00000000
Byte: 126= 0
&h00 &b00000000
Byte: 127= 76
&h4C &b01001100
....
OldByte: 124=117
&h75 &b01110101
NewByte: 124=194
&hC2 &b11000010
(Die anderen Unterschiede lasse ich jetzt weg) In diesem Fall konnte
nur ein Byte für die Checksumme ermittelt werden (auch mit
Extremwerten). Um das zweite Checksummen Byte zu ermitteln muss
irgendwas anderes im BIOS Setup verändert werden (z.B. andere
Power
Management Einstellungen: Power up per Modem...).
Sechster Durchlauf: Eintrag "Wake up on RTC Alarm" eingeschaltet,
WakeUp gesetzt auf Tag=01 Stunde=00 Minute=00, Harddisk off in Suspend
mode ausgeschaltet (war vorher an)
Byte: 123=
09 &h09 &b00001001
Byte: 124=210
&hD2 &b11010010
Damit ist auch das zweite Byte gefunden!
(Ein weiteres - etwas kompliziertes Beispiel
für das MSI MS-6380 Board ist am Ende dieses Textes zu finden)
Wenn man mit dieser Methode keine passenden Bytes findet, kann man noch
versuchen mit CMOSConfig im 256 Byte Modus das Bios auszulesen, die 256
Byte BIOS Unterstützung ist aber noch sehr experimentell!
Ergebnisse:
Wake up on RTC Alarm on/off = Byte 84 Bit 3 (im folgenden "ByteOnOff"
und BitOnOff)
Wake up Tag = Byte 86 (im folgenden "ByteDay")
Wake up Stunde = Byte 87 (im folgenden "ByteHour")
Wake up Minute = Byte 88 (im folgenden "ByteMinute")
(Alle Werte sind dezimal codiert)
Erstes (höherwertiges) Byte der Checksumme 123 (im folgenden
"ByteCheckSumH")
Zweites (niederwertiges) Byte der Checksumme 124 (im folgenden
"ByteCheckSumL")
Diese Werte können jetzt im CMOSConfig - Programm eingetragen
werden.
(Speziell diese Werte stehen da auch schon drin)
Screenshot: (Bisher nur englische Oberfläche, SORRY)
Beschreibung der
einzelnen Befehle/Einstellungen
DumpBIOS liest
die aktuellen 128 Bytes aus dem BIOS aus und zeigt sie in der Liste an.
Auch hier wird jedes Byte in dezimal, hex und binär dargestellt.
Wenn die Option ReadWriteFile aktiviert ist, (default=nein) wird
ähnlich wie bei CmosDos eine B#.txt Datei erzeugt, welche den
aktuellen BiosDump enthält, sowie die Unterschiede zur vorigen
B#.txt Datei. Außerdem wird entsprechend den aktuellen Parametern
die WakeUp Zeit ermittelt und im rechten Fenster unter "WakeUp settings
(as configured):" angezeigt.
Mit Compare kann der aktuell
angezeigte BIOSDump mit einer beliebigen B#.txt Datei verglichen werden
(auch mit solchen von CmosDos). Die Unterschiede sind immer am unteren
Ende der Liste zu finden. Wenn man noch keinen BIOSDump
durchgeführt hat (Liste ist noch leer), kann man auch eine B#.txt
Datei einlesen und mit weiteren B#.txt Dateien vergleichen (nach dem
Einlesen der "ersten" B#.txt Datei nochmals Compare klicken).
Quit beendet das Programm ohne Nachfrage.
Im Config - Fenster können die ermittelten Parameter eingegeben
und mit dem Kommando WriteReg
in
der Windows Registry gespeichert werden.
ByteDay: Auf diesem Byte wird
der "AufwachTag" gespeichert. Je nachdem ob der "AufwachTag" BCD (Hex)
oder dezimal codiert ist, werden entweder 6 Bits (bei BCD Codierung)
oder 5 Bits (bei dezimaler Codierung) "bearbeitet" - es wird also nicht
das "ganze" Byte neu geschrieben, sondern nur die nötigen Bits.
Welche Bits von diesem Byte bearbeitet werden, wird durch das BitDay festgelegt. Hier kann eine
"Verschiebung" des Wertes eingestellt werden (Nur bei manchen
Mainboards
erforderlich, normalerweise 0). Die Bits werden von rechts nach links
durchgezählt also vom 0 bis 7:
Bit
76543210
Wert:(bsp)
&b10101010
Ein paar Beispiele zu den verschiedenen Möglichkeiten sind
wahrscheinlich besser verständlich als lange Erklärungen:
Der "AufwachTag" ist bei den folgenden Beispielen immer 15 (und es
werden immer die rot markierten Bits vom CMOSTimer
verwendet/verändert)
Einfachster Fall: "AufwachTag" ist dezimal ohne Verschiebung und ohne
sonstige Werte auf dem Byte gespeichert:
Byte:
ByteDay= 15 &h0F &b00001111 => BitDay=0 HexD=Aus
Zweit-Einfachster Fall: "AufwachTag" ist BCD ohne Verschiebung und ohne
sonstige Werte auf dem Byte gespeichert:
Byte:
ByteDay= 21 &h15 &b00010101 => BitDay=0 HexD=Ein
Die folgenden Fälle sind schwieriger zu erkennen...
"AufwachTag" ist dezimal ohne Verschiebung aber mit sonstigen Werten
(blau) auf dem Byte gespeichert:
Byte:
ByteDay=143 &h8F &b10001111 => BitDay=0 HexD=Aus
"AufwachTag" ist BCD ohne Verschiebung aber mit sonstigen Werten (blau)
auf dem Byte gespeichert:
Byte:
ByteDay=213 &h8F &b11010101 => BitDay=0 HexD=Ein
"AufwachTag" ist dezimal mit Verschiebung und mit sonstigen Werten
(blau) auf dem Byte gespeichert:
Byte:
ByteDay=223 &hDF &b11011111
=> BitDay=1 HexD=Aus
ByteHour: Auf diesem Byte wird
die "AufwachStunde" gespeichert. Eine Verschiebung kann mit BitHour>0 bewirkt werden. Es gilt
sinngemäß das unter ByteDay und BitDay gesagte.
ByteMinute: Auf diesem Byte
wird die "AufwachMinute" gespeichert. Eine Verschiebung kann mit BitMinute>0 bewirkt werden. Es
gilt sinngemäß das unter ByteDay und BitDay gesagte, nur
dass
hier 6Bits (dezimal) oder 7 Bits (BCD) verwendet werden.
ByteOnOff:
Auf diesem Byte wird gespeichert ob WakeUp aktiviert oder deaktiviert
ist. Von diesem Byte wird nur ein Bit neu geschrieben:
BitOnOff: Das Bit des
OnOff-Bytes, welches für das Ein - und Ausschalten der WakeUp
Funktion zuständig ist.
ChkD, ChkH, ChkM und Check01: Mit diesen CheckBoxen kann
man angeben ob die entsprechenden Bytes (ByteDay, ByteHour, ByteMinute
und ByteOnOff) in der Checksumme berücksichtigt sind, oder nicht.
Meist ist entweder jedes, oder keines dieser Bytes in der Checksumme
enthalten, aber vielleicht gibt es auch ein Mainboard bei welchem die
"Aufwachzeit" auf den Bytes 1,3,5 gespeichert wird (diese Bytes sind normalerweise nicht Teil der
Checksumme), und das ByteOnOff auf Byte 101 (normalerweise Teil der
Checksumme).
HexD, HexH und HexM: Mit diesen CheckBoxen kann man
angeben ob die entsprechenden Bytes (ByteDay, ByteHour und ByteMinute)
dezimal oder BCD (Hex) codiert sind. Wenn man im BIOS Setup z.B. als
Tag
"15" eingestellt hat und der zugehörige BIOSDump so aussieht:
Byte:
86= 15 &h0F &b00001111
dann ist der Wert dezimal. Wenn dagegen der zugehörige BIOSDump so
aussieht:
Byte:
86= 21 &h15 &b00010101
(sprich man findet die "15" als &h15)
dann ist dieser Wert BCD codiert und die entsprechende CheckBox (HexD)
muss aktiviert werden (sonst werden falsche "Aufwachzeiten"
generiert!).
Das gleiche gilt sinngemäss auch für HexH und HexM.
ByteCheckSumH: Höherwertiges
Byte der Checksumme (im allgemeinen der kleinere Wert, bzw. derjenige
welcher sich nicht immer ändert)
ByteCheckSumL: Niederwertiges
Byte der Checksumme (im allgemeinen der höhere Wert, bzw.
derjenige
welcher sich immer (d.h. bei jeder Veränderung der "Aufwachzeiten"
im BIOS) ändert)
Ein paar Worte zur Checksumme: Bei meinem Mainboard (ich habe kein
anderes welches eine erweiterte Checksumme verwendet) wird die
Checksumme durch Addition der Werte von den Bytes 64 (=FirstCheckByte)
-
122 (=LastCheckByte) jeweils einschließlich gebildet. Diese Summe
ist (natürlich) höher als 256 so dass zum Speichern dieses
Wertes zwei Bytes erforderlich sind. Man kann die zwei Bytes der
Checksumme wie einen 16 Bit Wert (auch "Word" genannt) auffassen, wovon
die ersten 8 Bit auf dem ByteCheckSumH stehen und die zweiten ersten 8
Bit auf dem ByteCheckSumL (Programmintern wird die Checksumme auch als
"Word" behandelt).
Manche Mainboards brauchen anscheinend gar keine Checksumme, in diesem
Fall kann man die Option "CheckSumRequired"
einfach deaktivieren, und hat auch keine Probleme mit der Berechnung
selbiger. Wenn man die Checkboxen ChkD, ChkH, ChkM und Check01 alle deaktiviert hat, bewirkt
das natürlich das gleiche. (Achtung: Die
Parameter ByteCheckSumH und
ByteCheckSumL müssen trotzdem irgendeinen
Wert zwischen 0 und 128 haben, dieser wird jedoch nicht verwendet).
ReBootRequired:
Einige Mainboards (u.a. auch mein K7N2-L) "aktivieren" die
Veränderungen im BIOS erst nach einem Neustart. Daher kann der
CMOSTimer nach dem Eintragen der "AufwachZeit" einen Reboot
auslösen und den Rechner erst anschließend abschalten. Um zu
Testen ob dies erforderlich ist, kann man die Option mal ausschalten,
von CMOSConfig (oder CMOSTimer) eine Aufwachzeit im BIOS eintragen
lassen, und den Rechner abschalten. Wenn dieser dann nicht zur
eingestellten Zeit startet, liegt es meist daran.
Die "Required ReBoot time" gibt
an, wie viele Sekunden der Rechner zum neu booten (einschließlich
runterfahren) benötigt. Am Anfang ruhig einen relativ hohen Wert
(z.B. 150 sek) einstellen, dadurch hat man Gelegenheit in den Prozess
einzugreifen. Ansonsten bringt man sich ggf. in eine Situation wo der
Rechner neu bootet im Autostart ein Programm vorfindet (CMOSTimer)
welches den Rechner neu bootet... (nur falls wirklich etwas sehr schief
geht - normalerweise ist das erste was der CMOSTimer beim Starten
erledigt, den Reboot - Eintrag aus Autostart zu entfernen!)
Das "Test - Fenster" ermöglicht das
Testen der
ermittelten/eingetragenen Parameter
Day -
Hour - Minute enthält
"Default" Werte (ca. 20 min nach Start von CMOSConfig) man kann hier
aber beliebige (gültige!!! Also kein 32. Tag) Werte eintragen.
TimerOnOff betrifft das BitOnOff (aus dem ByteOnOff) und trägt
entweder WakeUp enabled oder disabled ein.
CreateTestFile: Das dürfte
die wichtigste Testfunktion sein: Mit dieser Funktion wird das
Schreiben
ins BIOS simuliert und als eine B#.txt Datei gespeichert. Man
erhält also eine B#.txt Datei wie sie ein BIOSDump ausgeben
würde, NACHDEM die Test - Day, Hour, Minute Werte (sowie die ggf.
nötige Checksumme) im BIOS eingetragen sind.
Folgendes Vorgehen würde ich empfehlen:
Nachdem man alle nötigen Parameter (ByteDay, ByteHour,
ByteCheckSum...) eingetragen (und mit WriteReg gespeichert) hat, ein
TestFile (B#.txt) erstellen mit "einfachen" Werten für den
"Aufwachzeitpunkt" (z.B. Tag 11, Stunde 12, Minute 13).
Rechner neu booten und denselben "Aufwachzeitpunkt" (z.B. Tag 11,
Stunde 12, Minute 13) "von Hand" im BIOS Setup eintragen. Windows
starten, CMOSConfig starten, BIOSDump
erstellen und mit "Compare" mit
dem zuvor erstellten TestFile (das B#.txt File mit der höchsten #
-
Nummer) vergleichen lassen. Es sollten dann keine Unterschiede bis auf
die RTC Bytes (Byte0, Byte2 und ggf. Byte4) gefunden werden.
Wenn das klappt, kann man mit "Write
to CMOS" einen "realen" Test durchführen. Also den
"Aufwachzeitpunkt" auf ca. 15 min später (als die aktuelle Zeit)
einstellen "Write to CMOS"
anklicken. Anschließend einen BIOSDump
durchführen und alle Werte nochmals überprüfen. Sollte
man dann ein Problem feststellen, kann man eine "Notreparatur"
versuchen:
Byte auf die Nummer des
"kaputten" Bytes setzen, Value
auf den (hoffentlich) richtigen Wert setzen und mit WriteByte direkt in das CMOSBios
schreiben.
Wenn alles O.K ist den Rechner mit "ReBoot
+ Shutdown" (oder auch nur mit "Shutdown")
ausschalten (oder auch "von Hand"). Dann abwarten ob der Rechner zur
eingestellten Zeit startet...
Sollte das der Fall sein, kann man z.B. im WinSTBTimer (ab Ver. 0.25)
die Funktion CMOSTimer verwenden.
Grundsätzlich sollte das Programm aber auch z.B. vom Windows
eigenen Task Scheduler aus verwendbar sein (oder jedem beliebigen
anderen Programm, welches den CMOSTimer mit den nötigen
Kommandozeilen Parametern (/wakeup=Datum+Uhrzeit bzw. /wakeuponly=Datum+Uhrzeit ohne ReBoot/Shutdown)
starten kann.
Viel Spaß (und Erfolg) wünscht Borax
Anhang:
Hier ist noch mal ein weiteres Beispiel zur Ermittlung der Programm
Parameter für ein MSI MS-6380 Mainbord. Bei diesem Board sind die
Aufwachzeiten doppelt im BIOS vorhanden, aber nur diejenigen Bytes die
Teil der Checksumme sind, werden auch verwendet. So ist z.B. der
"Aufwachtag" auf dem Byte 125 zu finden. Wenn man dieses Byte mit
WriteByte auf einen anderen Wert setzt und neu bootet, so steht im BIOS
wieder der ursprüngliche Wert!
Im folgenden sind nur die "interessanten" Bytes gezeigt, die
entsprechenden vollständigen Dateien B1.txt bis B6.txt sowie
B2a.txt und B6a.txt sind hier erhältlich:
Download:
B1-6a - downloads: 272
1. Durchlauf: WakeUp im BIOS ausgeschaltet, "Aufwachzeiten" stehen auf
"alten" Werten. (Tag=15, Stunde=12, Minute=30, Sekunde=30).
Byte: 1= 0 &h00 &b00000000
Byte: 3=
0 &h00 &b00000000
Byte: 5=
0 &h00 &b00000000
Byte: 62= 61
&h3D &b00111101
Byte: 63=239
&hEF &b11101111
Byte: 101= 94
&h5E &b01011110
Byte: 102= 76
&h4C &b01001100
Byte: 103= 30
&h1E &b00011110
Byte: 104= 30
&h1E &b00011110
Byte: 125= 0
&h00 &b00000000
2. Durchlauf: WakeUp im BIOS eingeschaltet, keine sonstigen
Änderungen im BIOS "Aufwachzeiten" stehen auf "alten" Werten
(Tag=15, Stunde=12, Minute=30, Sekunde=30).
Byte: 1= 48 &h30 &b00110000
Byte: 3= 48
&h30 &b00110000
Byte: 5= 18
&h12 &b00010010
Byte: 62= 61
&h3D &b00111101
Byte: 63=240
&hF0 &b11110000
Byte: 101= 95
&h5F &b01011111
Byte: 102= 76
&h4C &b01001100
Byte: 103= 30
&h1E &b00011110
Byte: 104= 30
&h1E &b00011110
Byte: 125= 21
&h15 &b00010101
OldByte: 1=
0 &h00 &b00000000
NewByte: 1= 48
&h30 &b00110000
OldByte: 3=
0 &h00 &b00000000
NewByte: 3= 48
&h30 &b00110000
OldByte: 5=
0 &h00 &b00000000
NewByte: 5= 18
&h12 &b00010010
OldByte: 63=239
&hEF &b11101111
NewByte: 63=240
&hF0 &b11110000
OldByte: 101= 94
&h5E &b01011110
NewByte: 101= 95
&h5F &b01011111
OldByte: 125= 0
&h00 &b00000000
NewByte: 125= 21
&h15 &b00010101
Auf den ersten Blick würde man folgendes mutmaßen:
ByteDay=125, ByteHour=5, ByteMinute=3 (und ByteSekunde=1) alle in BCD
und nicht Teil der Checksumme. ByteOnOff = 101 mit BitOnOff=0 in
Checksumme enthalten und ByteCheckSumL=63 (Wert ändert sich um 1,
aber nicht auf einem spezifischem Bit). Aber so stimmt das nicht, zu
sehen im nächsten Durchlauf:
3. Durchlauf: WakeUp im BIOS eingeschaltet, "Aufwachzeiten" gesetzt auf
Tag=01, Stunde=02, Minute=03, Sekunde=04.
Byte: 1= 4 &h04 &b00000100
Byte: 3=
3 &h03 &b00000011
Byte: 5=
2 &h02 &b00000010
Byte: 62= 61
&h3D &b00111101
Byte: 63=149
&h95 &b10010101
Byte: 101= 67
&h43 &b01000011
Byte: 102= 66
&h42 &b01000010
Byte: 103= 3
&h03 &b00000011
Byte: 104= 4
&h04 &b00000100
Byte: 125= 1
&h01 &b00000001
OldByte: 1= 48
&h30 &b00110000
NewByte: 1=
4 &h04 &b00000100
OldByte: 3= 48
&h30 &b00110000
NewByte: 3=
3 &h03 &b00000011
OldByte: 5= 18
&h12 &b00010010
NewByte: 5=
2 &h02 &b00000010
OldByte: 63=240
&hF0 &b11110000
NewByte: 63=149
&h95 &b10010101
OldByte: 101= 95
&h5F &b01011111
NewByte: 101= 67
&h43 &b01000011
OldByte: 102= 76
&h4C &b01001100
NewByte: 102= 66
&h42 &b01000010
OldByte: 103= 30
&h1E &b00011110
NewByte: 103= 3
&h03 &b00000011
OldByte: 104= 30
&h1E &b00011110
NewByte: 104= 4
&h04 &b00000100
OldByte: 125= 21
&h15 &b00010101
NewByte: 125= 1
&h01 &b00000001
Auf den zweiten Blick erkennt man folgendes: ByteMinute=3 (BCD codiert)
UND ByteMinute= 103 (dezimal codiert). Ähnlich ByteSekunde=1 (BCD
codiert) UND ByteSekunde=104 (dezimal codiert). Byte 101 ist nicht nur
ByteOnOff sondern auch noch was anderes. Byte 102 tut auch noch
irgendwas... Das Byte 63 ist wohl wirklich ein Teil der Checksumme,
aber
es sind auch die Bytes 101 bis 104 für die Checksumme zu
berücksichtigen, also ist es NICHT so, dass nur das ByteOnOff Teil
der Checksumme ist. Der nächste Durchlauf ist dann noch
aufschlussreicher:
4. Durchlauf: WakeUp im BIOS eingeschaltet, "Aufwachzeiten" gesetzt auf
Tag=11, Stunde=12, Minute=13, Sekunde=14.
Byte: 1= 20 &h14 &b00010100
Byte: 3= 19
&h13 &b00010011
Byte: 5= 18
&h12 &b00010010
Byte: 62= 61
&h3D &b00111101
Byte: 63=199
&hC7 &b11000111
Byte: 101= 87
&h57 &b01010111
Byte: 102= 76
&h4C &b01001100
Byte: 103= 13
&h0D &b00001101
Byte: 104= 14
&h0E &b00001110
Byte: 125= 17
&h11 &b00010001
OldByte: 1=
4 &h04 &b00000100
NewByte: 1= 20
&h14 &b00010100
OldByte: 3=
3 &h03 &b00000011
NewByte: 3= 19
&h13 &b00010011
OldByte: 5=
2 &h02 &b00000010
NewByte: 5= 18
&h12 &b00010010
OldByte: 63=149
&h95 &b10010101
NewByte: 63=199
&hC7 &b11000111
OldByte: 101= 67
&h43 &b01000011
NewByte: 101= 87
&h57 &b01010111
OldByte: 102= 66
&h42 &b01000010
NewByte: 102= 76
&h4C &b01001100
OldByte: 103= 3
&h03 &b00000011
NewByte: 103= 13
&h0D &b00001101
OldByte: 104= 4
&h04 &b00000100
NewByte: 104= 14
&h0E &b00001110
OldByte: 125= 1
&h01 &b00000001
NewByte: 125= 17
&h11 &b00010001
Wie schon vorher sieht man deutlich: ByteMinute=3 (BCD codiert) UND
ByteMinute= 103 (dezimal codiert), ByteSekunde=1 (BCD codiert) UND
ByteSekunde=104 (dezimal codiert). Wenn man sich jetzt die Bitfolgen
der
Bytes 102, 103, und 104 genau betrachtet, so kann man erkennen, dass
die
unteren Bits zunehmen:
Byte: 102
.....1100
Byte: 103 .....1101
Byte: 104 .....1110
Diese Werte entsprechen 12, 13 und 14. Also ist die Aufwachstunde auf
Byte 102 zu finden, wobei Bit 6 des Bytes 102 noch für irgend
etwas
anderes verwendet ist, was zwar das Programm nicht stört (es
werden
nur die Bits 0 bis 5 verwendet) aber die "Erkennung", da so ein Wert
von 76 auf diesem Byte stht und nicht 12. Die Bedeutung des Bytes 101
ist noch etwas schwieriger zu erkennen, aber nachdem jetzt schon die
Bytes für Stunde, Minute und Sekunde gefunden sind, wird wohl auf
Byte 101 der Tag codiert sein. Und so ist es auch. Wenn man mal die
Differenz der eingestellten Tage (zwischen Durchlauf 3 und 4)
betrachtet
findet man diese Differenz auf Byte 101: Durchlauf 3 Tag=1 und
Durchlauf
4 Tag=11 macht Delta1=10. OldByte: 101= 67 und NewByte: 101= 87 macht
Delta2=20. Dasselbe für 2. und 3. Durchlauf liefert: Delta1=14
(15-1) und Delta2=28 (95-67). Die Differenz auf Byte 101 ist also immer
doppelt so hoch wie diejenige der eingestellten Tage. Das ist auch
logisch, da das Bit 0 von Byte 101 ja das BitOnOff ist und daher
praktisch binär eine Null angehängt wird, was dezimal einer
Verdopplung entspricht. Der "Aufwachtag" ist also auf den Bits 1-5 des
Bytes 101 codiert. Daher muss ein Verschiebungsbit verwendet werden:
BitDay auf 1 setzen.
5. Durchlauf: WakeUp im BIOS eingeschaltet, "Aufwachzeiten" gesetzt auf
Tag=01, Stunde=00, Minute=00, Sekunde=00.
Byte: 1= 0 &h00 &b00000000
Byte: 3=
0 &h00 &b00000000
Byte: 5=
0 &h00 &b00000000
Byte: 62= 61
&h3D &b00111101
Byte: 63=140
&h8C &b10001100
Byte: 101= 67
&h43 &b01000011
Byte: 102= 64
&h40 &b01000000
Byte: 103= 0
&h00 &b00000000
Byte: 104= 0
&h00 &b00000000
Byte: 125= 1
&h01 &b00000001
Hier kann man den Aufwachtag auf Byte 101 auch gut erkennen.
6. Durchlauf: WakeUp im BIOS eingeschaltet, "Aufwachzeiten" gesetzt auf
Tag=31, Stunde=23, Minute=59, Sekunde=00.
Byte: 1= 0 &h00 &b00000000
Byte: 3= 89
&h59 &b01011001
Byte: 5= 35
&h23 &b00100011
Byte: 62= 62
&h3E &b00111110
Byte: 63= 26
&h1A &b00011010
Byte: 101=127
&h7F &b01111111
Byte: 102= 87
&h57 &b01010111
Byte: 103= 59
&h3B &b00111011
Byte: 104= 0
&h00 &b00000000
Byte: 125= 49
&h31 &b00110001
OldByte: 62= 61
&h3D &b00111101
NewByte: 62= 62
&h3E &b00111110
OldByte: 63=140
&h8C &b10001100
NewByte: 63= 26
&h1A &b00011010
Damit hat man das zweite Byte der Checksumme: Byte 62
Ergebnisse:
ByteOnOff=101
BitOnOff=0
ByteDay=101
BitDay=1
ByteHour=102
BitHour=0
ByteMinute=103
BitMinute=0
ChkD, ChkH, ChkM und Chk01 alle Ein
HexD, HexH und HexM alle Aus
ByteCheckSumH=62
ByteCheckSumL=63
ScreenDump des entsprechenden Config Fensters
Tests:
Die Datei B1.txt wurde geladen (mit Compare ohne vorherigen BIOSDump)
und mit den oben gezeigten Einstellungen ein TestFile (B2a.txt)
erstellt. Das Programm wurde geschlossen und die Datei B2.txt geladen (wieder mit Compare ohne vorherigen BIOSDump). Anschließend wurde diese "reale" Datei mittels
Compare
mit der Testdatei B2a.txt verglichen: Keine Unterschiede bis auf die
Bytes 0,1,2,3,5 und 125. Byte 0 und 2
gehören zur Systemzeit, diese Unterschiede sind also normal. Die
Bytes 1,3,5 und 125 gehören zur "Kopie" der Aufwachzeiten welche
aber vom BIOS nicht genutzt wird. Die "wichtigen" Bytes 101 bis 104
sowie die beiden Bytes der Checksumme 62 und 63 zeigen keine
Unterschiede!
Ähnlich wurde die Datei B5.txt geladen und mit den oben gezeigten
Einstellungen (bis auf TestDay, TestHour und TestMinute welche
entsprechend den Werten aus B6.txt auf 31,23 und 59 gesetzt wurden) das
TestFile (B6a.txt) erstellt.
B6.txt geladen und mit B6a.txt verglichen: Keine Unterschiede bis auf
die Bytes 0,2,3,5 und 125.