Announcement

Collapse
No announcement yet.

unter Delphi 4 auf den Parallelport zugreifen (über API).

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

  • unter Delphi 4 auf den Parallelport zugreifen (über API).

    Hi

    TPortIO ist soviel ich weiß NICHT zugänglich
    Bei DSP (Delphi Super Page) oder Torry (www.torry.ru), aber schau mal hier im "Links" Bereich nach dort sind alle URLs gelinkt.

    >Dass eine Anwendung sich auf Ring0 begeben kann, sollte das OS ja >gerade verhindern :-). Damit kann man ja dann auch auf alle >deskriptoren zugreifen, interessant.

    Ja, und sehr gut erkannt. Der erste Schritt in die Tiefen die tiefer sind als Windows selber, nämlich die Intel PM Tiefen.
    Um ehrlich zu sein, die 50 Zeilen Assembler machen nichts anderes als solche Descriptoren zu erzeugen und in die globale Descriptorentabelle einzutragen. Als nächstes braucht man nur ein Callgate Aufruf tätigen zur IO-Routine. Funktioniert bei allen Win95 Derivaten, NT System verwalten die Descriptoren anders und die 2 wesentlich ASM Befehle sind dort auch privilegiert.

    Ja, nun mit dem Sourcenaustausch, hm. Ist so'ne Sache, Du wirst im WEB rein garnichts finden. Ich hab's schon versucht dieses Thema ist entweder absolut inside, oder nur extrem wenigen bekannt. Auf jeden Fall habe ich in allen Bereichen wie C,ASM,PASCAL,System- Programmierung gesucht und NICHTS gefunden. AUSSER die Intel Dokumentationen der CPU's.

    Normalerweise bin ich nicht gnausrig und hocke auf meinen Sachen, dieser Fall ist aber die einzigste Ausnahme. Die 50 Zeilen kosteten mich ca. 8 Stunden pro Zeile !!!!

    Gruß Hagen

    PS: Irgend welche Ideen wie Du trotzdem ins Geschäft kommen willst bitte dann per E-Mail Mailto:[email protected]

  • #2
    unter Delphi 4 auf den Parallelport zugreifen (über API).

    Hallo!

    Ich habe eine Frage bezüglich der Ansteuerung des Parallelports (z.b. für eine Relaissteuerung) unter Delphi. Bei TP oder Delphi1 konnte ich noch (praktisch) über die befehle<br>
    <pre>
    port[$378] := $8A;
    port[$37A] := $01;
    </pre>

    auf den Parallelport zugreifen. Kann mir vielleicht jemand sagen wie ich das unter Delphi 4 realisieren kann?
    Danke shon mal im vorraus, hendrik buschmeier ([email protected])

    Comment


    • #3
      Ich kann dir dafür kleine assemblerfunktionen geben, die genau das gleiche wie die portbefehle sind. Funktionieren jedoch nur unter Win9x, da NT keine direkten portzugriffe erlaubt :-(

      mfg
      CR

      Comment


      • #4
        Versuch es doch mal mit CreateFile. Damit mußt du LPT1 oder COM1 (oder wo immer deine Steuerung ist) öffnen. Über ReadFile und WriteFile kannst du kann auf den Port zugreifen. Schau einfach in die Win32 - Hilfe von Delphi

        Ich weiss nicht ob es direkter geht, vermutlich nur über das direkte Ansprechen des Porttreibers von Windows (?).
        Wenn der indirekte Weg zu langsam ist, bleibt nur ein virtueller Treiber, der direkten Zugang zum Port hat. Unter 98 und 95 kann man den direkt im Programm laden. Unter NT4 geht das glaube ich nicht.
        Ich hab das schon mal versucht, und unter Win98 hats geklappt.
        (Wenn du daran interessiert sein solltest dann schick eine mail ([email protected])

        Jürgen Kort

        Comment


        • #5
          hi cra.<br>
          wäre nett wenn du mir die befehle mal per email zuschicken könntest. das ganze soll im prinzip auch nicht unter nt sondern in win 95/98 laufen. mail: [email protected] danke, hen

          Comment


          • #6
            Hi

            Hendrik, vergiß es. Unter Win95/98 stehen NUR Ports bis Addresse 255 ($FF) zu Verfügung. Alle Ports oberhalb >= $100 sind privelegiert. D.h. die assemblerbefehle funktionieren auf Ring3 nicht, dazu benötigst Du schon Ring0. Soviel wie ich gehört habe, soll beim Win98 sogar kein Port mehr ohne entspr. Privileg ansprechbar sein, also so wie beim NT/2000.

            Die Assemblerbefehle:

            <pre>

            function ReadPort(Port: Word): Byte; Assembler;
            asm
            MOV DX,Port
            IN AL,DX
            end;

            procedure WritePort(Value: Byte; Port: Word); assembler;
            asm
            OUT DX,AL
            end;

            </pre>

            Gruß Hage

            Comment


            • #7
              Hi Hagen !

              Bei mir funktionieren diese funktionen unter Win98 und es kommen auch keine Fehlermeldungen wie privilegierte anweisung usw... Die Adresse des parallelports liegt auch über $100 (bei meinem system: $0378).

              mfg
              CR

              Comment


              • #8
                Versuch es mal mit folgender Komponente: http://www.waveflow.com/vcl.htm -> TParport. Funktioniert leiter auch nur für Win 9x

                Comment


                • #9
                  Hi CRA

                  Korrekt ! Es wird keinerlei Schutzverletzungen geben, da KEINE ausgelöst werden sondern einfach ungültige Werte zurückgeliefert werden Erst NT/2000 erzeugt eine Schutzverletzung wenn auf nicht privelegierte Ports zugegriffen wird.

                  Drauf gekommen bin ich durch ein kleineres Projekt das die Festplatteninfo's auslesen sollte. Deren Ports sind z.B. $3F8 & $1F6 etc. Auch da gab es keinerlei Zugriffsverletzung ABER auch keinerlei gültige Werte ! Nachdem ich so alle verfügbaren Free/Shareware Port Komponenten bei DSP und Torry durchgetestet hatte, stand fest, KEINE der Komponenten konnte korrekt auf Ports zugreifen (ich meine unter Win95/98/NT/2000). Also habe ich mich selber ans Werk gemacht, und NUN funktioniert es unter allen Windows Versionen.

                  Gruß Hagen

                  PS: Meinst Du Win98 Second Edition oder die alte

                  Comment


                  • #10
                    Hi Hagen

                    Ich habe es ausprobiert, du hast recht. Ich konnte keines der relais, die an der LPT-Schnittstelle hängen, mehr ansteuern. Aber in Win95, da bin ich mir absolut sicher, da hat es funktioniert, bei Win98 bin ich mir schon nicht mehr sicher... Ich habe das jetzt unter Win98 SE ausprobiert und da gehts auf jeden fall nicht mehr. Was hast du gemacht, dass es auf allen versionen funktioniert ??

                    PS: das ist ja mal wieder typisch microsoft, einfach ungültige werte auszugeben, anstatt zumindest einen hinweis darauf geben zu können, dass das nicht mehr erlaubt ist. Naja, im mittelalter wars die pest und jetzt isses halt windows, irgendwas plagt die menschheit immer.

                    mfg
                    CR

                    Comment


                    • #11
                      Hi CRA

                      JaJa, ich behaupte sowas nicht ohne Grund

                      Microsoft kannst'e aber auch nicht die Schuld geben, oder zumindest nur teilweise. $MS hat IMMER betont das NUR Treiber, seien es VXD's,SYS's oder Services, auf die Hardware zugreifen DÜRFEN. Dazu hat $MS ja das DDK herrausgegeben. Du hast also schon zu Win95 Zeiten den falschen Weg beschritten.

                      Nun, was kannste tun:

                      a) einen VXD programmieren
                      b) fertige Komponenten nutzen da die guten auch kosten !
                      c) wiederum tricksen, da auch beim Win98 ME ein Ring3 Code sich selbst auf Ring0 hochhieven kann !!! D.h. eine normale Anwendung kann sich selbst Treiberprivelegien aneignen. Übrigens sind das gerademal 50 Zeilen Assemblerquelltext. Ich glaube die TPortIO Komponente geht so vor.

                      Gruß Hagen

                      PS: beim Win95 ging es nur mit der Beta (Win95b) Version, alle nachfolgenden Win95 Version erlaubten dann keinen Zugriff mehr. Zumindestens nach meinen Erfahrungen. Aber wo Du Recht hast, hast'e Recht: $MS hat kein Wort darüber verloren :

                      Comment


                      • #12
                        Nun, dann wird es ja mal Zeit, dass ich das ganze neu schreibe. Könntest du mir bitte mal diese 50 zeilen Assemblercode mailen:
                        [email protected]<br>
                        oder falls du nicht willst, mir sagen wo ich die finden kann. Ist der quellcode der TportIO komponente zugänglich ? Wo finde ich die überhaupt ? Dass eine Anwendung sich auf Ring0 begeben kann, sollte das OS ja gerade verhindern :-). Damit kann man ja dann auch auf alle deskriptoren zugreifen, interessant.

                        danke im voraus
                        <br>mfg
                        <br>CR

                        Comment

                        Working...
                        X