InpOut32 and InpOutx64

NOTE: This project is legacy and no longer activly supported by me. I am unable to build and sign the driver in any case.
The code and downloads are left here for anyone else to take over. If you do decide to take on any further development, please let me know so I can update links etc.

InpOut32 is an open source windows DLL and Driver to give direct access to hardware ports (for example the parallel and serial port from user level programs. It is originally developed by the people at Logix4U for Windows 9x and 32bit variations of NT (NT/2000/XP/2003 etc.).

I have ported the original code (written by Logix4U) it to Windows XP 64bit Edition (XP/2003/Vista/7/8/8.1 x64 Editions) because the 32bit driver will not install or run on x64 systems. My new version supports both 32bit and 64bit systems running under WOW64 as 32bit applications, and with a new x64 DLL, pure x64 applications.

My port of InpOut32 supports both 32bit and 64bit systems running under WOW64 as 32bit applications, and with a new x64 DLL, pure x64 applications.

I am pleased to say that InpOutx64 now fully supports Windows Vista, 7 and 8.1 x64, allowing you to easily run any application designed to run with InpOut32 on Windows Vista+ and Server 2008+ x64 editions.

Many thanks to Warren at Red Fox UK for signing the drivers that allow all this to work on all current Windows operating systems.

Installation of InpOut32:

For end users:

If an application has been written to make use of InpOut32.dll then all you need to do is place my version of InpOut32.dll in the same folder as the 'original'. This would usually be the same folder as the applications EXEcutable file. Most applications use the 32bit version of the DLL. This version is still capable of installing and running on x64 based operating systems, but the first time it is run, it must be elevated on Vista and later (run as Administrator).

Included in the binary download is a small "InstallDriver.exe" program to do this for you.

For developers:

The driver (.sys file) is included, as a resource in the DLL. All you need to do is link to the appropriate DLL in your program and it should work.

NOTE: When the DLL loads for the first time, the appropriate driver is installed and used.
NOTE: Elevated permissions are required in Vista and later to install the driver. s

I recommend using runtime linking to the C interface (manually loading the library) in C++, in much the same as the interop calls from .NET work. However you can also use the .LIB and header files provided to link at compile time if that suits your application better.

Development:

There are examples and usage instructions for the 32bit version on the original author's site Logix4u (note I have removed links as they reportidly no longer active and their site appears to have been impacted by malware) and below in the download links.

To use the 64bit (x64) port (from a 64bit application), all you need to do, is use my x64 compatible DLL called InpOutx64.DLL, either using InpOutx64.lib or runtime linking (LoadLibrary, GetProcAddress etc.). Everything else is the same as the 32bit (InpOut32) DLL.

Please bear in mind, that on 64bit operating systems, many applications are still 32bit. If your application is 32bit you MUST use my version of InpOut32.dll which contains both 32bit and 64bit drivers and determines which one to install and use at runtime.
If your application is 64bit (x64) then use InpOutx64.dll. Both DLL's can install and talk to the 64bit (x64) driver on x64 editions of Windows.

NOTE: Because I used Visual Studio 2005 to build the DLL's you may need the 2005 SP1 Microsoft C++ Runtimes.
These should be available from Microsoft. You will have them if you have Visual Studio 2005. If you can’t find them, send me an email!

Update History:

The initial build (DLL v1.0.0.1) I created didn't work properly in x64 because it still installed the 32bit driver (and called it hwinterfacex64.sys) oops! It was possible to use it by replacing the driver .sys file with the real hwinterfacex64 (included) but this was not the intended method of installation!

The build v1.0.0.2 (dated 23-12-2005) should work properly on both OS types.

UPDATE: (26-02-2006) 32bit DLL for 1.0.0.2 does not work on x64 windows :(
I am currently working on a fully functional 32bit DLL that loads a 64bit driver in x64 windows. It all went wrong because it loads the driver to the wrong place (thanks WOW64).
Anyone that has already used this, and has run the old version (on x64), should uninstall/delete the hwinterfacex64.sys in their system32 folder as it is probably the 32bit version. The new DLL will then install the correct file when it is started.

v1.0.0.6 (26-02-2006):

The new version is an updated 32bit and 64bit DLL only (v1.0.0.6).
This version fixes a bug that caused the 32bit DLL to fail on x64 windows - it did not load the driver correctly because the WOW64 file redirection caused the driver to be created in the wrong folder (\SYSWOW64\Drivers not System32\Drivers).
The driver has not changed.

v1.0.0.7 (23-03-2006):

The new version is an updated 32bit and 64bit DLL only (v1.0.0.7) If fixes a bug in the DLPortIO compatibility for LCDSmartie usage.
The driver has not changed.

v1.0.0.8 (17-02-2007):

The new version is an updated 32bit and 64bit DLL and a 32bit EXE for installing the driver in Windows VISTA.
If fixes a bug in the IsInpOutDriverOpen() interface.
The driver has not changed.

v1.1.0.0 (internal):

The new version used test signing of the drivers which worked only locally using my own internal certificates. There was no functional changes.
The driver has been renamed from HWInterface.sys to InpOut.sys and HWinterfacex64.sys to InpOutx64.sys.

v1.2.0.0 (18-10-2008):

This version is the first to include signed drivers for use with Vista and Server 2008 x64 with no requirement to press F8 at boot or enable development (test signing mode). Everyone can now use InpOut on the latest MS x64 operating systems.

v1.3.0.0 (15-Aug-2010):

Removed bool's from header (replaced with BOOL). This is to maintain compatibility with other DLL’s (DLPortIO etc.).

v1.4.0.0 (13-Jan-2011):

Removed references to WinRing0 which was discontinued.
Fixed uninitialized buffers & return from Inp32 > byte value!

v1.5.0.0 (20-Jan-2011):

Added _stdcall to DlPortReadPortUshort, DlPortWritePortUshort, DlPortReadPortUlong, DlPortWritePortUlong to maintain compatibility with old DLPortIO driver.

v1.5.0.1 (13-Dec-2015):

Updated the license terms to use the standard MIT License. See License.txt in the download(s).

Known issues in v1.5.0.1:

  • DlPortWritePortUlong -(and probably DlPortReadPortUlong) does not work properly/as expected.
  • MapPhysToLin/GetPhysLong - Only works with physical addresses under 2GB (x86/x64).
  • Unfortunatly fixing these issues requires driver signing certificates, access to thew correct SDK and time. As I am no longer able to support this software, you are welcome to download the sources and attempt to fix it but please don't ask me to do it!.

Notes:
From Version 1.0.0.7, I have added simple compatibility with DLPortIO that should allow LCDSmartie and others to use this DLL as a drop in replacement for DLPortIO in x64 windows. To do this, download just the binaries only package (below) then take the 32bit DLL (in the \Win32 folder), rename it to DLPortIO.DLL and copy it to your LCDSmartie folder. Read the DLPortIO.TXT file included in the ZIP for more information.

I have had confirmation that v1.0.0.7 works with LCDSmartie in Windows 2003 x64 using the above method.

You may get a "side by side" error when running Installdriver.exe on Vista (especially 64bit Vista and later).
If you do, you can try downloading the 2005 Microsoft C++ runtimes (SP1). For the 32bit version, go here. For the 64bit version, go here.

How to use my port of InpOut32:

The original distribution of InpOut32 comes with various samples. Most of these samples still apply...

The VB6 sample provided with the original Logix4U distribution should work in exactly the same way. VB6 is 32bit ONLY and you should always use my InpOut32.dll.

The C++ example should also work, but I have also got a modified version here that you may want to look at. You also have to ensure you link to the correct DLL, InpOut32.dll for a 32bit EXE and InpOutx64.dll for a native x64 EXE.

Note:
My version of InpOut32.dll (and InpOutx64.dll) exports more functions that the original. The original only exports Inp32() and Out32().
This x64 bit compatible version exports the following functions (look in InpOut32.h for the complete definitions and types):

Inp32()

Out32()

IsInpOutDriverOpen()

DlPortReadPortUchar()

DlPortWritePortUchar()

Alternatives to InpOut32:

There was, for a time, an input output project called WinRing0. It had its own signed 64bit drivers and was open source.
Others include DLPortIO (32bit only) and WinIO. Unfortunatly it seems all of these projects/websites appear to be no longer available/offline. I suspect that Microsoft's requirements for driver signing have killed off the hobyist/open source driver development - much for the same reasons I am unable to continue making InpOut32/x64.
Perhaps the best alternative is to use an operating system and/or device that does not create such restrictions. There are plenty out there!

Contact:

Feel free to contact me if you have any questions/queries but please bear in mind that this is unsupported legacy software.
Feel free to sign up and discuss any problems in my own Forums.

 

The Author makes no guarantee that this software is free from bugs and will not harm your system.
However, the author actively runs this software and all downloads have been checked for known viruses.
This product is released as open source (Freeware).