Foros del Web » Programación para mayores de 30 ;) » C/C++ »

Modificar esta librería para adaptarlo a los nuevos tiempos

Estas en el tema de Modificar esta librería para adaptarlo a los nuevos tiempos en el foro de C/C++ en Foros del Web. Hola: En esta Web podemos descargar las librerías del puerto paralelo, son del año vete a saber. Como hobby, recuperamos equipos viejos inclusos portátiles con ...
  #1 (permalink)  
Antiguo 06/12/2015, 18:08
 
Fecha de Ingreso: mayo-2007
Ubicación: PIC-16F84A
Mensajes: 729
Antigüedad: 17 años, 6 meses
Puntos: 8
Modificar esta librería para adaptarlo a los nuevos tiempos

Hola:

En esta Web podemos descargar las librerías del puerto paralelo, son del año vete a saber. Como hobby, recuperamos equipos viejos inclusos portátiles con puerto paralelo. En un PC de sobremesa, hay placas que no te vienen puerto paralelo dentro de la placa, otras si pero no por detrás. Para controlar puerto paralelo integrado en la placa con la librería, aquí hay un tutorial y funciona bien, no para las tarjetas PCI.

Si consigues una tarjeta PCI con puerto paralelo, estas librerís no sirven, te da unpantallazo azul, según me cuentan algunas personas de Internet. La dirección física que te da en la BIOS es para la placa integrada, las que no tienen puerto LTP p puierto paralelo, al poner una tarjeta PCI, si usas la misma dirección es cuando se cuelga Windows, pantalla azul. Así que tienes que poner el que te diga los driver en Adimistrador de dispositivos de la tarjeta PCI.

Tarjeta PIC puerto paralelo:


Librerías para puerto paralelo y código fuente:
http://logix4u.net/parallel-port/26-...-win-xp-64-bit

Tengo Visual Studio Community 2015 para usarlo en 64 bits, momdificar dicha librería, antes que nada, como no se mucho el C++, esoy pescando, he estado mirando archivos por archivos en el código fuente a ver si encuentro alguna parte de cambiar la dirección que yo quiera.

El más largo es este llamado intout32drv.dll.
Código:
// inpout32drv.cpp : Defines the entry point for the DLL application.
//

#include "stdafx.h"
#include "hwinterfacedrv.h"
#include "resource.h"
#include "conio.h"
#include "stdlib.h" 

int inst(LPCTSTR pszDriver);
int start(LPCTSTR pszDriver);

//First, lets set the DRIVERNAME depending on our configuraiton.
#define DRIVERNAMEx64 "hwinterfacex64\0"
#define DRIVERNAMEi386 "hwinterface\0"

char str[10];
int vv;

HANDLE hdriver=NULL;
char path[MAX_PATH];
HINSTANCE hmodule;
SECURITY_ATTRIBUTES sa;
int sysver;

int Opendriver(BOOL bX64);
void Closedriver(void);

BOOL APIENTRY DllMain( HINSTANCE  hModule, 
					  DWORD  ul_reason_for_call, 
					  LPVOID lpReserved
					  )
{

	hmodule = hModule;
	switch(ul_reason_for_call)
	{
	case DLL_PROCESS_ATTACH:
		sysver = SystemVersion();
		if(sysver==2)
		{
			Opendriver(IsXP64Bit());
		}
		break;
	case DLL_PROCESS_DETACH:
		if(sysver==2)
		{
			Closedriver();
		}
		break;
	}
	return TRUE;
}

/***********************************************************************/

void Closedriver(void)
{
	if (hdriver)
	{
		OutputDebugString("Closing driver...\n");
		CloseHandle(hdriver);
		hdriver=NULL;
	}
}

void _stdcall Out32(short PortAddress, short data)
{

	switch(sysver)
	{
	case 1:
#ifdef _M_IX86
		_outp( PortAddress,data);	//Will ONLY compile on i386 architecture
#endif
		break;
	case 2:
		unsigned int error;
		DWORD BytesReturned;        
		BYTE Buffer[3];
		unsigned short * pBuffer;
		pBuffer = (unsigned short *)&Buffer[0];
		*pBuffer = LOWORD(PortAddress);
		Buffer[2] = LOBYTE(data);

		error = DeviceIoControl(hdriver,
			IOCTL_WRITE_PORT_UCHAR,
			&Buffer,
			3,
			NULL,
			0,
			&BytesReturned,
			NULL);
		break;
	}


}

/*********************************************************************/

short _stdcall Inp32(short PortAddress)
{
	BYTE retval(0);
	switch(sysver)
	{
	case 1:
#ifdef _M_IX86
		retval = _inp(PortAddress);
#endif
		return retval;
		break;
	case 2:
		unsigned int error;
		DWORD BytesReturned;
		unsigned char Buffer[3];
		unsigned short * pBuffer;
		pBuffer = (unsigned short *)&Buffer;
		*pBuffer = LOWORD(PortAddress);
		Buffer[2] = 0;
		error = DeviceIoControl(hdriver,
			IOCTL_READ_PORT_UCHAR,
			&Buffer,
			2,
			&Buffer,
			1,
			&BytesReturned,
			NULL);

		return((int)Buffer[0]);

		break;
	}
	return 0;
}

