Page 1 of 1

PureParallelIO (Windows only)

Posted: Thu Nov 29, 2007 7:07 pm
by ABBKlaus
topic says all :wink:

small remark :
the file "hwinterface.sys" is needed from here : http://logix4u.net/inpout32_source_and_bins.zip

Code: Select all

; ABBKlaus 29 November 2007 
; 
; Ported from Inpout32.dll 
; http://www.logix4u.net 
; send queries and doubts to  logix4u mail ID found at homepage 
; visit       http://www.logix4u.net 
; no explicit licence is neede to use this dll for non - commercial applications. for commercial applications , contact the webmaster 

Declare.l    inp(PortAddress.w)
Declare.l    IPF_DeInst()
Declare.l    IPF_Inst()
Declare.l    IPF_Opendriver()
Declare.l    IPF_Start()
Declare      outp(PortAddress.w, Value.b)
DeclareDLL.l PureParallelIO_End()
DeclareDLL.l PureParallelIO_In(PortAdress.l)
DeclareDLL.l PureParallelIO_Init()
DeclareDLL.l PureParallelIO_Out(PortAdress.l,DataByte.l)

Macro CTL_CODE(DeviceType, Function, Method, Access)
  ((DeviceType) << 16) | ((Access) << 14) | ((Function) << 2) | (Method)
EndMacro

