Page 1 of 1

Module PortIO (Windows x86 and x64)

Posted: Sun Jul 21, 2013 10:01 am
by User_Russian
This module is designed for direct access to the ports on the computer.
To gain access to the ports, use the driver pbdriverio.

Code: Select all

DeclareModule PortIO

  Interface PortIO
    GetByte(Port.u) 
    SetByte(Port.u, Bute.a)
    Status()
    DriverID()
    Free()
  EndInterface 
  
  Enumeration
    #Status_OK
    #Status_ErrCopyDriver
    #Status_ErrInstallDriver
    #Status_ErrAccess
  EndEnumeration
  
  Declare New() 

EndDeclareModule 

Module PortIO

#IOCTL_READ_PORT_UCHAR	 = $200 
#IOCTL_WRITE_PORT_UCHAR	 = $400

EnableExplicit 

Structure PortParam
  *vt ;pointer to virtual table as first entry 
  hDriver.i
  ErrorCode.l
EndStructure 

Define DriverPath.s = GetTemporaryDirectory()+"pbdriverio"
Define DriverName.s = "pbdriverio"
Define *DriverMem=0, DriverLen=0


CompilerIf #PB_Compiler_Processor = #PB_Processor_x86
  
  Prototype pIsWow64Process(hProcess.i, *Wow64Process)
  
  Procedure OSbits()
    Protected Is64BitOS = 0 ; Returns 1 for 64bit, else 0.
    Protected hDLL, IsWow64Process
    
    Is64BitOS=0
    hDll = LoadLibrary_("kernel32.dll")
    If hDll
      
      IsWow64Process.pIsWow64Process = GetProcAddress_(hDll,"IsWow64Process")
      If IsWow64Process
        IsWow64Process(GetCurrentProcess_(), @Is64BitOS)
      EndIf
      
      FreeLibrary_(hDll)
    EndIf     
    
    ProcedureReturn Is64BitOS
  EndProcedure
  
  If OSbits() ; x64.
    DriverPath+"_x64"
    DriverName+"_x64"
    *DriverMem = ?Driver_x64
    DriverLen  = ?Driver_x64_End - ?Driver_x64
  Else
    *DriverMem = ?Driver_x86
    DriverLen  = ?Driver_x86_End - ?Driver_x86
  EndIf
  
  DriverPath+".sys"
  
CompilerElse
  DriverPath+"_x64.sys"
  DriverName+"_x64"
  *DriverMem = ?Driver_x64
  DriverLen  = ?Driver_x64_End - ?Driver_x64
CompilerEndIf


