PDA

Ver la Versión Completa : Técnica Básica de acceso a puertos en XP


MaMu
22-04-2008, 08:39:33
-----------------------------------------------------------------
Nota:
Esta mini guía está orientada al uso del Puerto Paralelo desde Delphi
-----------------------------------------------------------------

La problemática surge, con la llegada de sistemas operativos basados en Windows NT donde la premisa fundamental es una cuestión de Seguridad.
Sabemos que un programa (y no escapan a éstos los que realizamos con Delphi) en sistemas operativos como XP, se ejecutan en modo Kernel o en modo Usuario, siendo este último el que nos compete. En el modo Kernel, es posible lograr un control sobre los periféricos mediante el diálogo entre la aplicación y su controlador (driver), ya que dicho modo, supone un acceso directo a recursos del sistema. Pero en el modo Usuario, por una cuestión muy simple, la seguridad, esto no nos es posible, por lo que dependeremos para acceder a un periférico de un controlador que corra sobre el modo Kernel, ya que en modo Usuario, tenemos si al menos acceso a los drivers.
Nos bastará con emplear un driver que este corriendo en nuestro Kernel.
Anterior a la aparición de los sistemas basados en NT, podíamos (y aún podemos si los tenemos instalados o lo seguimos usando) acceder a los puertos directamente, ya que no eran instrucciones de privilegio del modo Kernel. Las rutinas clásicas que empleabamos eran las siguientes:


procedure EscribePuerto(direccion:word;valor:byte);
begin
asm
mov dx,direccion
mov AL,valor
out DX,AL
end;
end;

function LeePuerto(direccion:word):byte;
begin
asm
mov dx,direccion
in al,dx
mov Result,al
end;
end;


En XP, podemos utilizar un driver, por ejemplo, podemos descargar http://www.logix4u.net/inpout32.htm (incluye un OCX y no ahorramosde distribuir la dll). Y hacer uso de dos funciones de esta librería estaticamente en nuestro programa:


implementation
function Inp32(wAddr:word):byte; stdcall; external 'inpout32.dll';
function Out32(wAddr:word;bOut:byte):byte; stdcall; external 'inpout32.dll';

Obviamente, para evitar excepciones, queda a criterio de cada uno de queforma cargar la librería en nuestra aplicación. Luego bien, su uso es muy básico y sensillo:


....
byteLeido:byte;
begin
//Enviar 8 al puerto $300
Out32($300,8) //Puerto=$300 - byte=8
//Leer el puerto $300
byteLeido:=Inp32($300); //Puerto=$300 - byte=8end;
end;
....


La alternativa que opté yo en su momento, es importar el OCX desdeDelphi que se incluye en la descarga, THWinterface, ya que meolvido de tener que distribuir la dll en otro archivo. Espero que les ayude esta mini guía, y se animen a retocar ymodificar esos programas que les han dejado de funcionar en XPdebido a las Funciones de Privilegio.

Saludos

mario2000
23-04-2008, 21:52:25
;) Muy agradecido por la informacion.