2010-01-30 14 views
5

Sto provando a scrivere sulle porte 0x60 e 0x64, senza fortuna.Come scrivere sulle porte I/O in Windows XP? (Delphi7)

codice Delphi:

procedure PortOut(IOport: WORD; Value: BYTE); assembler; register; 
asm 
    XCHG DX,AX 
    OUT DX,AL 
end; 

Dopo aver chiamato PortOut, ottengo un'istruzione privilegiata EPrivilege un'eccezione, perché IN e OUT può eseguire solo come Ring0.

Mi piacerebbe sapere come ottenere i privilegi Ring0 come un'applicazione o come scrivere sulle porte 0x60 e 0x64 utilizzando una libreria esterna esistente.

+0

Ho risolto il problema più velocemente usando la risposta di stukelly; alexandrul ha anche pubblicato una risposta perfettamente funzionante. – Tom

+1

Se si stanno utilizzando le varie DLL della porta di uscita, non è stato risolto il problema. Ti sei solo scavato più a fondo in esso. Prevedo un sacco di BSOD (o qualsiasi cosa li abbia sostituiti in Windows 7) nel futuro del software. –

+0

@ttmrichter In realtà, IO.DLL funziona incredibilmente bene (tranne che è solo per 32 bit e l'autore ha detto che sarebbe molto difficile crearne uno per x64 e che non si preoccupi). Non ho avuto alcun problema e tutti sono contenti del risultato su Windows 2000, XP e 7. – Tom

risposta

6

Date un'occhiata al IO.DLL from Geek Hideout.

IO.DLL permette di porta senza soluzione di continuità di I/O operazioni per Windows 95/98/NT/2000/XP che utilizzano lo stesso biblioteca.

Ecco un esempio: Parallel Port I/O Using Delphi V 6.0

+0

Ho ricevuto un errore in fase di esecuzione, ma l'ho risolto utilizzando http://www.mycockpit.org/forums/showthread.php?15624-Unable-to-extract-IO-SYS-on-XP – Tom

3

Naturalmente che potrebbero causare problemi per i dispositivi che sono controllati da un driver. Roba come IO.DLL è principalmente pensata per le schede di interfaccia per le quali non esistono driver di Windows o dove il driver di Windows è inattivo fino a quando non viene attivato.

E poiché la porta 60h è il controller della tastiera e la tastiera è solitamente in uso, potrebbe causare problemi.

Se non si interfaccia l'hardware antico, ma si sta tentando di eseguire il port dos code (TP), consiglio urgentemente di riscrivere il suddetto codice in base alle normali API di Windows.

6

Il modo corretto per gestire questa situazione è scrivere un driver di Windows, ma non può essere eseguito in Delphi per mancanza di supporto. Richiede DDK e un compilatore C. Le altre soluzioni presentate qui funzionano, ma si tenga presente che di solito si dà accesso a a qualsiasi porta I/O, non solo a quelle richieste dall'applicazione. E questo potrebbe essere un problema di sicurezza - se l'architettura x86 consente al programmatore di sistema di definire l'IOPL (livello di privilegio I/O) e la maggior parte dei sistemi lo ha impostato su 0, c'è un motivo. I driver delle porte I/O di accesso generale sono utili per i test e forse per la prototipazione o come misure di stopgap, ma farò molta attenzione a distribuirli, specialmente se il sistema non è sotto stretto controllo. Se hai bisogno di questo tipo di accesso, devi assolutamente capire come funziona il kernel di Windows e i suoi driver, e perché - e implementare il tuo driver. La maggior parte delle volte Windows non è sicuro di per sé - è in esecuzione su molti software non sicuri con i privilegi sbagliati che lo rendono così.

+0

Buona risposta. Ciò che è almeno altrettanto importante di tutto lo spazio Ring 0 è avere un driver per coordinare e/o impedire l'accesso I/O da più processi o thread. Volere l'accesso diretto alle porte è un segno di pensare ancora in termini DOS: non era un'idea divina nemmeno sotto Windows a 16 bit (con più applicazioni concorrenti possibili). – mghie

0

Cavolo,

E 'stato un lungo periodo di tempo per me. Ho appena lanciato il mio DPro 2006 per guardare il VCL su questo e ha bombardato. (Suppongo che è quello che ottengo per non aver fatto alcun codice Delphi negli ultimi due anni su questa macchina ...e mantenendo aggiornate le patch, oltre a installare/disinstallare un jillion altri pacchetti pagati e FOSS sulla confezione ....)

Ma mi sembra che se hai afferrato i file di intestazione per Windows Driver Framework, o controlla il sito di Project JEDI, potresti trovare qualcosa per assemblare un driver Miniport o altro.

Solo il mio $ 0.02 pena

/s/BezantSoft

Problemi correlati