CompilerIf Defined(FILE_ANY_ACCESS, #PB_Constant) = 0
  #FILE_ANY_ACCESS = 0
CompilerEndIf

CompilerIf Defined(METHOD_BUFFERED, #PB_Constant) = 0
  #METHOD_BUFFERED = 0
CompilerEndIf

#IOCTL_READ_PORT_UCHAR  = CTL_CODE(40000, $801, #METHOD_BUFFERED, #FILE_ANY_ACCESS)
#IOCTL_WRITE_PORT_UCHAR = CTL_CODE(40000, $802, #METHOD_BUFFERED, #FILE_ANY_ACCESS)

DataSection
  hwinterface: ; hwinterface.sys
  Data.l $0BD2434A, $E3650000, $6B59E313, $322820D3, $47FE0230, $C1164100, $0451490D, $008C0128
  Data.l $BA285CE4, $09E63A3F, $101A4769, $552DC877, $9C82600A, $B7D9169B, $6DA6E172, $6DC4CA58
  Data.l $0C586C65, $0FDD8DDD, $B480ACA5, $9F534D15, $B7D96512, $E8692B6D, $91912CB2, $3B7B2854
  Data.l $EFE92FCE, $133AD827, $A043E2D8, $700A4576, $F5F9E4E6, $7789EE12, $1D94FAA5, $A6C7557E
  Data.l $268C6A95, $5150680A, $60A454A8, $68ECA640, $13C06576, $0616FD85, $CA03D3C4, $08230A10
  Data.l $203170D6, $80440A11, $2464D040, $025010E0, $01A80032, $282C5478, $9A2210A6, $44001A50
  Data.l $7303A116, $01CB88B2, $0106B318, $C40D3C4B, $E141010B, $EF4042D5, $84589400, $6A84476A
  Data.l $03F4057C, $65BC9431, $DF01BAE9, $2255144B, $01E66B0C, $12EB8226, $C374E0AD, $11959592
  Data.l $11302686, $7A5422AC, $389D0A8A, $45018A4D, $2AC15112, $3DE26D4C, $4EC61328, $31BD42E6
  Data.l $044C45BB, $082810AB, $CB78A0F5, $94042CB6, $044C52CE, $706AEA03, $924851A3, $A58362E9
  Data.l $088044CB, $8FFEB0C7, $82348460, $E0702BB0, $79958933, $4236A104, $6236C234, $30215237
  Data.l $411B9236, $DB88038B, $E6E4B818, $46C2DD00, $488546CC, $8DCD0C64, $3EC615BC, $5C5F8B96
  Data.l $4ED90FD5, $DAA1B306, $D40856AB, $38DB5BED, $E7A56D2B, $3145EF13, $7DE23D0C, $40CA3073
  Data.l $13170450, $41005401, $F43B35D6, $00C0C68B, $87B0FFEB, $77D82400, $7F260A71, $95624012
  Data.l $6A917F63, $5DAC40DB, $53BE0105, $5216CDA2, $15DC35F2, $17E3C13F, $1A013091, $CB86D1E7
  Data.l $89344901, $F3576A06, $96E1A836, $6C5DEBDC, $103FAA75, $98A3D249, $5FA1DBAB, $1082580A
  Data.l $52808529, $5A4080F8, $749A6A7A, $00F45B39, $66501884, $A9492F07, $73F368DD, $1DCA703D
  Data.l $A3C09F98, $FDBC2F8A, $7489AA10, $D1C51C65, $D72371E8, $F1BB1B13, $242009E2, $94425404
  Data.l $2B0C55BB, $409677D3, $26BD6253, $051920D6, $38091C1A, $31E58C5F, $0CE5230A, $65147CEF
  Data.l $A7096D46, $72103ED5, $8B7A2863, $60699009, $D01C97D3, $70E8F850, $12C5150D, $1AB814F0
  Data.l $0DE29B84, $86161903, $9A2C4DEA, $8AA6005C, $A869A951, $A4967920, $E2500047, $1A78E92F
  Data.l $09F4E833, $E682F027, $A40D4202, $2A10CC38, $7204EE47, $15B2B61C, $283D4569, $0E3910B7
  Data.l $21ACB10E, $E30A2683, $0CE31D5B, $6E6A756A, $0D2642B3, $A1949958, $2D96DF66, $3A91B6DC
  Data.l $D4A55BA1, $32423B8D, $3B91CDCF, $26540B34, $DB11CB08, $A6C7EF36, $6EB5CB65, $6D164C29
  Data.l $BB028304, $B592A213, $3D6CA292, $8E960752, $858DA4DB, $A99AAA80, $459D5200, $4120B905
  Data.l $5492092A, $66542ACC, $D0ED7612, $C8BD70AD, $65BCCCC5, $588DB25D, $41A204CD, $14F34A8B
  Data.l $D55A57EA, $E1851542, $B96A1D20, $2B09842A, $052949EA, $25B0A844, $017592EB, $8A899116
  Data.l $2C61202A, $A5301879, $4C118D09, $14F845E8, $A28A0A40, $80A1142C, $AC8A8F0B, $200C3449
  Data.l $E8029ACC, $1A79D15A, $20999A49, $30181A70, $F609019A, $2A758036, $2552EFFF, $8430328F
  Data.l $22850D93, $626B422C, $1D97964C, $020C1A34, $BA383AE5, $1959A140, $082D0438, $1490C4E4
  Data.l $38708E04, $382439B3, $9A000025, $08E8DAE8, $80238CE4, $1A184D90, $48DC0806, $030248DB
  Data.l $D1901C3E, $8B9DF2D1, $6CE239B2, $0C9B301A, $D2147378, $2CC0A820, $21921AA0, $61F1D447
  Data.l $9B78C63C, $33937401, $E0B98480, $88020ED2, $C3D9BC80, $C1374F88, $0E9A23AA, $C0027364
  Data.l $6446858C, $50214062, $D80E62D6, $95980104, $4966660A, $95B1D109, $68052632, $022EAE9E
  Data.l $C0515148, $5A802034, $0716B387, $387C4970, $4C29CA4B, $5915AB66, $1028E05C, $69599D8B
  Data.l $29EC9750, $694E41C5, $0FB46115, $5E236E45, $A00EE3AD, $C1BA1F4A, $D14936F1, $017283CD
  Data.l $743D4D99, $5B3E40A4, $C0815760, $0980A2A7, $A3E33151, $8A411A84, $00AA3303, $F64A2A29
  Data.l $DC965116, $0049B0F8, $C9546E5E, $951223DE, $26560795, $1304E610, $1CA920DA, $6132D83D
  Data.l $E5C4284B, $EC648ECC, $F004E744, $F1C4EEA4, $FFE4F0E4, $4AF9FB44, $3BC9E273, $372C3B79
  Data.l $19323C29, $B34BB595, $999CDD73, $5AD1AB96, $7AE9E26C, $59AC7730, $D2EB65B9, $99163632
  Data.l $59D19DE4, $A71C01F7, $CC40F28C, $010E7670, $CD2510C7, $0C3F11D2, $213F8562, $94055082
  Data.l $0A634A1E, $8CE72A75, $1CEA3056, $5130A3AA, $B657B96B, $A2C5B714, $6EC0DF0E, $E6760E5A
  Data.l $45E17862, $CB85EA59, $440046F5, $000092C4, $00000000
EndDataSection

Procedure outp(PortAddress.w, Value.b)
  !PUSH DX
  !PUSH AX
  !MOV DX, [p.v_PortAddress]
  !MOV AL, [p.v_Value]
  !OUT DX,AL
  !POP AX
  !POP DX
EndProcedure

Procedure.l inp(PortAddress.w)
  Protected Value.b=0
  !PUSH DX
  !PUSH AX
  !MOV DX, [p.v_PortAddress]
  !IN AX,DX
  !MOV [p.v_Value], AX
  !POP AX
  !POP DX
  ProcedureReturn Value
EndProcedure

ProcedureDLL.l PureParallelIO_Init()
  Debug "PureParallelIO_Init()"
  
  Global hdriver.l
  Global sysver.l
  
  Select OSVersion()
    Case #PB_OS_Windows_95,#PB_OS_Windows_98,#PB_OS_Windows_ME
      Debug "Detected OS Win9X / WinME"
      sysver=1
      ; do nothing
    Case #PB_OS_Windows_NT3_51,#PB_OS_Windows_NT_4,#PB_OS_Windows_2000 To #PB_OS_Windows_Future
      Debug "Detected OS Win-NT"
      sysver=2
      If IPF_Opendriver()
        Debug "Driver successfully opened"
      Else
        Debug "Driver failed to open"
      EndIf
  EndSelect
EndProcedure

ProcedureDLL.l PureParallelIO_End()
  Debug "PureParallelIO_End()"
  
  If hdriver
    If CloseHandle_(hdriver)
      Debug "Driver succesfully closed"
    Else
      Debug "Driver failed to close"
    EndIf
    hdriver=0
  EndIf
EndProcedure

Procedure.l IPF_Opendriver()
  Debug "IPF_Opendriver()"
  
  hdriver=CreateFile_("\\.\\hwinterface", #GENERIC_READ | #GENERIC_WRITE, 0, #Null, #OPEN_EXISTING, #FILE_ATTRIBUTE_NORMAL, #Null)
  If hdriver=#INVALID_HANDLE_VALUE
    Debug "INVALID_HANDLE_VALUE"
    If IPF_Start()
      IPF_Inst()
      IPF_Start()
      hdriver=CreateFile_("\\.\\hwinterface", #GENERIC_READ | #GENERIC_WRITE, 0, #Null, #OPEN_EXISTING, #FILE_ATTRIBUTE_NORMAL, #Null)
      If hdriver<>#INVALID_HANDLE_VALUE
        ProcedureReturn 1
      EndIf
    EndIf
  Else
    ProcedureReturn 1
  EndIf
EndProcedure

ProcedureDLL.l PureParallelIO_Out(PortAdress.l,DataByte.l)
  Debug "PureParallelIO_Out()"
  
  Protected BytesReturned.l, *Buffer, error.l
  
  Select sysver
    Case 1
      outp(PortAdress,DataByte) 
      error=1 
    Case 2 
      *Buffer=AllocateMemory(4) 
      If *Buffer 
        PokeW(*Buffer+0,PortAdress & $FFFF) 
        PokeB(*Buffer+2,DataByte & $FF) 
        error = DeviceIoControl_(hdriver,#IOCTL_WRITE_PORT_UCHAR,*Buffer,3,#Null,0,@BytesReturned,#Null) 
        FreeMemory(*Buffer) 
        *Buffer=0 
      EndIf 
  EndSelect 
  
  ProcedureReturn error 
EndProcedure 

ProcedureDLL.l PureParallelIO_In(PortAdress.l) 
  Debug  "PureParallelIO_In()" 
  
  Protected BytesReturned.l, *Buffer, error.l, retval.l 
  
  Select sysver 
    Case 1 
      retval = inp(PortAddress) 
    Case 2 
      *Buffer=AllocateMemory(4) 
      If *Buffer 
        PokeW(*Buffer+0,PortAdress & $FFFF) 
        PokeB(*Buffer+2,0) 
        error = DeviceIoControl_(hdriver,#IOCTL_READ_PORT_UCHAR,*Buffer,2,*Buffer,1,@BytesReturned,#Null) 
        retval = PeekB(*Buffer+0) 
        FreeMemory(*Buffer) 
        *Buffer=0 
      EndIf 
  EndSelect 
  
  ProcedureReturn retval 
EndProcedure 

Procedure.l IPF_Inst() 
  Debug "IPF_Inst()" 
  
  Protected path$, file.l, Mgr.l, Ser.l, *Buffer
  
  path$=Space(#MAX_PATH)
  GetSystemDirectory_(@path$,#MAX_PATH)
  
  *Buffer = AllocateMemory(3026)
  If *Buffer
    If UnpackMemory(?hwinterface,*Buffer)
      file=CreateFile(#PB_Any,path$+"\Drivers\hwinterface.sys")
      If file
        WriteData(file,*Buffer,3026)
        CloseFile(file)
      EndIf 
    EndIf
    FreeMemory(*Buffer)
  EndIf
  
  Mgr=OpenSCManager_(#Null,#Null,#SC_MANAGER_ALL_ACCESS)
  If Mgr=0
    If GetLastError_()=#ERROR_ACCESS_DENIED
      Debug "ERROR_ACCESS_DENIED"
      ProcedureReturn 5
    EndIf
  Else
    Ser=CreateService_(Mgr,"hwinterface","hwinterface",#SERVICE_ALL_ACCESS,#SERVICE_KERNEL_DRIVER,#SERVICE_SYSTEM_START,#SERVICE_ERROR_NORMAL,"System32\\Drivers\\hwinterface.sys",#Null,#Null,#Null,#Null,#Null)
  EndIf
  
  If Mgr
    CloseServiceHandle_(Mgr)
  EndIf
  If Ser
    CloseServiceHandle_(Ser)
  EndIf
EndProcedure

Procedure.l IPF_DeInst()
  Debug "IPF_DeInst()"
  
  Protected Mgr.l, Res.l
  
  Mgr=OpenSCManager_(#Null,#Null,#SC_MANAGER_ALL_ACCESS)
  If Mgr=0
    If GetLastError_()=#ERROR_ACCESS_DENIED
      Debug "ERROR_ACCESS_DENIED"
      ProcedureReturn 5
    EndIf 
  Else 
    Ser=OpenService_(Mgr,"hwinterface",#SC_MANAGER_ALL_ACCESS)
    If Ser
      DeleteService_(Ser)
    EndIf
  EndIf
  
  If Mgr
    CloseServiceHandle_(Mgr)
  EndIf
  If Ser
    CloseServiceHandle_(Ser)
  EndIf
EndProcedure

Procedure.l IPF_Start()
  Debug "IPF_Start()"
  
  Protected Mgr.l, Ser.l, retval.l=1
  
  Mgr = OpenSCManager_(#Null, #Null, #SC_MANAGER_ALL_ACCESS)
  If Mgr=0
    If GetLastError_()=#ERROR_ACCESS_DENIED
      Mgr=OpenSCManager_(#Null, #Null, #GENERIC_READ)
      Ser=OpenService_(Mgr, "hwinterface", #GENERIC_EXECUTE)
      If Ser
        If StartService_(Ser,0,#Null)
          Debug "Service started successfully"
        Else
          Debug "Service not started"
          Retval=4
        EndIf
      EndIf
    EndIf
  Else
    Ser=OpenService_(Mgr,"hwinterface",#GENERIC_EXECUTE)
    If Ser
      If StartService_(Ser, 0, #Null)
        Debug "Service started successfully"
        Retval=0
      Else
        Debug "Service not started"
        Retval=3
      EndIf
    EndIf
  EndIf
  
  If Mgr
    CloseServiceHandle_(Mgr)
  EndIf
  If Ser
    CloseServiceHandle_(Ser)
  EndIf
  
  ProcedureReturn retval
EndProcedure
Example code:

Code: Select all

PureParallelIO_Init()

For i=0 To 7
  PureParallelIO_Out($378,Pow(2,i))
  Debug PureParallelIO_In($378)&$FF
Next
PureParallelIO_Out($378,0)

PureParallelIO_End()

IPF_DeInst()

Posted: Fri Nov 30, 2007 10:33 am
by Psychophanta
Mmh! Thanks!
I enjoy to play directly with hardware! :)

Posted: Fri Nov 30, 2007 5:22 pm
by BasicGuy
Couldn't have come at a better time! Currently working on a PB coded application to control model railroad
switches and other devices via the parallel port. Many thanks! 8)