Modificar estalibrería para adaptarlo a los nuevos tiempos

Iniciado por Meta, 7 Diciembre 2015, 01:07 AM

0 Miembros y 1 Visitante están viendo este tema.

Meta

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-inpoutx64dll-for-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 (cpp) [Seleccionar]
// 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.
Tutoriales Electrónica y PIC: http://electronica-pic.blogspot.com/