/*********************************************************************/

int Opendriver(BOOL bX64)
{
	OutputDebugString("Attempting to open InpOut driver...\n");

	char szFileName[MAX_PATH] = {NULL};
	if (bX64)
		strcpy_s(szFileName, MAX_PATH, "\\\\.\\hwinterfacex64");	//We are 64bit...
	else
		strcpy_s(szFileName, MAX_PATH, "\\\\.\\hwinterface");		//We are 32bit...

	hdriver = CreateFile(szFileName, 
		GENERIC_READ | GENERIC_WRITE, 
		0, 
		NULL,
		OPEN_EXISTING, 
		FILE_ATTRIBUTE_NORMAL, 
		NULL);

	if(hdriver == INVALID_HANDLE_VALUE) 
	{
		if(start(bX64 ? DRIVERNAMEx64 : DRIVERNAMEi386))
		{
			inst(bX64 ? DRIVERNAMEx64 : DRIVERNAMEi386);
			start(bX64 ? DRIVERNAMEx64 : DRIVERNAMEi386);

			hdriver = CreateFile(szFileName, 
				GENERIC_READ | GENERIC_WRITE, 
				0, 
				NULL,
				OPEN_EXISTING, 
				FILE_ATTRIBUTE_NORMAL, 
				NULL);

			if(hdriver != INVALID_HANDLE_VALUE) 
			{
				OutputDebugString("Successfully opened ");
				OutputDebugString(bX64 ? DRIVERNAMEx64 : DRIVERNAMEi386);
				OutputDebugString(" driver");
				return 0;
			}
		}
		return 1;
	}
	OutputDebugString("Successfully opened ");
	OutputDebugString(bX64 ? DRIVERNAMEx64 : DRIVERNAMEi386);
	OutputDebugString(" driver");
	return 0;
}

/***********************************************************************/
int inst(LPCTSTR pszDriver)
{
	char szDriverSys[MAX_PATH];
	strcpy_s(szDriverSys, MAX_PATH, pszDriver);
	strcat_s(szDriverSys, MAX_PATH, ".sys\0");
	
	SC_HANDLE  Mgr;
	SC_HANDLE  Ser;
	GetSystemDirectory(path , sizeof(path));
	HRSRC hResource = FindResource(hmodule, MAKEINTRESOURCE(IDR_BIN1), "bin");
	if(hResource)
	{
		HGLOBAL binGlob = LoadResource(hmodule, hResource);

		if(binGlob)
		{
			void *binData = LockResource(binGlob);

			if(binData)
			{
				HANDLE file;
				strcat_s(path, sizeof(path), "\\Drivers\\");
				strcat_s(path, sizeof(path), szDriverSys);
			
				file = CreateFile(path,
					GENERIC_WRITE,
					0,
					NULL,
					CREATE_ALWAYS,
					0,
					NULL);

				if(file)
				{
					DWORD size, written;

					size = SizeofResource(hmodule, hResource);
					WriteFile(file, binData, size, &written, NULL);
					CloseHandle(file);

				}
			}
		}
	}

	Mgr = OpenSCManager (NULL, NULL,SC_MANAGER_ALL_ACCESS);
	if (Mgr == NULL)
	{							//No permission to create service
		if (GetLastError() == ERROR_ACCESS_DENIED) 
		{
			return 5;  // error access denied
		}
	}	
	else
	{
		char szFullPath[MAX_PATH] = "System32\\Drivers\\\0";
		strcat_s(szFullPath, MAX_PATH, szDriverSys);
		Ser = CreateService (Mgr,                      
			pszDriver,                        
			pszDriver,                        
			SERVICE_ALL_ACCESS,                
			SERVICE_KERNEL_DRIVER,             
			SERVICE_SYSTEM_START,               
			SERVICE_ERROR_NORMAL,               
			szFullPath,  
			NULL,                               
			NULL,                              
			NULL,                               
			NULL,                              
			NULL                               
			);
	}
	CloseServiceHandle(Ser);
	CloseServiceHandle(Mgr);

	return 0;
}
/**************************************************************************/
int start(LPCTSTR pszDriver)
{
	SC_HANDLE  Mgr;
	SC_HANDLE  Ser;

	Mgr = OpenSCManager (NULL, NULL,SC_MANAGER_ALL_ACCESS);

	if (Mgr == NULL)
	{							//No permission to create service
		if (GetLastError() == ERROR_ACCESS_DENIED) 
		{
			Mgr = OpenSCManager (NULL, NULL,GENERIC_READ);
			Ser = OpenService(Mgr,pszDriver,GENERIC_EXECUTE);
			if (Ser)
			{    // we have permission to start the service
				if(!StartService(Ser,0,NULL))
				{
					CloseServiceHandle (Ser);
					return 4; // we could open the service but unable to start
				}

			}

		}
	}
	else
	{// Successfuly opened Service Manager with full access
		Ser = OpenService(Mgr,pszDriver,GENERIC_EXECUTE);
		if (Ser)
		{
			if(!StartService(Ser,0,NULL))
			{
				CloseServiceHandle (Ser);
				return 3; // opened the Service handle with full access permission, but unable to start
			}
			else
			{
				CloseServiceHandle (Ser);
				return 0;
			}
		}
	}
	return 1;
}
No quiere decir que sea ese precisamente.