Procedure Driver_Start(Drivers_Name.s)
  Protected hSCManager.i, hServ.i
  Protected ErrorCode, Result
  
  Result=#False
  hSCManager  = OpenSCManager_(#Null, #Null, #SC_MANAGER_ALL_ACCESS)
  If hSCManager = 0
    If GetLastError_() = #ERROR_ACCESS_DENIED
      hSCManager  = OpenSCManager_(#Null, #Null, #GENERIC_READ)
      hServ       = OpenService_(hSCManager, Drivers_Name, #GENERIC_EXECUTE)
      If StartService_(hServ, 0, #Null)
        Result=#True
      EndIf
    EndIf
    
  Else
    hServ       = OpenService_(hSCManager, Drivers_Name, #GENERIC_EXECUTE)
    If StartService_(hServ, 0, #Null)
      Result=#True  
    Else
      ErrorCode=GetLastError_()
      If ErrorCode=1056
        Result=#True
      EndIf
    EndIf
  EndIf
  
  If hServ : CloseServiceHandle_(hServ) : EndIf
  If hSCManager : CloseServiceHandle_(hSCManager) : EndIf
  
  ProcedureReturn Result
EndProcedure

Procedure Driver_UnInstall(Drivers_Name.s)
  Protected hSCManager.i, hServ.i
  Protected ServiceStatus.SERVICE_STATUS
  
  hSCManager  = OpenSCManager_(#Null, #Null, #SC_MANAGER_ALL_ACCESS)
  hServ       = OpenService_(hSCManager, Drivers_Name, #SERVICE_ALL_ACCESS)
  
  If hServ<>#Null
    ControlService_(hServ, #SERVICE_CONTROL_STOP, @ServiceStatus)
    DeleteService_(hServ)
  EndIf
  
  If hServ : CloseServiceHandle_(hServ) : EndIf
  If hSCManager : CloseServiceHandle_(hSCManager) : EndIf
EndProcedure

Procedure Driver_Install(Driver_Name.s, *this.PortParam)
  Shared DriverPath, *DriverMem, DriverLen
  Protected Result, FileID, File.s, Mgr
  Protected ErrorCode, Ser, Count
  Result=#False
  Count=0 : FileID=0 : Mgr=0 : Ser=0
    
  
  If FileSize(DriverPath) <> DriverLen
    
    FileID=CreateFile(#PB_Any, DriverPath)
    If FileID
      WriteData(FileID, *DriverMem, DriverLen)
      CloseFile(FileID)
    ElseIf *this\ErrorCode = #Status_OK
      *this\ErrorCode = #Status_ErrCopyDriver
    EndIf
    
  Else
    FileID=2
  EndIf
  
  If FileID
    
    M1:
    Mgr = OpenSCManager_(#Null, #Null, #SC_MANAGER_ALL_ACCESS)
    If Mgr
      Ser = CreateService_(Mgr, Driver_Name, Driver_Name, #SERVICE_ALL_ACCESS, 
                           #SERVICE_KERNEL_DRIVER, #SERVICE_DEMAND_START, #SERVICE_ERROR_NORMAL,
                           DriverPath, #Null, 0, 0, 0, 0)
      ErrorCode=GetLastError_()
      If Ser 
        Result=#True 
      ElseIf ErrorCode=1073
        Result=#True 
      ElseIf ErrorCode=1072
        If Count=0
          
          If Ser : CloseServiceHandle_(Ser) : EndIf
          If Mgr : CloseServiceHandle_(Mgr) : EndIf
          Driver_UnInstall(Driver_Name)
          Count+1
          Goto M1
        EndIf
      EndIf
    EndIf
    
  EndIf
  
  If Ser : CloseServiceHandle_(Ser) : EndIf
  If Mgr : CloseServiceHandle_(Mgr) : EndIf
  
  If Result=#False And *this\ErrorCode = #Status_OK
    *this\ErrorCode = #Status_ErrInstallDriver
  EndIf
  
  ProcedureReturn Result
EndProcedure

Procedure OpenDriver(*this.PortParam, DriverName.s)
  Protected Result, hDriver
  Result=0
  
  hDriver = CreateFile_("\\.\"+DriverName, #GENERIC_READ | #GENERIC_WRITE, 0, 0, 
                        #OPEN_EXISTING, #FILE_ATTRIBUTE_NORMAL, 0)
  If hDriver=#INVALID_HANDLE_VALUE
    If Driver_Install(DriverName, *this)
      If Driver_Start(DriverName)
        hDriver = CreateFile_("\\.\"+DriverName, #GENERIC_READ | #GENERIC_WRITE, 0, 0, 
                              #OPEN_EXISTING, #FILE_ATTRIBUTE_NORMAL, 0)
        If hDriver <> #INVALID_HANDLE_VALUE
          Result=hDriver
        EndIf
      EndIf
    EndIf
  Else
    Result=hDriver
  EndIf
  
  If Result=0 And *this\ErrorCode = #Status_OK
    *this\ErrorCode = #Status_ErrAccess
  EndIf
  
  ProcedureReturn Result
EndProcedure

Procedure.a GetByte(*this.PortParam, Port.u)
  Protected Byte.a, BytesReturned
  
  If *this\hDriver
    DeviceIoControl_(*this\hDriver, #IOCTL_READ_PORT_UCHAR, @Port, 2, @Byte, 1, @BytesReturned, 0)
  EndIf
  
  ProcedureReturn Byte
EndProcedure 

Procedure SetByte(*this.PortParam, Port.u, Byte.a) 
  Protected Buffer.l, BytesReturned
  
  If *this\hDriver
    Buffer = Port
    PokeA(@Buffer+2, Byte)
    DeviceIoControl_(*this\hDriver, #IOCTL_WRITE_PORT_UCHAR, @Buffer, 4, 0, 0, @BytesReturned, 0)
  EndIf
  
EndProcedure 

Procedure Status(*this.PortParam)
  ProcedureReturn *this\ErrorCode
EndProcedure

Procedure DriverID(*this.PortParam)
  ProcedureReturn *this\hDriver
EndProcedure

;destructor 
Procedure Free(*this.PortParam)
  If *this\hDriver
    CloseHandle_(*this\hDriver)
    *this\hDriver = 0
  EndIf
  ClearStructure(*this, PortParam)
  FreeMemory(*this) 
EndProcedure 


;contructor 
Procedure New()
  Shared DriverName
  
  Protected *this.PortParam
  
  *this = AllocateMemory(SizeOf(PortParam)) 
  If *this
    InitializeStructure(*this, PortParam)
    *this\vt = ?Funct
    
    *this\ErrorCode = #Status_OK
    
    *this\hDriver=OpenDriver(*this, DriverName)
    
    
    ProcedureReturn *this 
  EndIf 
EndProcedure 
  
  ;- DataSection
  ;{ 
  DataSection
    Funct: ;create virtual table 
    Data.i @GetByte() 
    Data.i @SetByte()
    Data.i @Status()
    Data.i @DriverID()
    Data.i @Free()
    
    CompilerIf #PB_Compiler_Processor = #PB_Processor_x86
    Driver_x86:
    Data.b $4D,$5A,$00,$00,$01,$00,$00,$00,$02,$00,$00,$00,$FF,$FF,$00,$00,$40,$00,$00,$00
    Data.b $00,$00,$00,$00,$40,$00,$00,$00,$00,$00,$00,$00,$B4,$4C,$CD,$21,$00,$00,$00,$00
    Data.b $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00
    Data.b $40,$00,$00,$00,$50,$45,$00,$00,$4C,$01,$06,$00,$5F,$A1,$B0,$50,$00,$00,$00,$00
    Data.b $00,$00,$00,$00,$E0,$00,$0E,$01,$0B,$01,$02,$32,$00,$04,$00,$00,$40,$04,$00,$00
    Data.b $00,$00,$00,$00,$40,$02,$00,$00,$40,$02,$00,$00,$40,$05,$00,$00,$00,$00,$01,$00
    Data.b $20,$00,$00,$00,$20,$00,$00,$00,$04,$00,$00,$00,$00,$00,$00,$00,$04,$00,$00,$00
    Data.b $00,$00,$00,$00,$80,$0A,$00,$00,$40,$02,$00,$00,$F7,$C5,$00,$00,$01,$00,$00,$00
    Data.b $00,$00,$10,$00,$00,$10,$00,$00,$00,$00,$10,$00,$00,$10,$00,$00,$00,$00,$00,$00
    Data.b $10,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$40,$09,$00,$00,$28,$00,$00,$00
    Data.b $C0,$05,$00,$00,$68,$03,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00
    Data.b $00,$00,$00,$00,$40,$0A,$00,$00,$28,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00
    Data.b $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00
    Data.b $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00
    Data.b $84,$09,$00,$00,$1C,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00
    Data.b $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$2E,$63,$6F,$64,$65,$00,$00,$00
    Data.b $B9,$02,$00,$00,$40,$02,$00,$00,$C0,$02,$00,$00,$40,$02,$00,$00,$00,$00,$00,$00
    Data.b $00,$00,$00,$00,$00,$00,$00,$00,$20,$00,$00,$68,$2E,$74,$65,$78,$74,$00,$00,$00
    Data.b $3D,$00,$00,$00,$00,$05,$00,$00,$40,$00,$00,$00,$00,$05,$00,$00,$00,$00,$00,$00
    Data.b $00,$00,$00,$00,$00,$00,$00,$00,$20,$00,$00,$68,$2E,$64,$61,$74,$61,$00,$00,$00
    Data.b $80,$00,$00,$00,$40,$05,$00,$00,$80,$00,$00,$00,$40,$05,$00,$00,$00,$00,$00,$00
    Data.b $00,$00,$00,$00,$00,$00,$00,$00,$40,$00,$00,$C8,$2E,$72,$73,$72,$63,$00,$00,$00
    Data.b $68,$03,$00,$00,$C0,$05,$00,$00,$80,$03,$00,$00,$C0,$05,$00,$00,$00,$00,$00,$00
    Data.b $00,$00,$00,$00,$00,$00,$00,$00,$40,$00,$00,$48,$49,$4E,$49,$54,$00,$00,$00,$00
    Data.b $EE,$00,$00,$00,$40,$09,$00,$00,$00,$01,$00,$00,$40,$09,$00,$00,$00,$00,$00,$00
    Data.b $00,$00,$00,$00,$00,$00,$00,$00,$20,$00,$00,$E2,$2E,$72,$65,$6C,$6F,$63,$00,$00
    Data.b $28,$00,$00,$00,$40,$0A,$00,$00,$40,$00,$00,$00,$40,$0A,$00,$00,$00,$00,$00,$00
    Data.b $00,$00,$00,$00,$00,$00,$00,$00,$40,$00,$00,$42,$00,$00,$00,$00,$00,$00,$00,$00
    Data.b $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$8D,$05,$97,$03
    Data.b $01,$00,$50,$8F,$05,$BC,$05,$01,$00,$FF,$25,$BC,$05,$01,$00,$55,$8B,$6C,$24,$0C
    Data.b $C7,$45,$1C,$00,$00,$00,$00,$8B,$6C,$24,$0C,$C7,$45,$18,$00,$00,$00,$00,$68,$00
    Data.b $00,$00,$00,$FF,$74,$24,$10,$E8,$A1,$02,$00,$00,$31,$C0,$EB,$02,$31,$C0,$5D,$C2
    Data.b $08,$00,$55,$53,$BA,$0A,$00,$00,$00,$83,$EC,$04,$C7,$04,$24,$00,$00,$00,$00,$4A
    Data.b $75,$F3,$8B,$6C,$24,$38,$8B,$45,$60,$89,$44,$24,$08,$8B,$6C,$24,$08,$8B,$45,$08
    Data.b $89,$44,$24,$0C,$8B,$6C,$24,$08,$8B,$45,$04,$89,$44,$24,$10,$8B,$6C,$24,$38,$FF
    Data.b $75,$0C,$E8,$3D,$02,$00,$00,$89,$44,$24,$14,$8B,$5C,$24,$14,$81,$E3,$FF,$FF,$00
    Data.b $00,$89,$5C,$24,$18,$8B,$5C,$24,$14,$C1,$FB,$10,$81,$E3,$FF,$00,$00,$00,$89,$D8
    Data.b $88,$44,$24,$1C,$8B,$6C,$24,$08,$8B,$45,$0C,$89,$44,$24,$20,$C7,$04,$24,$00,$00
    Data.b $00,$00,$FF,$74,$24,$20,$BB,$00,$02,$00,$00,$3B,$1C,$24,$75,$2D,$8B,$44,$24,$1C
    Data.b $50,$E8,$84,$01,$00,$00,$88,$44,$24,$28,$0F,$BE,$44,$24,$28,$50,$8B,$6C,$24,$40
    Data.b $8B,$45,$0C,$E8,$E8,$01,$00,$00,$8B,$6C,$24,$3C,$C7,$45,$1C,$01,$00,$00,$00,$EB
    Data.b $3A,$BB,$00,$04,$00,$00,$3B,$1C,$24,$75,$1D,$0F,$B6,$44,$24,$20,$50,$8B,$44,$24
    Data.b $20,$50,$E8,$68,$01,$00,$00,$8B,$6C,$24,$3C,$C7,$45,$1C,$00,$00,$00,$00,$EB,$13
    Data.b $C7,$44,$24,$04,$01,$00,$00,$C0,$8B,$6C,$24,$3C,$C7,$45,$1C,$00,$00,$00,$00,$58
    Data.b $FF,$34,$24,$8B,$6C,$24,$3C,$8F,$45,$18,$68,$00,$00,$00,$00,$FF,$74,$24,$3C,$E8
    Data.b $91,$01,$00,$00,$8B,$04,$24,$EB,$02,$31,$C0,$83,$C4,$28,$5B,$5D,$C2,$08,$00,$55
    Data.b $53,$BA,$31,$00,$00,$00,$83,$EC,$04,$C7,$04,$24,$00,$00,$00,$00,$4A,$75,$F3,$BD
    Data.b $58,$05,$01,$00,$55,$8D,$84,$24,$B4,$00,$00,$00,$50,$E8,$61,$01,$00,$00,$BD,$80
    Data.b $05,$01,$00,$55,$8D,$84,$24,$BC,$00,$00,$00,$50,$E8,$4E,$01,$00,$00,$8D,$04,$24
    Data.b $50,$68,$00,$00,$00,$00,$68,$00,$00,$00,$00,$68,$22,$00,$00,$00,$8D,$84,$24,$C0
    Data.b $00,$00,$00,$50,$68,$00,$00,$00,$00,$FF,$B4,$24,$E8,$00,$00,$00,$E8,$28,$01,$00
    Data.b $00,$89,$84,$24,$C0,$00,$00,$00,$8B,$9C,$24,$C0,$00,$00,$00,$21,$DB,$74,$09,$8B
    Data.b $84,$24,$C0,$00,$00,$00,$EB,$73,$8D,$84,$24,$B0,$00,$00,$00,$50,$8D,$84,$24,$BC
    Data.b $00,$00,$00,$50,$E8,$FE,$00,$00,$00,$89,$84,$24,$C0,$00,$00,$00,$8B,$9C,$24,$C0
    Data.b $00,$00,$00,$21,$DB,$74,$12,$8D,$04,$24,$50,$E8,$E9,$00,$00,$00,$8B,$84,$24,$C0
    Data.b $00,$00,$00,$EB,$3A,$8D,$05,$C6,$04,$01,$00,$8B,$AC,$24,$D0,$00,$00,$00,$89,$45
    Data.b $34,$8D,$05,$53,$02,$01,$00,$50,$8B,$AC,$24,$D4,$00,$00,$00,$58,$89,$45,$38,$8D
    Data.b $05,$82,$02,$01,$00,$50,$8B,$AC,$24,$D4,$00,$00,$00,$58,$89,$45,$70,$31,$C0,$EB
    Data.b $02,$31,$C0,$81,$C4,$C4,$00,$00,$00,$5B,$5D,$C2,$08,$00,$31,$C0,$50,$C6,$04,$24
    Data.b $00,$66,$8B,$54,$24,$08,$EC,$88,$04,$24,$0F,$BE,$04,$24,$0F,$BE,$C0,$EB,$02,$31
    Data.b $C0,$83,$C4,$04,$C2,$04,$00,$8A,$44,$24,$08,$66,$8B,$54,$24,$04,$EE,$31,$C0,$C2
    Data.b $08,$00,$55,$31,$C0,$50,$50,$BD,$80,$05,$01,$00,$55,$8D,$44,$24,$04,$50,$E8,$44
    Data.b $00,$00,$00,$8D,$04,$24,$50,$E8,$53,$00,$00,$00,$8B,$6C,$24,$10,$FF,$75,$04,$E8
    Data.b $41,$00,$00,$00,$31,$C0,$83,$C4,$08,$5D,$C2,$04,$00,$00,$00,$00,$00,$00,$00,$00
    Data.b $8B,$44,$24,$04,$8B,$00,$C2,$04,$00,$CC,$CC,$CC,$CC,$CC,$CC,$CC,$8B,$54,$24,$04
    Data.b $88,$10,$C2,$04,$00,$FF,$25,$84,$09,$01,$00,$FF,$25,$88,$09,$01,$00,$FF,$25,$8C
    Data.b $09,$01,$00,$FF,$25,$90,$09,$01,$00,$FF,$25,$94,$09,$01,$00,$FF,$25,$98,$09,$01
    Data.b $00,$00,$00,$00,$00,$FF,$FF,$FF,$FF,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$90
    Data.b $00,$00,$00,$00,$FF,$FF,$FF,$FF,$5C,$00,$44,$00,$65,$00,$76,$00,$69,$00,$63,$00
    Data.b $65,$00,$5C,$00,$70,$00,$62,$00,$64,$00,$72,$00,$69,$00,$76,$00,$65,$00,$72,$00
    Data.b $69,$00,$6F,$00,$00,$00,$00,$00,$5C,$00,$44,$00,$6F,$00,$73,$00,$44,$00,$65,$00
    Data.b $76,$00,$69,$00,$63,$00,$65,$00,$73,$00,$5C,$00,$70,$00,$62,$00,$64,$00,$72,$00
    Data.b $69,$00,$76,$00,$65,$00,$72,$00,$69,$00,$6F,$00,$00,$00,$00,$00,$00,$00,$00,$00
    Data.b $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$5F,$A1,$B0,$50
    Data.b $00,$00,$00,$00,$00,$00,$01,$00,$10,$00,$00,$00,$18,$00,$00,$80,$00,$00,$00,$00
    Data.b $5F,$A1,$B0,$50,$00,$00,$00,$00,$00,$00,$01,$00,$01,$00,$00,$00,$30,$00,$00,$80
    Data.b $00,$00,$00,$00,$5F,$A1,$B0,$50,$00,$00,$00,$00,$00,$00,$01,$00,$09,$04,$00,$00
    Data.b $48,$00,$00,$00,$18,$06,$00,$00,$10,$03,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00
    Data.b $10,$03,$34,$00,$00,$00,$56,$00,$53,$00,$5F,$00,$56,$00,$45,$00,$52,$00,$53,$00
    Data.b $49,$00,$4F,$00,$4E,$00,$5F,$00,$49,$00,$4E,$00,$46,$00,$4F,$00,$00,$00,$00,$00
    Data.b $BD,$04,$EF,$FE,$00,$00,$01,$00,$02,$00,$01,$00,$00,$00,$00,$00,$02,$00,$01,$00
    Data.b $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$03,$00,$00,$00
    Data.b $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$70,$02,$00,$00,$01,$00,$53,$00
    Data.b $74,$00,$72,$00,$69,$00,$6E,$00,$67,$00,$46,$00,$69,$00,$6C,$00,$65,$00,$49,$00
    Data.b $6E,$00,$66,$00,$6F,$00,$00,$00,$4C,$02,$00,$00,$01,$00,$30,$00,$30,$00,$30,$00
    Data.b $30,$00,$30,$00,$34,$00,$62,$00,$30,$00,$00,$00,$46,$00,$13,$00,$01,$00,$43,$00
    Data.b $6F,$00,$6D,$00,$70,$00,$61,$00,$6E,$00,$79,$00,$4E,$00,$61,$00,$6D,$00,$65,$00
    Data.b $00,$00,$00,$00,$50,$00,$75,$00,$72,$00,$65,$00,$42,$00,$61,$00,$73,$00,$69,$00
    Data.b $63,$00,$20,$00,$43,$00,$6F,$00,$6D,$00,$70,$00,$69,$00,$6C,$00,$65,$00,$72,$00
    Data.b $00,$00,$00,$00,$36,$00,$0B,$00,$01,$00,$50,$00,$72,$00,$6F,$00,$64,$00,$75,$00
    Data.b $63,$00,$74,$00,$4E,$00,$61,$00,$6D,$00,$65,$00,$00,$00,$00,$00,$70,$00,$62,$00
    Data.b $64,$00,$72,$00,$69,$00,$76,$00,$65,$00,$72,$00,$69,$00,$6F,$00,$00,$00,$00,$00
    Data.b $2C,$00,$04,$00,$01,$00,$50,$00,$72,$00,$6F,$00,$64,$00,$75,$00,$63,$00,$74,$00
    Data.b $56,$00,$65,$00,$72,$00,$73,$00,$69,$00,$6F,$00,$6E,$00,$00,$00,$31,$00,$2E,$00
    Data.b $32,$00,$00,$00,$28,$00,$04,$00,$01,$00,$46,$00,$69,$00,$6C,$00,$65,$00,$56,$00
    Data.b $65,$00,$72,$00,$73,$00,$69,$00,$6F,$00,$6E,$00,$00,$00,$00,$00,$31,$00,$2E,$00
    Data.b $32,$00,$00,$00,$46,$00,$0F,$00,$01,$00,$46,$00,$69,$00,$6C,$00,$65,$00,$44,$00
    Data.b $65,$00,$73,$00,$63,$00,$72,$00,$69,$00,$70,$00,$74,$00,$69,$00,$6F,$00,$6E,$00
    Data.b $00,$00,$00,$00,$44,$00,$72,$00,$69,$00,$76,$00,$65,$00,$72,$00,$20,$00,$50,$00
    Data.b $6F,$00,$72,$00,$74,$00,$20,$00,$49,$00,$4F,$00,$00,$00,$00,$00,$36,$00,$0B,$00
    Data.b $01,$00,$49,$00,$6E,$00,$74,$00,$65,$00,$72,$00,$6E,$00,$61,$00,$6C,$00,$4E,$00
    Data.b $61,$00,$6D,$00,$65,$00,$00,$00,$70,$00,$62,$00,$64,$00,$72,$00,$69,$00,$76,$00
    Data.b $65,$00,$72,$00,$69,$00,$6F,$00,$00,$00,$00,$00,$46,$00,$0F,$00,$01,$00,$4F,$00
    Data.b $72,$00,$69,$00,$67,$00,$69,$00,$6E,$00,$61,$00,$6C,$00,$46,$00,$69,$00,$6C,$00
    Data.b $65,$00,$6E,$00,$61,$00,$6D,$00,$65,$00,$00,$00,$70,$00,$62,$00,$64,$00,$72,$00
    Data.b $69,$00,$76,$00,$65,$00,$72,$00,$69,$00,$6F,$00,$2E,$00,$73,$00,$79,$00,$73,$00
    Data.b $00,$00,$00,$00,$3E,$00,$15,$00,$01,$00,$45,$00,$6D,$00,$61,$00,$69,$00,$6C,$00
    Data.b $00,$00,$00,$00,$70,$00,$75,$00,$72,$00,$65,$00,$2D,$00,$62,$00,$61,$00,$73,$00
    Data.b $69,$00,$63,$00,$40,$00,$79,$00,$61,$00,$6E,$00,$64,$00,$65,$00,$78,$00,$2E,$00
    Data.b $72,$00,$75,$00,$00,$00,$00,$00,$58,$00,$20,$00,$01,$00,$57,$00,$65,$00,$62,$00
    Data.b $73,$00,$69,$00,$74,$00,$65,$00,$00,$00,$00,$00,$68,$00,$74,$00,$74,$00,$70,$00
    Data.b $3A,$00,$2F,$00,$2F,$00,$77,$00,$77,$00,$77,$00,$2E,$00,$70,$00,$75,$00,$72,$00
    Data.b $65,$00,$2D,$00,$62,$00,$61,$00,$73,$00,$69,$00,$63,$00,$2E,$00,$6E,$00,$61,$00
    Data.b $72,$00,$6F,$00,$64,$00,$2E,$00,$72,$00,$75,$00,$2F,$00,$00,$00,$44,$00,$00,$00
    Data.b $01,$00,$56,$00,$61,$00,$72,$00,$46,$00,$69,$00,$6C,$00,$65,$00,$49,$00,$6E,$00
    Data.b $66,$00,$6F,$00,$00,$00,$00,$00,$24,$00,$04,$00,$00,$00,$54,$00,$72,$00,$61,$00
    Data.b $6E,$00,$73,$00,$6C,$00,$61,$00,$74,$00,$69,$00,$6F,$00,$6E,$00,$00,$00,$00,$00
    Data.b $00,$00,$B0,$04,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00
    Data.b $00,$00,$00,$00,$00,$00,$00,$00,$68,$09,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00
    Data.b $20,$0A,$00,$00,$84,$09,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00
    Data.b $00,$00,$00,$00,$00,$00,$00,$00,$A0,$09,$00,$00,$B4,$09,$00,$00,$CC,$09,$00,$00
    Data.b $DE,$09,$00,$00,$F6,$09,$00,$00,$08,$0A,$00,$00,$00,$00,$00,$00,$A0,$09,$00,$00
    Data.b $B4,$09,$00,$00,$CC,$09,$00,$00,$DE,$09,$00,$00,$F6,$09,$00,$00,$08,$0A,$00,$00
    Data.b $00,$00,$00,$00,$3B,$01,$49,$6F,$43,$6F,$6D,$70,$6C,$65,$74,$65,$52,$65,$71,$75
    Data.b $65,$73,$74,$00,$1D,$04,$52,$74,$6C,$49,$6E,$69,$74,$55,$6E,$69,$63,$6F,$64,$65
    Data.b $53,$74,$72,$69,$6E,$67,$00,$00,$3E,$01,$49,$6F,$43,$72,$65,$61,$74,$65,$44,$65
    Data.b $76,$69,$63,$65,$00,$00,$47,$01,$49,$6F,$43,$72,$65,$61,$74,$65,$53,$79,$6D,$62
    Data.b $6F,$6C,$69,$63,$4C,$69,$6E,$6B,$00,$00,$4F,$01,$49,$6F,$44,$65,$6C,$65,$74,$65
    Data.b $44,$65,$76,$69,$63,$65,$00,$00,$51,$01,$49,$6F,$44,$65,$6C,$65,$74,$65,$53,$79
    Data.b $6D,$62,$6F,$6C,$69,$63,$4C,$69,$6E,$6B,$00,$00,$6E,$74,$6F,$73,$6B,$72,$6E,$6C
    Data.b $2E,$65,$78,$65,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00
    Data.b $00,$00,$00,$00,$00,$00,$00,$00,$28,$00,$00,$00,$42,$32,$49,$32,$4F,$32,$AC,$33
    Data.b $BF,$33,$53,$34,$63,$34,$75,$34,$CC,$34,$1B,$35,$21,$35,$27,$35,$2D,$35,$33,$35
    Data.b $39,$35,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00
    Data.b $00,$00,$00,$00,$00,$00,$00,$00
    Driver_x86_End:
    CompilerEndIf
    
    Driver_x64:
    Data.b $4D,$5A,$00,$00,$01,$00,$00,$00,$02,$00,$00,$00,$FF,$FF,$00,$00,$40,$00,$00,$00
    Data.b $00,$00,$00,$00,$40,$00,$00,$00,$00,$00,$00,$00,$B4,$4C,$CD,$21,$00,$00,$00,$00
    Data.b $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00
    Data.b $40,$00,$00,$00,$50,$45,$00,$00,$64,$86,$06,$00,$8C,$D4,$E0,$4F,$00,$00,$00,$00
    Data.b $00,$00,$00,$00,$F0,$00,$2E,$00,$0B,$02,$02,$32,$C0,$05,$00,$00,$60,$04,$00,$00
    Data.b $00,$00,$00,$00,$40,$02,$00,$00,$40,$02,$00,$00,$00,$00,$01,$00,$00,$00,$00,$00
    Data.b $20,$00,$00,$00,$20,$00,$00,$00,$04,$00,$00,$00,$00,$00,$00,$00,$05,$00,$02,$00
    Data.b $00,$00,$00,$00,$60,$0C,$00,$00,$40,$02,$00,$00,$20,$3B,$00,$00,$01,$00,$00,$00
    Data.b $00,$00,$10,$00,$00,$00,$00,$00,$00,$10,$00,$00,$00,$00,$00,$00,$00,$00,$10,$00
    Data.b $00,$00,$00,$00,$00,$10,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$10,$00,$00,$00
    Data.b $00,$00,$00,$00,$00,$00,$00,$00,$00,$0B,$00,$00,$28,$00,$00,$00,$80,$07,$00,$00
    Data.b $80,$03,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00
    Data.b $40,$0C,$00,$00,$10,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00
    Data.b $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00
    Data.b $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$60,$0B,$00,$00
    Data.b $38,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00
    Data.b $00,$00,$00,$00,$00,$00,$00,$00,$2E,$63,$6F,$64,$65,$00,$00,$00,$3C,$04,$00,$00
    Data.b $40,$02,$00,$00,$40,$04,$00,$00,$40,$02,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00
    Data.b $00,$00,$00,$00,$20,$00,$00,$68,$2E,$74,$65,$78,$74,$00,$00,$00,$37,$00,$00,$00
    Data.b $80,$06,$00,$00,$40,$00,$00,$00,$80,$06,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00
    Data.b $00,$00,$00,$00,$20,$00,$00,$68,$2E,$64,$61,$74,$61,$00,$00,$00,$B0,$00,$00,$00
    Data.b $C0,$06,$00,$00,$C0,$00,$00,$00,$C0,$06,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00
    Data.b $00,$00,$00,$00,$40,$00,$00,$C8,$2E,$72,$73,$72,$63,$00,$00,$00,$80,$03,$00,$00
    Data.b $80,$07,$00,$00,$80,$03,$00,$00,$80,$07,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00
    Data.b $00,$00,$00,$00,$40,$00,$00,$48,$49,$4E,$49,$54,$00,$00,$00,$00,$26,$01,$00,$00
    Data.b $00,$0B,$00,$00,$40,$01,$00,$00,$00,$0B,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00
    Data.b $00,$00,$00,$00,$20,$00,$00,$E2,$2E,$72,$65,$6C,$6F,$63,$00,$00,$10,$00,$00,$00
    Data.b $40,$0C,$00,$00,$20,$00,$00,$00,$40,$0C,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00
    Data.b $00,$00,$00,$00,$40,$00,$00,$42,$00,$00,$00,$00,$00,$00,$00,$00,$48,$8D,$05,$11
    Data.b $02,$00,$00,$48,$89,$C0,$50,$8F,$05,$17,$05,$00,$00,$FF,$25,$11,$05,$00,$00,$48
    Data.b $89,$4C,$24,$08,$48,$89,$54,$24,$10,$55,$48,$31,$C0,$50,$48,$83,$EC,$28,$48,$8B
    Data.b $6C,$24,$48,$48,$C7,$45,$38,$00,$00,$00,$00,$48,$8B,$6C,$24,$48,$48,$C7,$45,$30
    Data.b $00,$00,$00,$00,$68,$00,$00,$00,$00,$FF,$74,$24,$50,$59,$5A,$E8,$FF,$03,$00,$00
    Data.b $48,$31,$C0,$EB,$03,$48,$31,$C0,$48,$83,$C4,$30,$5D,$C3,$48,$89,$4C,$24,$08,$48
    Data.b $89,$54,$24,$10,$55,$41,$57,$48,$C7,$C0,$0A,$00,$00,$00,$48,$83,$EC,$08,$48,$C7
    Data.b $04,$24,$00,$00,$00,$00,$48,$FF,$C8,$75,$EF,$48,$83,$EC,$28,$48,$8B,$AC,$24,$98
    Data.b $00,$00,$00,$FF,$B5,$B8,$00,$00,$00,$58,$48,$89,$44,$24,$38,$48,$8B,$6C,$24,$38
    Data.b $FF,$75,$10,$58,$48,$89,$44,$24,$40,$48,$8B,$6C,$24,$38,$FF,$75,$08,$58,$48,$89
    Data.b $44,$24,$48,$48,$8B,$AC,$24,$98,$00,$00,$00,$FF,$75,$18,$59,$E8,$74,$03,$00,$00
    Data.b $48,$89,$44,$24,$50,$4C,$8B,$7C,$24,$50,$49,$81,$E7,$FF,$FF,$00,$00,$4C,$89,$7C
    Data.b $24,$58,$4C,$8B,$7C,$24,$50,$49,$C1,$FF,$10,$49,$81,$E7,$FF,$00,$00,$00,$4C,$89
    Data.b $F8,$88,$44,$24,$60,$48,$8B,$6C,$24,$38,$FF,$75,$18,$58,$48,$89,$44,$24,$68,$48
    Data.b $C7,$44,$24,$28,$00,$00,$00,$00,$FF,$74,$24,$68,$49,$C7,$C7,$00,$02,$00,$00,$4C
    Data.b $3B,$3C,$24,$75,$5F,$48,$83,$EC,$08,$48,$8B,$44,$24,$68,$48,$89,$C0,$50,$59,$48
    Data.b $83,$EC,$20,$E8,$5F,$02,$00,$00,$48,$83,$C4,$28,$48,$89,$C0,$88,$44,$24,$78,$48
    Data.b $83,$EC,$08,$48,$0F,$BE,$84,$24,$80,$00,$00,$00,$48,$89,$C0,$50,$48,$8B,$AC,$24
    Data.b $B0,$00,$00,$00,$FF,$75,$18,$59,$5A,$48,$83,$EC,$20,$E8,$E6,$02,$00,$00,$48,$83
    Data.b $C4,$28,$48,$8B,$AC,$24,$A0,$00,$00,$00,$48,$C7,$45,$38,$01,$00,$00,$00,$EB,$61
    Data.b $49,$C7,$C7,$00,$04,$00,$00,$4C,$3B,$3C,$24,$75,$35,$48,$83,$EC,$08,$48,$0F,$B6
    Data.b $44,$24,$70,$50,$48,$8B,$44,$24,$70,$48,$89,$C0,$50,$59,$5A,$48,$83,$EC,$20,$E8
    Data.b $1C,$02,$00,$00,$48,$83,$C4,$28,$48,$8B,$AC,$24,$A0,$00,$00,$00,$48,$C7,$45,$38
    Data.b $00,$00,$00,$00,$EB,$1F,$48,$B8,$01,$00,$00,$C0,$00,$00,$00,$00,$48,$89,$44,$24
    Data.b $30,$48,$8B,$AC,$24,$A0,$00,$00,$00,$48,$C7,$45,$38,$00,$00,$00,$00,$58,$FF,$74
    Data.b $24,$28,$48,$8B,$AC,$24,$A0,$00,$00,$00,$58,$48,$89,$45,$30,$68,$00,$00,$00,$00
    Data.b $FF,$B4,$24,$A0,$00,$00,$00,$59,$5A,$E8,$4D,$02,$00,$00,$48,$8B,$44,$24,$28,$EB
    Data.b $03,$48,$31,$C0,$48,$83,$C4,$78,$41,$5F,$5D,$C3,$48,$89,$4C,$24,$08,$48,$89,$54
    Data.b $24,$10,$55,$41,$57,$48,$C7,$C0,$30,$00,$00,$00,$48,$83,$EC,$08,$48,$C7,$04,$24
    Data.b $00,$00,$00,$00,$48,$FF,$C8,$75,$EF,$48,$83,$EC,$28,$48,$BD,$E0,$06,$01,$00,$00
    Data.b $00,$00,$00,$48,$89,$E8,$50,$48,$8D,$84,$24,$80,$01,$00,$00,$48,$89,$C0,$50,$59
    Data.b $5A,$E8,$F7,$01,$00,$00,$48,$BD,$10,$07,$01,$00,$00,$00,$00,$00,$48,$89,$E8,$50
    Data.b $48,$8D,$84,$24,$90,$01,$00,$00,$48,$89,$C0,$50,$59,$5A,$E8,$D6,$01,$00,$00,$48
    Data.b $83,$EC,$08,$48,$8D,$44,$24,$30,$48,$89,$C0,$50,$68,$00,$00,$00,$00,$68,$00,$00
    Data.b $00,$00,$68,$22,$00,$00,$00,$48,$8D,$84,$24,$A0,$01,$00,$00,$48,$89,$C0,$50,$68
    Data.b $00,$00,$00,$00,$FF,$B4,$24,$F8,$01,$00,$00,$59,$5A,$41,$58,$41,$59,$48,$83,$EC
    Data.b $20,$E8,$99,$01,$00,$00,$48,$83,$C4,$40,$48,$89,$84,$24,$98,$01,$00,$00,$4C,$8B
    Data.b $BC,$24,$98,$01,$00,$00,$4D,$21,$FF,$74,$0D,$48,$8B,$84,$24,$98,$01,$00,$00,$E9
    Data.b $A0,$00,$00,$00,$48,$8D,$84,$24,$78,$01,$00,$00,$48,$89,$C0,$50,$48,$8D,$84,$24
    Data.b $90,$01,$00,$00,$48,$89,$C0,$50,$59,$5A,$E8,$5A,$01,$00,$00,$48,$89,$84,$24,$98
    Data.b $01,$00,$00,$4C,$8B,$BC,$24,$98,$01,$00,$00,$4D,$21,$FF,$74,$19,$48,$8D,$44,$24
    Data.b $28,$48,$89,$C0,$50,$59,$E8,$3C,$01,$00,$00,$48,$8B,$84,$24,$98,$01,$00,$00,$EB
    Data.b $53,$48,$8D,$05,$A8,$00,$00,$00,$48,$89,$C0,$50,$48,$8B,$AC,$24,$C8,$01,$00,$00
    Data.b $58,$48,$89,$45,$68,$48,$8D,$05,$BF,$FC,$FF,$FF,$48,$89,$C0,$50,$48,$8B,$AC,$24
    Data.b $C8,$01,$00,$00,$58,$48,$89,$45,$70,$48,$8D,$05,$F2,$FC,$FF,$FF,$48,$89,$C0,$50
    Data.b $48,$8B,$AC,$24,$C8,$01,$00,$00,$58,$48,$89,$85,$E0,$00,$00,$00,$48,$31,$C0,$EB
    Data.b $03,$48,$31,$C0,$48,$81,$C4,$A8,$01,$00,$00,$41,$5F,$5D,$C3,$48,$89,$4C,$24,$08
    Data.b $48,$31,$C0,$50,$50,$48,$83,$EC,$28,$C6,$44,$24,$28,$00,$66,$8B,$54,$24,$40,$EC
    Data.b $88,$44,$24,$28,$48,$0F,$BE,$44,$24,$28,$48,$0F,$BE,$C0,$EB,$03,$48,$31,$C0,$48
    Data.b $83,$C4,$38,$C3,$48,$89,$4C,$24,$08,$48,$89,$54,$24,$10,$48,$83,$EC,$28,$8A,$44
    Data.b $24,$38,$66,$8B,$54,$24,$30,$EE,$48,$31,$C0,$48,$83,$C4,$28,$C3,$48,$89,$4C,$24
    Data.b $08,$55,$48,$31,$C0,$50,$50,$50,$48,$83,$EC,$28,$48,$BD,$10,$07,$01,$00,$00,$00
    Data.b $00,$00,$48,$89,$E8,$50,$48,$8D,$44,$24,$30,$48,$89,$C0,$50,$59,$5A,$E8,$43,$00
    Data.b $00,$00,$48,$8D,$44,$24,$28,$48,$89,$C0,$50,$59,$E8,$4C,$00,$00,$00,$48,$8B,$6C
    Data.b $24,$50,$FF,$75,$08,$59,$E8,$38,$00,$00,$00,$48,$31,$C0,$48,$83,$C4,$40,$5D,$C3
    Data.b $00,$00,$00,$00,$48,$8B,$01,$C3,$CC,$CC,$CC,$CC,$CC,$CC,$CC,$CC,$CC,$CC,$CC,$CC
    Data.b $88,$11,$C3,$FF,$25,$C7,$04,$00,$00,$FF,$25,$C9,$04,$00,$00,$FF,$25,$CB,$04,$00
    Data.b $00,$FF,$25,$CD,$04,$00,$00,$FF,$25,$CF,$04,$00,$00,$FF,$25,$D1,$04,$00,$00,$00
    Data.b $00,$00,$00,$00,$00,$00,$00,$00,$00,$FF,$FF,$FF,$FF,$00,$00,$00,$00,$00,$00,$00
    Data.b $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF
    Data.b $5C,$00,$44,$00,$65,$00,$76,$00,$69,$00,$63,$00,$65,$00,$5C,$00,$70,$00,$62,$00
    Data.b $64,$00,$72,$00,$69,$00,$76,$00,$65,$00,$72,$00,$69,$00,$6F,$00,$5F,$00,$78,$00
    Data.b $36,$00,$34,$00,$00,$00,$00,$00,$5C,$00,$44,$00,$6F,$00,$73,$00,$44,$00,$65,$00
    Data.b $76,$00,$69,$00,$63,$00,$65,$00,$73,$00,$5C,$00,$70,$00,$62,$00,$64,$00,$72,$00
    Data.b $69,$00,$76,$00,$65,$00,$72,$00,$69,$00,$6F,$00,$5F,$00,$78,$00,$36,$00,$34,$00
    Data.b $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00
    Data.b $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00
    Data.b $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00
    Data.b $00,$00,$00,$00,$8C,$D4,$E0,$4F,$00,$00,$00,$00,$00,$00,$01,$00,$10,$00,$00,$00
    Data.b $18,$00,$00,$80,$00,$00,$00,$00,$8C,$D4,$E0,$4F,$00,$00,$00,$00,$00,$00,$01,$00
    Data.b $01,$00,$00,$00,$30,$00,$00,$80,$00,$00,$00,$00,$8C,$D4,$E0,$4F,$00,$00,$00,$00
    Data.b $00,$00,$01,$00,$09,$04,$00,$00,$48,$00,$00,$00,$D8,$07,$00,$00,$28,$03,$00,$00
    Data.b $00,$00,$00,$00,$00,$00,$00,$00,$28,$03,$34,$00,$00,$00,$56,$00,$53,$00,$5F,$00
    Data.b $56,$00,$45,$00,$52,$00,$53,$00,$49,$00,$4F,$00,$4E,$00,$5F,$00,$49,$00,$4E,$00
    Data.b $46,$00,$4F,$00,$00,$00,$00,$00,$BD,$04,$EF,$FE,$00,$00,$01,$00,$02,$00,$01,$00
    Data.b $00,$00,$00,$00,$02,$00,$01,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00
    Data.b $00,$00,$00,$00,$03,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00
    Data.b $88,$02,$00,$00,$01,$00,$53,$00,$74,$00,$72,$00,$69,$00,$6E,$00,$67,$00,$46,$00
    Data.b $69,$00,$6C,$00,$65,$00,$49,$00,$6E,$00,$66,$00,$6F,$00,$00,$00,$64,$02,$00,$00
    Data.b $01,$00,$30,$00,$30,$00,$30,$00,$30,$00,$30,$00,$34,$00,$62,$00,$30,$00,$00,$00
    Data.b $4E,$00,$17,$00,$01,$00,$43,$00,$6F,$00,$6D,$00,$70,$00,$61,$00,$6E,$00,$79,$00
    Data.b $4E,$00,$61,$00,$6D,$00,$65,$00,$00,$00,$00,$00,$50,$00,$75,$00,$72,$00,$65,$00
    Data.b $42,$00,$61,$00,$73,$00,$69,$00,$63,$00,$20,$00,$43,$00,$6F,$00,$6D,$00,$70,$00
    Data.b $69,$00,$6C,$00,$65,$00,$72,$00,$20,$00,$78,$00,$36,$00,$34,$00,$00,$00,$00,$00
    Data.b $36,$00,$0B,$00,$01,$00,$50,$00,$72,$00,$6F,$00,$64,$00,$75,$00,$63,$00,$74,$00
    Data.b $4E,$00,$61,$00,$6D,$00,$65,$00,$00,$00,$00,$00,$70,$00,$62,$00,$64,$00,$72,$00
    Data.b $69,$00,$76,$00,$65,$00,$72,$00,$69,$00,$6F,$00,$00,$00,$00,$00,$2C,$00,$04,$00
    Data.b $01,$00,$50,$00,$72,$00,$6F,$00,$64,$00,$75,$00,$63,$00,$74,$00,$56,$00,$65,$00
    Data.b $72,$00,$73,$00,$69,$00,$6F,$00,$6E,$00,$00,$00,$31,$00,$2E,$00,$32,$00,$00,$00
    Data.b $28,$00,$04,$00,$01,$00,$46,$00,$69,$00,$6C,$00,$65,$00,$56,$00,$65,$00,$72,$00
    Data.b $73,$00,$69,$00,$6F,$00,$6E,$00,$00,$00,$00,$00,$31,$00,$2E,$00,$32,$00,$00,$00
    Data.b $4E,$00,$13,$00,$01,$00,$46,$00,$69,$00,$6C,$00,$65,$00,$44,$00,$65,$00,$73,$00
    Data.b $63,$00,$72,$00,$69,$00,$70,$00,$74,$00,$69,$00,$6F,$00,$6E,$00,$00,$00,$00,$00
    Data.b $44,$00,$72,$00,$69,$00,$76,$00,$65,$00,$72,$00,$20,$00,$50,$00,$6F,$00,$72,$00
    Data.b $74,$00,$20,$00,$49,$00,$4F,$00,$20,$00,$78,$00,$36,$00,$34,$00,$00,$00,$00,$00
    Data.b $36,$00,$0B,$00,$01,$00,$49,$00,$6E,$00,$74,$00,$65,$00,$72,$00,$6E,$00,$61,$00
    Data.b $6C,$00,$4E,$00,$61,$00,$6D,$00,$65,$00,$00,$00,$70,$00,$62,$00,$64,$00,$72,$00
    Data.b $69,$00,$76,$00,$65,$00,$72,$00,$69,$00,$6F,$00,$00,$00,$00,$00,$4E,$00,$13,$00
    Data.b $01,$00,$4F,$00,$72,$00,$69,$00,$67,$00,$69,$00,$6E,$00,$61,$00,$6C,$00,$46,$00
    Data.b $69,$00,$6C,$00,$65,$00,$6E,$00,$61,$00,$6D,$00,$65,$00,$00,$00,$70,$00,$62,$00
    Data.b $64,$00,$72,$00,$69,$00,$76,$00,$65,$00,$72,$00,$69,$00,$6F,$00,$5F,$00,$78,$00
    Data.b $36,$00,$34,$00,$2E,$00,$73,$00,$79,$00,$73,$00,$00,$00,$00,$00,$3E,$00,$15,$00
    Data.b $01,$00,$45,$00,$6D,$00,$61,$00,$69,$00,$6C,$00,$00,$00,$00,$00,$70,$00,$75,$00
    Data.b $72,$00,$65,$00,$2D,$00,$62,$00,$61,$00,$73,$00,$69,$00,$63,$00,$40,$00,$79,$00
    Data.b $61,$00,$6E,$00,$64,$00,$65,$00,$78,$00,$2E,$00,$72,$00,$75,$00,$00,$00,$00,$00
    Data.b $58,$00,$20,$00,$01,$00,$57,$00,$65,$00,$62,$00,$73,$00,$69,$00,$74,$00,$65,$00
    Data.b $00,$00,$00,$00,$68,$00,$74,$00,$74,$00,$70,$00,$3A,$00,$2F,$00,$2F,$00,$77,$00
    Data.b $77,$00,$77,$00,$2E,$00,$70,$00,$75,$00,$72,$00,$65,$00,$2D,$00,$62,$00,$61,$00
    Data.b $73,$00,$69,$00,$63,$00,$2E,$00,$6E,$00,$61,$00,$72,$00,$6F,$00,$64,$00,$2E,$00
    Data.b $72,$00,$75,$00,$2F,$00,$00,$00,$44,$00,$00,$00,$01,$00,$56,$00,$61,$00,$72,$00
    Data.b $46,$00,$69,$00,$6C,$00,$65,$00,$49,$00,$6E,$00,$66,$00,$6F,$00,$00,$00,$00,$00
    Data.b $24,$00,$04,$00,$00,$00,$54,$00,$72,$00,$61,$00,$6E,$00,$73,$00,$6C,$00,$61,$00
    Data.b $74,$00,$69,$00,$6F,$00,$6E,$00,$00,$00,$00,$00,$00,$00,$B0,$04,$28,$0B,$00,$00
    Data.b $00,$00,$00,$00,$00,$00,$00,$00,$18,$0C,$00,$00,$60,$0B,$00,$00,$00,$00,$00,$00
    Data.b $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$98,$0B,$00,$00
    Data.b $00,$00,$00,$00,$AC,$0B,$00,$00,$00,$00,$00,$00,$C4,$0B,$00,$00,$00,$00,$00,$00
    Data.b $D6,$0B,$00,$00,$00,$00,$00,$00,$EE,$0B,$00,$00,$00,$00,$00,$00,$00,$0C,$00,$00
    Data.b $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$98,$0B,$00,$00,$00,$00,$00,$00
    Data.b $AC,$0B,$00,$00,$00,$00,$00,$00,$C4,$0B,$00,$00,$00,$00,$00,$00,$D6,$0B,$00,$00
    Data.b $00,$00,$00,$00,$EE,$0B,$00,$00,$00,$00,$00,$00,$00,$0C,$00,$00,$00,$00,$00,$00
    Data.b $00,$00,$00,$00,$00,$00,$00,$00,$C9,$01,$49,$6F,$43,$6F,$6D,$70,$6C,$65,$74,$65
    Data.b $52,$65,$71,$75,$65,$73,$74,$00,$BA,$05,$52,$74,$6C,$49,$6E,$69,$74,$55,$6E,$69
    Data.b $63,$6F,$64,$65,$53,$74,$72,$69,$6E,$67,$00,$00,$CE,$01,$49,$6F,$43,$72,$65,$61
    Data.b $74,$65,$44,$65,$76,$69,$63,$65,$00,$00,$D8,$01,$49,$6F,$43,$72,$65,$61,$74,$65
    Data.b $53,$79,$6D,$62,$6F,$6C,$69,$63,$4C,$69,$6E,$6B,$00,$00,$E3,$01,$49,$6F,$44,$65
    Data.b $6C,$65,$74,$65,$44,$65,$76,$69,$63,$65,$00,$00,$E5,$01,$49,$6F,$44,$65,$6C,$65
    Data.b $74,$65,$53,$79,$6D,$62,$6F,$6C,$69,$63,$4C,$69,$6E,$6B,$00,$00,$6E,$74,$6F,$73
    Data.b $6B,$72,$6E,$6C,$2E,$65,$78,$65,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00
    Data.b $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00
    Data.b $10,$00,$00,$00,$83,$A4,$A4,$A4,$3A,$A6,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00
    Data.b $00,$00,$00,$00,$00,$00,$00,$00
    Driver_x64_End:
    
  EndDataSection
  ;}
  
EndModule
Example write number 100 to port LPT1 and reading from port.

Code: Select all

XIncludeFile "PortIO.pbi"

*Port.PortIO::PortIO = PortIO::New()
Debug *Port

If *Port
  
  Select *Port\Status()
    Case PortIO::#Status_OK
      Debug "OK"
    Case PortIO::#Status_ErrCopyDriver
      Debug "Error Copy Driver"
    Case PortIO::#Status_ErrInstallDriver
      Debug "Error Install Driver"
    Case PortIO::#Status_ErrAccess
      Debug "Error Access Driver"
  EndSelect
    
  Debug *Port\DriverID()
  *Port\SetByte($378, 100)
  Debug *Port\GetByte($378)
  *Port\Free()
  
EndIf
Another example of operation with LPT port.

Code: Select all

XIncludeFile "PortIO.pbi"

Procedure SendLPT1(*Port.PortIO::PortIO)
  Send.a=0
  For i=8 To 1 Step -1
    If GetGadgetState(i)=1
      Send | 1
    Else
      Send & %11111110
    EndIf
    If i>1
      Send << 1
    EndIf
  Next i         
  *Port\SetByte($378, Send)
EndProcedure


*Port.PortIO::PortIO = PortIO::New()
If *Port
  
  Err = *Port\Status()
  If Err<>PortIO::#Status_OK
    MessageRequester("", "Error driver "+Str(Err))
  EndIf
  
  
  OpenWindow(0,0,0,120,240,"lpt Pin", #PB_Window_MinimizeGadget|#PB_Window_ScreenCentered|#PB_Window_Invisible)  
  Frame3DGadget(#PB_Any,20,10,80,180,"Pins")
  y=28
  For i=1 To 8
    CheckBoxGadget(i,36,y,50,16,"Pin "+Str(i))
    y+20
  Next i
  ButtonGadget(9,6,210,110,24,"Send in LPT 1")
  HideWindow(0,0)
  
  Repeat
    Event=WaitWindowEvent()
    If Event=#PB_Event_Gadget
      Gadget=EventGadget()
      If Gadget=9
        SendLPT1(*Port)
      EndIf
    EndIf
  Until Event=#PB_Event_CloseWindow
  
  *Port\Free()
  
EndIf
Measurement of the temperature of the processor and chipset.

Code: Select all

#ADR_REG = $295
#DATA_REG = $296

XIncludeFile "PortIO.pbi"

Procedure Termo(*Port.PortIO::PortIO)
  *Port\SetByte(#ADR_REG, $2B)
  x=*Port\GetByte(#DATA_REG)
  SetGadgetItemText(0,0,StrU(x, #PB_Byte)+" °C",1)
  
  *Port\SetByte(#ADR_REG, $29)
  x=*Port\GetByte(#DATA_REG)
  SetGadgetItemText(0,1,StrU(x, #PB_Byte)+" °C",1)
EndProcedure 


*Port.PortIO::PortIO = PortIO::New()
If *Port
  
  Err = *Port\Status()
  If Err<>PortIO::#Status_OK
    MessageRequester("", "Error driver "+Str(Err))
  EndIf
  
  OpenWindow(0,0,0,274,80,"TermoControl",#PB_Window_MinimizeGadget|#PB_Window_Invisible|#PB_Window_ScreenCentered) 
  
  ListIconGadget(0,2,4,270,70,"Name",120,#PB_ListIcon_GridLines)
  SetGadgetFont(0,LoadFont(0,"MS Sans Serif",10) )
  AddGadgetColumn(0, 1, "Temperature", 140)
  AddGadgetItem(0, 0, "Processor")
  AddGadgetItem(0, 1, "Chipset") 
  
  Termo(*Port)
  AddWindowTimer(0,2,1000)
  
  HideWindow(0,0)
  
  Repeat
    Event=WaitWindowEvent()
    If Event=#PB_Event_Timer
      Termo(*Port)
    EndIf
  Until Event=#PB_Event_CloseWindow
  
  *Port\Free()
  
EndIf

Re: Module PortIO (Windows x86 and x64)

Posted: Sat Nov 09, 2013 1:23 pm
by Joakim Christiansen
If I understand this right it tries to install the driver for me, basically I just have to copy paste and run? I tried running it as administrator to help it install it, but then I get "Error Access Driver". Do I need a restart first? Running Windows 7 x64 here, or does it need signed drivers?

Re: Module PortIO (Windows x86 and x64)

Posted: Sat Nov 09, 2013 1:42 pm
by User_Russian
x64 driver is not digitally signed. This is the reason for the error.

Re: Module PortIO (Windows x86 and x64)

Posted: Sat Nov 23, 2013 11:20 am
by davidmikKy
To gain access to the ports.......................... "O :shock:

Re: Module PortIO (Windows x86 and x64)

Posted: Wed Nov 27, 2013 7:03 pm
by Joakim Christiansen
davidmikKy wrote:To gain access to the ports.......................... "O :shock:
What are you shocked about? :P

Re: Module PortIO (Windows x86 and x64)

Posted: Thu Jan 05, 2023 11:14 am
by morosh
Hello:
This snippet is not working anymore, long time ago it was working
Always "Error Install Driver"

using PB6 - W10

Re: Module PortIO (Windows x86 and x64)

Posted: Thu Jan 05, 2023 10:11 pm
by mk-soft
You must restart your system with the setting non-certified driver installation.
I don't know where this was. But it works.