Нет ничего особо сложного в том чтобы общаться с драйвером
Сами драйверы можно скачать 
Тут 
А удобный класс для работы с ними вот.
using System;
using System.Runtime.InteropServices;
namespace PortAccess {
	public class ParallelPort {
		[DllImport("inpout32.dll")]
		private static extern UInt32 IsInpOutDriverOpen();
		[DllImport("inpout32.dll")]
		private static extern void Out32(short portAddress, short data);
		[DllImport("inpout32.dll")]
		private static extern char Inp32(short portAddress);
		[DllImport("inpout32.dll")]
		private static extern void DlPortWritePortUshort(short portAddress, ushort data);
		[DllImport("inpout32.dll")]
		private static extern ushort DlPortReadPortUshort(short portAddress);
		[DllImport("inpout32.dll")]
		private static extern void DlPortWritePortUlong(int portAddress, uint data);
		[DllImport("inpout32.dll")]
		private static extern uint DlPortReadPortUlong(int portAddress);
		[DllImport("inpoutx64.dll")]
		private static extern bool GetPhysLong(ref int portAddress, ref uint data);
		[DllImport("inpoutx64.dll")]
		private static extern bool SetPhysLong(ref int portAddress, ref uint data);
		[DllImport("inpoutx64.dll", EntryPoint = "IsInpOutDriverOpen")]
		private static extern UInt32 IsInpOutDriverOpenmode();
		[DllImport("inpoutx64.dll", EntryPoint = "Out32")]
		private static extern void Out32mode(short portAddress, short data);
		[DllImport("inpoutx64.dll", EntryPoint = "Inp32")]
		private static extern char Inp32mode(short portAddress);
		[DllImport("inpoutx64.dll", EntryPoint = "DlPortWritePortUshort")]
		private static extern void DlPortWritePortUshortmode(short portAddress, ushort data);
		[DllImport("inpoutx64.dll", EntryPoint = "DlPortReadPortUshort")]
		private static extern ushort DlPortReadPortUshortmode(short portAddress);
		[DllImport("inpoutx64.dll", EntryPoint = "DlPortWritePortUlong")]
		private static extern void DlPortWritePortUlongmode(int portAddress, uint data);
		[DllImport("inpoutx64.dll", EntryPoint = "DlPortReadPortUlong")]
		private static extern uint DlPortReadPortUlongmode(int portAddress);
		[DllImport("inpoutx64.dll", EntryPoint = "GetPhysLong")]
		private static extern bool GetPhysLongmode(ref int portAddress, ref uint data);
		[DllImport("inpoutx64.dll", EntryPoint = "SetPhysLong")]
		private static extern bool SetPhysLongmode(ref int portAddress, ref uint data);
		private bool mode;
		private short portAddress;
		public ParallelPort(short portAddress) {
			mode = false;
			this.portAddress = portAddress;
			try {
				uint nResult = 0;
				try {
					nResult = IsInpOutDriverOpen();
				}
				catch (BadImageFormatException) {
					nResult = IsInpOutDriverOpenmode();
					if (nResult != 0) {
						mode = true;
					}
				}
				if (nResult == 0 ) {
					throw new ArgumentException("Unable to open InpOut32 driver");
				}
			}
			catch (DllNotFoundException) {
				throw new ArgumentException("Unable to find InpOut32.dll");
			}
		}
		public void Write(short data) {
			if (mode) {
				Out32mode(portAddress, data);
			}
			else {
				Out32(portAddress, data);
			}
		}
		public byte Read() {
			if (mode) {
				return (byte)Inp32mode(portAddress);
			}
			else {
				return (byte)Inp32(portAddress);
			}
		}
	}
}