¿Alguna ayuda?

Saludos.
Un cordial saludo.
__________________
Meta Shell, VERSIÓN 1.2.2
Descargar
  #2 (permalink)  
Antiguo 06/12/2015, 18:56
 
Fecha de Ingreso: octubre-2014
Ubicación: Madrid
Mensajes: 1.212
Antigüedad: 10 años, 1 mes
Puntos: 204
Respuesta: Modificar esta librería para adaptarlo a los nuevos tiempos

Código C:
Ver original
  1. #define IOCTL_READ_PORT_UCHAR    -1673519100 //CTL_CODE(40000, 0x801, METHOD_BUFFERED, FILE_ANY_ACCESS)
  2. #define IOCTL_WRITE_PORT_UCHAR   -1673519096 //CTL_CODE(40000, 0x802, METHOD_BUFFERED, FILE_ANY_ACCESS)

Estás buscando esto???
__________________
La ayuda se paga con esfuerzo o con dinero. Si no estás dispuesto a esforzarte y quieres que te hagan los deberes pide presupuesto, al menos así ahorrarás tiempo.
  #3 (permalink)  
Antiguo 06/12/2015, 19:26
 
Fecha de Ingreso: mayo-2007
Ubicación: PIC-16F84A
Mensajes: 729
Antigüedad: 17 años, 6 meses
Puntos: 8
Respuesta: Modificar esta librería para adaptarlo a los nuevos tiempos

Hola:

Si, parecen ser esos mismos, lo encontraste en el archivo hwinterfacedrv.h.

Al ejecutar el proyecto, como es del Visual Studiio 2005, se me abrió el 2013 a pesar de tener el 2015 Community.


Ver zoom.

La verdad se muy poco sobre C++, aún así me buscaré la vida a lo bruto, ajjajajaja.

Me esperava una dirección conocida.

No compila, hay errores como este que me cuenta.
Cita:
Error 1 error RC1015: cannot open include file 'afxres.h'. C:\Users\Usuario\Desktop\Inpout32_dll_source\inpou t32drv.rc 10 1 inpout32drv

Por cierto, que velocidad lo has encontrado. Estás hecho un campeón. ;)
__________________
Meta Shell, VERSIÓN 1.2.2
Descargar
  #4 (permalink)  
Antiguo 07/12/2015, 01:18
Avatar de Malenko
Moderador
 
Fecha de Ingreso: enero-2008
Mensajes: 5.323
Antigüedad: 16 años, 10 meses
Puntos: 606
Respuesta: Modificar esta librería para adaptarlo a los nuevos tiempos

Cita:
Iniciado por REHome Ver Mensaje
La verdad se muy poco sobre C++, aún así me buscaré la vida a lo bruto, ajjajajaja.

Me esperava una dirección conocida.
En realidad se trata de una dirección conocida. Recuerda que estás programando un driver que se usará bajo Windows, así que para acceder al hardware has de acceder a través de sus funciones (API), las llamadas ioctls, en lugar de acceder directamente al puerto.
__________________
Aviso: No se resuelven dudas por MP!
  #5 (permalink)  
Antiguo 07/12/2015, 05:13
 
Fecha de Ingreso: mayo-2007
Ubicación: PIC-16F84A
Mensajes: 729
Antigüedad: 17 años, 6 meses
Puntos: 8
Respuesta: Modificar esta librería para adaptarlo a los nuevos tiempos

Buenas:



Da error aquí. De todas formas. A estal alturas de la vida, ¿se puede resolver?
Ya que es del 2005.

Gracias por responder.
__________________
Meta Shell, VERSIÓN 1.2.2
Descargar
  #6 (permalink)  
Antiguo 09/12/2015, 02:19
 
Fecha de Ingreso: octubre-2014
Ubicación: Madrid
Mensajes: 1.212
Antigüedad: 10 años, 1 mes
Puntos: 204
Respuesta: Modificar esta librería para adaptarlo a los nuevos tiempos

Prueba a cambiar el include problemático por windows.h.
__________________
La ayuda se paga con esfuerzo o con dinero. Si no estás dispuesto a esforzarte y quieres que te hagan los deberes pide presupuesto, al menos así ahorrarás tiempo.

Etiquetas: char, funcion, int, modificar, nuevos, string
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 22:20.