Announcement

Collapse
No announcement yet.

Zeit verlangsamen...

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • Zeit verlangsamen...

    Hallo,

    dies ist vielleicht eine etwas merkwürdige Frage, die mehr in das Gebiet der Physik spielt. ;-)<br>
    Aber ist es möglich die Uhrzeit am Computer zu verlangsamen und <br>
    kann man den DOS-Befehl "time" deaktivieren, d.h., dass es in der Eingabeaufforderung nicht mehr möglich ist das Datum zu verstellen?

    Tschüss Tim

  • #2
    Ja. Dazu muß der CMOS Timer Chip umprogrammiert werden. In einem gewählten Timerintervall wird ein Interrupt durch diesen ausgelösst. Die dahinterliegende BIOS/System Routine wird aber normalerweise jedesmal den CMOS Timer auf die gültigen Frequenzen zurückstellen. D.h. für Dich das Du nicht nur den CMOS Chip per Ports einstellen musst sondern auch diese Interrupt Routine ändern müsstest. Unter DOS kein Problem unter Windows aber "fast" unmöglich. Grundsätzlich wäre das dann wieder die programmierung eines VXD/SYS Treibers.
    Das Verhindern des Verstellen ließe sich dann rel. simple coden, indem einfach die eingestellten Zeiten ignoriert werden und einfach mit denen der Treiberroutine weitergearbeitet würde.

    Gruß Hage

    Comment


    • #3
      Hallo Hagen,

      ...also müsste ich einen VxD schreiben, der einen "Timer", zum Beispiel aller 5 Sekunden aufruft und die Interrupt Routine jedesmal ändert- oder... - Wie würde das im Gegensatz dazu unter DOS aussehen?

      Wie knan man die eingegebene Zeit abfangen und ins leere schicken, sodass es bei der alten Zeit (Datum) bleibt?

      Tschüss..

      Comment


      • #4
        Unter DOS einfach den Interruptvector des CMOS Timerchips auf eine eigene Interruptroutine setzen. Ich glaube es ist der Interrupt $0A.

        Gruß Hage

        Comment


        • #5
          Hallo Hagen,

          ich werde mir die Sache mit Interrupt $0A mal ansehen, aber mit dem Aufruf des "time"-Befehls bin ich jetzt noch nicht viel weiter gekommen - also ein VxD schreiben, der die Eingabe irgendwie abfängt???

          Tschüss Ti

          Comment


          • #6
            Hi,
            <br>
            <br>Betreff "time" in der Commandozeile abschalten:
            <br>Ist zwar nicht die feine Englische, aber sollte funktionieren:
            Command.com im Texteditor öffnen und nach "time" suchen. Irgenwann wird "time" zwischen irgenwelchen kryptischen Zeichen gefunden. Dieses Time ändern in xxxx. Damit hat man den Befehl umbenannt und niemand der den neuen Namen kennt kann die Zeit ändern (zumindest nicht mehr über command.com).
            <br>
            <br>Betreff Interrupt:
            <br>Den Hagen meint ist 1A und wird zur Abfarge der Bios Zeit/Datum verwendet.
            <br>Für deinen Zweck ("Wie würde das im Gegensatz dazu unter DOS aussehen?") hilft die folgende Dos Unit / Programm (wie das unter Windows läuft weiß ich leider nicht).
            Ich benutze hier den IRQ 8. Anstatt des writeln('Hallo'); Kannst du mal ein delay reinsetzen Betreff "Aber ist es möglich die Uhrzeit am Computer zu verlangsamen und". Das habe ich zu Dos Zeiten schonmal getestet und es tarten (so weit ich mich erinnern kann) keine gravierenden Nebeneffekte auf. Ach ja wenn das nach Beendigung des Programmes noch anhalten soll dann closeint weglassen.
            <pre>
            Unit EasyT{imer};

            Interface

            Procedure OpenInt;
            Procedure CloseInt;

            Var
            TimerProc : Procedure;

            Implementation

            Uses Dos;

            Var
            OldInt : Pointer;

            Procedure Hallo;
            Begin
            Write( 'Hallo' );
            End;

            Procedure NewInt; Interrupt;
            Begin
            Inline( $FA );
            {$F+}
            TimerProc;
            {$F-}
            Inline( $9C / $FF / $1E / OldInt );
            Inline( $FB );
            End;

            Procedure OpenInt;
            Begin
            GetIntVec( 8, OldInt );
            SetIntVec( 8, @NewInt );
            End;

            Procedure CloseInt;
            Begin
            SetIntVec( 8, OldInt );
            End;

            Begin
            End.
            </pre>
            <pre>
            Program Probe;
            Uses EasyT, Crt;

            Var
            ch : Char;

            {$F+}
            Procedure Hallo;
            Begin
            Write( 'Hallo' );
            End;
            {$F-}

            Begin
            @TimerProc := @Hallo;
            OpenInt;
            Repeat
            Ch := ReadKey;
            WriteLn( Ch );
            Until Ch = #27;
            CloseInt;
            End.
            </pre>
            <br>mfg
            <br>P

            Comment


            • #7
              Hallo Patrick,

              danke für den Tipp mit dem Ändern der Command.com.

              Leider gibt es dabei das Probelm, wenn jemand diese Methode kennt, kann er die Datei einfach wieder umändern oder sie mit einem Original ersetzen.<br>
              Dann habe ich ein Problem; es müsste doch möglich sein die Änderung irgendwie zu erkennen.

              Was macht Windows eigentlich genau, wenn die Zeit umgestellt wird?

              Tschüss Ti

              Comment


              • #8
                Hi,
                <br>
                <br>da würde ich wie Hagen schon sagte den IRQ 1A umbiegen und einfach die Funktion ins leere laufen lassen. Das heißt mit dem obigen Code den IRQ belegen und dann SetIntVec( 8, @NewInt ); GetIntVec( 8, OldInt ); so das der OldInt auf deine neue Prozedur zeigt und somit die alte gar nicht mehr ausgeführt wird. Die neue Prozedur kann man dann einfach leer lassen. Da ich das so noch nicht getestet habe weiß ich leider nicht ob es da zu Problemen kommt. Einfach mal ausprobieren.
                <br>Wenn das funktioniert dann:
                <br>Nachteil ist aber auch hier "wenn jemand diese Methode kennt" weiß der das du einen IRQ umbiegst, und das nur funktioniert wenn du nach dem Booten irgend ein Programm startest, das das macht (Z.B. in der Autoexec.bat). Dann geht der einfach hin und löscht die Zeile aus der Autoexec.bat und kann die Zeit umstellen.
                <br>
                <br>mfg
                <br>P

                Comment


                • #9
                  Ich weis nicht, meiner Meinung nach sind viel zu viele abhängige Prozesse beteiligt die eine stabile Zeitbasis benötigen. Da eben genau dieser CMOS Timer aber die Hauptgrundlage aller zeitbasierenden System auf einem PC ist müssten zwangsläufig massive Probleme mit allen wichtigen Gerätetreiber auftreten. Wenn ich eine "Schätzung" abgeben dürfte so müsste kein Festplatten-/Maus-/SCSI-/USB-Treiber mehr funktionieren, selbst der Tasksheduler müsste ausrasten. Angenommen dieser Tasksheduler würde nur noch ALLE Zeit einem einzigsten Task zukommen lassen, da er ja keinerlei Zeitbasis mehr hat dann steht das System meiner Meinung nach.

                  Gruß Hage

                  Comment


                  • #10
                    Hallo,

                    um ganz ehrlich zu sein, geht es mir im Moment zwar mehr um das Sicherstellen der Uhrzeit, aber trotzdem interessiert mich der obige Code.<br>
                    Wie sehen denn die Funktionen "Inline( $FA ); GetIntVec( 8, OldInt );" usw. in Delphi aus?

                    ... und was macht Windows beim Umstellen der Zeit bzw. der DOS "time-Befehl"?

                    Tschüss Ti

                    Comment


                    • #11
                      Hi,
                      <br>
                      <br>ob man das in Delphi machen kann weiß ich leider nicht.
                      Zunächst hatte ich das ohne Inline codiert. Die Inline Codes habe ich damals in einer Zeitschrift gefunden. Leider weiß ich nicht mehr was die Inline Commandos bedeuten.
                      <br>Vermutung (ohne Gewähr):
                      <pre>
                      Inline( $FA ); //Interruptcontroller Pausen
                      {$F+}
                      TimerProc;
                      {$F-}
                      Inline( $9C / $FF / $1E / OldInt ); //irgendwas war hier noch ...? und dann OldInt ausführen
                      Inline( $FB ); //Interruptcontroller einschalten
                      </pre>
                      <br>Was man ggf. auch machen könnte (Voraussetzung Win NT):
                      In WinNT kann man die Änderung der Zeit mit hilfe von Policys beschränken. Damit wäre der time Befehl nur noch für admins wirksam.
                      Nun schreibt man einen Dienst in Delphi, der die Uhrzeit in einem Timer immer um ein PaarSecunden zurücksetzt. Damit würde die Zeit langsamer vergehen. Wenn man dabei auch auf die gängigen Datums/Uhrzeits - Funktionen zurückreift, dürften auch andere Application/Treiber nicht davon beeinträchtigt werden.
                      <br>
                      <br>mfg
                      <br>p

                      Comment

                      Working...
                      X