2010-01-30 6 views
5

Estoy tratando de escribir en los puertos 0x60 y 0x64, sin suerte.¿Cómo escribir en puertos de E/S en Windows XP? (Delphi7)

código de Delphi:

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

Al llamar PortOut, me sale una instrucción privilegiada EPrivilege excepción, porque IN y OUT sólo se puede ejecutar como Ring0.

Me gustaría saber cómo puedo obtener privilegios de Ring0 en una aplicación o cómo podría escribir en los puertos 0x60 y 0x64 usando alguna biblioteca externa existente.

+0

He resuelto el problema más rápido con la respuesta de stukelly; alexandrul también publicó una respuesta perfectamente funcional. – Tom

+1

Si usted va a utilizar las diversas DLL de puerto IO por ahí que no han resuelto el problema. Solo has profundizado en ello. Yo preveo MUCHOS BSOD (o lo que sea que los haya reemplazado en Windows 7) en el futuro de su software. –

+0

@ttmrichter En realidad, IO.DLL funciona increíblemente bien (excepto que es sólo de 32 bits y el autor dijo que sería muy difícil de hacer uno para x64 y no molesta). No he tenido ningún problema en absoluto y todo el mundo está contento con el resultado en Windows 2000, XP y 7. – Tom

Respuesta

6

Tener un vistazo a la IO.DLL from Geek Hideout.

IO.DLL permite puerto sin problemas de E/S operaciones para Windows 95/98/NT/2000/XP utilizando la misma biblioteca.

Aquí se muestra un ejemplo: Parallel Port I/O Using Delphi V 6.0

+0

Tengo un error en tiempo de ejecución, pero lo resolvió mediante http://www.mycockpit.org/forums/showthread.php?15624-Unable-to-extract-IO-SYS-on-XP – Tom

3

Por supuesto que podría causar problemas para los dispositivos que son controlados por un conductor. Cosas como IO.DLL están destinadas principalmente a tarjetas de interfaz para las que no existen controladores de Windows, o en las que el controlador de Windows está inactivo hasta que se activan.

Y como el puerto 60h es el controlador del teclado, y el teclado normalmente está en uso, podría causar problemas.

Si no está interconectando un hardware antiguo, sino simplemente tratando de portar el código dos (TP), le recomiendo que reescriba dicho código basado en las API normales de Windows.

6

La forma correcta de manejar estas situaciones es escribir un controlador de Windows, pero no se puede hacer en Delphi por falta de soporte. Requiere el DDK y un compilador de C. Las otras soluciones presentadas aquí funcionan, pero tenga en cuenta que generalmente dan acceso a cualquier puerto de E/S, no solo los que requiere su aplicación. Y eso podría ser un problema de seguridad: si la arquitectura x86 permite que el programador del sistema defina el IOPL (nivel de privilegio de E/S) y la mayoría de los sistemas lo configuran con un anillo 0, hay un motivo. Los controladores de puertos de E/S de acceso general son útiles para las pruebas y tal vez la creación de prototipos o como medidas provisionales, pero tendré mucho cuidado al implementarlos, especialmente si el sistema no está bajo estricto control. Si necesita ese tipo de acceso, definitivamente necesita comprender cómo funciona el kernel de Windows y sus controladores, y por qué, e implementar su propio controlador. La mayoría de las veces, Windows no está inseguro per se: se está ejecutando en muchos softwares no seguros con los privilegios incorrectos que lo hacen así.

+0

Buena respuesta. Lo que es al menos tan importante como todo el anillo 0 cosas es tener un controlador para coordinar y/o no permitir E/S de acceso desde múltiples procesos o incluso hilos. Queriendo acceso directo a los puertos es un signo de todavía pensando en términos de DOS - que no era una idea de dios, incluso bajo Windows de 16 bits (con múltiples aplicaciones simultáneas posibles). – mghie

0

Por Dios,

Ha sido un largo tiempo para mí. Acabo de lanzar mi DPro 2006 para ver el VCL en este y lo bombardeé. (Supongo que eso es lo que obtengo por no haber hecho ningún código Delphi en los últimos años en esta máquina ...y mantener los parches actualizados, además de instalar/desinstalar un jillion de otros paquetes pagos y FOSS en la caja ...)

Pero me parece que si agarró los archivos de encabezado para el Windows Driver Framework, o revise el sitio del Proyecto JEDI, puede encontrar algo para armar un controlador de Miniport o tal.

Sólo mi $ 0,02 vale

/s/BezantSoft

Cuestiones relacionadas