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)

Screendump1

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.

Screendump2

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.
Screendump4

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
screendump5

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
Screendump6

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.