Entwickler-Ecke

Sonstiges (Delphi) - Windows-Uhrzeit änderung?


Sephiroth - Mo 12.12.05 17:18
Titel: Windows-Uhrzeit änderung?
Hallo,

folgende Frage: Speichert Windows irgendwo in einem Protokoll ab, wann das letzte mal die Windows-Uhrzeit verändert wurde?
Und wenn ja: Wie kann ich darauf zurückgreifen?

Erklärung:
Mein Programm muss wissen, unabhängig davon ob es läuft oder nicht, ob die Windows-Uhrzeit z.B. die letzten 30 min mehrmals verstellt wurde.

Vielen Dank schonmal für jede Antwort.


bockwurst - Mi 14.12.05 10:36

Ich weiß nicht ob Windows einen Eintag macht, wenn Die Uhrzeit in Windows geändert wird. Aber der Computer besitzt drei Uhren. Eine Bios, eine Computer und eine Betriebssystemuhr. Beim Programmstart von Windows holt sich Windows die Zeit von der Biosuhr. Also selbst wenn Windows sich eine Windowsuhrzeitänderung merken könnte, wäre es immer noch nicht sicher.


Sephiroth - Mi 14.12.05 10:42

Danke für die Antwort.

Ist die Bios nicht auch die Computerzeit?
Und gibt es eine Möglichkeit an diese Uhrzeiten zu gelangen?


Gruß
Sephiroth


Blackheart666 - Mi 14.12.05 10:48

Gruss !
Vieleicht Hilft Dir das ein wenig weiter.


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
... 
  private 
    { Private-Deklarationen } 
  public 
    { Public-Deklarationen } 
    procedure WMTIMECHANGE(var Message: TWMTIMECHANGE); message WM_TIMECHANGE; 
  end
 
var 
  Form1: TForm1; 
 
implementation 
 
{$R *.dfm} 
 
procedure TForm1.WMTIMECHANGE(var Message: TWMTIMECHANGE); 
begin 
 showmessage('Die Zeit wurde verändert'); 
end;


bockwurst - Mi 14.12.05 11:35

Nur noch wegen der alten Zeiten

Die Biosuhr holt sich beim Starten des Computers seine Zeit von der RTC. (RTC=Real Time Clock= richtige Uhr mit Batterie)

Abfrage und Programmierung der Echzeituhr

Adr. Inhalt
00h aktuelle Sekunde
01h Alarmsekunde
02h aktuelle Minute
03h Alarmminute
04h aktuelle Stunde
05h Alarmstunde
06h Tag der Woche 1=Sonntag, 2=Montag...
07h Tage des Monats
08h Monat
09h Jahr
0Ah Statusregister A der Uhr
0Bh Statusregister B der Uhr
0Ch Statusregister C der Uhr
0Dh Statusregister D der Uhr
32h Jahrhunder (19 oder 20)

Lesen einer Speicherstelle
mov al, Speicherstelle
out 70h, al
in al,71h

Schreiben einer Speicherstelle
mov al, Speicherstelle
out 19h, al
mov al, Neuer_Inhalt
out 71h, al



Unter mit dem Interrupt 21h der
Datum abfragen
Eingabe AH = 2Ah
Ausgabe AL = tag der Woche (0=Sonntag, 1=Montag ..),
CX = Jahr, DH = Monat,DL = Tag

Datum setzen
Eingabe AH=2Bh,CX=Jahr, DH=Monat, DL=Tag
Ausgabe AL = 0 (o.k.), AL = 255 (Datum unplausibel)

Uhrzeit Abfragen
Eingabe AH = 2Ch
Ausgabe CH=Stunde, CL=Minute, DH=Sekune, DL=Hunderstel Sekunde

Uhrzeit setzen
Eingabe AH=2Dh, CH=Stunde, CL=Minute, DH=Sekunde, DL=hunderstel Sekunde
Ausgabe AL=0(o.k.) AL=255 (uhr zeit unplausibel)


Bin mir allesdings nicht mehr sicher ob bei XP der Intterupt noch geht.


Sephiroth - Mi 14.12.05 12:27

@ bockwurst:

hmm ich habe bisher noch nichts mit Assembler und Speicheradressen gemacht, weshalb mir leider das Verständniss für das fehlt, was du da geschrieben hast.


@ Blackheart666:

Danke für den Tip. Während das Programm läuft, ist das natürlich die optimale Lösung.


Mein eigentliches Problem ist aber, dass mein Programm auch merken muss, das die Uhrzeit mehrmals in einem gewissen Zeitraum verstellt wurde, auch wenn es nicht läuft.


Gibt es eine Uhrzeit die unabhänig von der Windows-Uhrzeit läuft, sich nicht beim Update der Windows-Uhrzeit mitupdatet und auf die ich einfach zurückgreifen kann?
Wenn das existiert, könnte ich mein Problem auch lösen.


chrisw - Mi 14.12.05 12:45

Es gibt eine Funktion. die die Sekunden seit dem letzten Einschalten zählt (GetTickCount). Vielleicht hilft das !


bockwurst - Mi 14.12.05 16:09

Bei der RTC gibt es in den Statusregister kein Flag, welches angibt, ob sich die Uhrzeit geändert hat.
Aber eine andere Möglichkeit bietet das Netztwerk. Dazu muß dein Computer aber im Netzwerk sein und einen immer laufenden Server haben. Dieser kann dann so alles erkennen. Wann der Computer heruntergefahren ist und bestimmt auch die Systemzeit des Computers.

Weiterhin könntest du dir aber in eine Datei das letzte Datum/Uhrzeit merken und dann mit dem Neuem des nächsten Programmstarts vergleichen. Da würdest du aber nur grobe "Fehler" erkennen.