From 40710232fc540bf74e54f65845931774e4c58b7b Mon Sep 17 00:00:00 2001 From: mbirth Date: Wed, 8 Dec 2004 09:51:33 +0000 Subject: [PATCH] modified AnalyzerU.dfm modified AnalyzerU.pas deleted DLPORTIO.dll deleted DLPORTIO.sys modified SMBus.pas added ddkint.pas added zlportio.pas added zlportio.sys i: converted to support ZlPortIO (because DLPortIO needed to be installed as a system service, didn't like it) +: SONY SMBus controller support added +: SMBus reading implemented --- AnalyzerU.dfm | 66 ++++++++++-- AnalyzerU.pas | 79 ++++++++++++-- DLPORTIO.dll | Bin 34816 -> 0 bytes DLPORTIO.sys | Bin 3584 -> 0 bytes SMBus.pas | 100 +++++++++++++----- ddkint.pas | 251 ++++++++++++++++++++++++++++++++++++++++++++ zlportio.pas | 283 ++++++++++++++++++++++++++++++++++++++++++++++++++ zlportio.sys | Bin 0 -> 4016 bytes 8 files changed, 739 insertions(+), 40 deletions(-) delete mode 100644 DLPORTIO.dll delete mode 100644 DLPORTIO.sys create mode 100644 ddkint.pas create mode 100644 zlportio.pas create mode 100644 zlportio.sys diff --git a/AnalyzerU.dfm b/AnalyzerU.dfm index e26f411..4881ee9 100644 --- a/AnalyzerU.dfm +++ b/AnalyzerU.dfm @@ -11,6 +11,7 @@ object AForm: TAForm Font.Name = 'MS Sans Serif' Font.Style = [] OldCreateOrder = False + OnCreate = FormCreate PixelsPerInch = 96 TextHeight = 13 object LabelHeading: TLabel @@ -442,20 +443,73 @@ object AForm: TAForm Left = 0 Top = 56 Width = 489 - Height = 105 + Height = 129 Caption = 'SMBus' - Enabled = False TabOrder = 1 + object LabelSMBStatus: TLabel + Left = 88 + Top = 48 + Width = 393 + Height = 13 + AutoSize = False + Caption = 'Push button to read selected SMBus device.' + Enabled = False + end + object LabelSMBScan: TLabel + Left = 165 + Top = 20 + Width = 316 + Height = 13 + AutoSize = False + Caption = 'Push button to scan SMBus for devices.' + Enabled = False + end + object Label13: TLabel + Left = 10 + Top = 19 + Width = 37 + Height = 13 + Caption = 'Device:' + Enabled = False + end object ButtonSMBScan: TButton - Left = 8 + Left = 116 Top = 16 - Width = 75 - Height = 17 - Caption = 'Enum SMBus' + Width = 45 + Height = 21 + Caption = 'Scan' Enabled = False TabOrder = 0 OnClick = ButtonSMBScanClick end + object ButtonSMBRead: TButton + Left = 8 + Top = 40 + Width = 75 + Height = 25 + Caption = 'Read' + Enabled = False + Font.Charset = DEFAULT_CHARSET + Font.Color = clWindowText + Font.Height = -11 + Font.Name = 'MS Sans Serif' + Font.Style = [fsBold] + ParentFont = False + TabOrder = 1 + OnClick = ButtonSMBReadClick + end + object ComboSMB: TComboBox + Left = 56 + Top = 16 + Width = 57 + Height = 21 + Enabled = False + ItemHeight = 13 + TabOrder = 2 + Text = '0x57' + Items.Strings = ( + '0x57') + end end end object SheetAbout: TTabSheet diff --git a/AnalyzerU.pas b/AnalyzerU.pas index 9588820..1ec1d7e 100644 --- a/AnalyzerU.pas +++ b/AnalyzerU.pas @@ -55,8 +55,15 @@ type GroupSMBus: TGroupBox; ButtonSMBScan: TButton; Label1: TLabel; + ButtonSMBRead: TButton; + LabelSMBStatus: TLabel; + LabelSMBScan: TLabel; + Label13: TLabel; + ComboSMB: TComboBox; procedure ButtonOpenClick(Sender: TObject); procedure ButtonPCIScanClick(Sender: TObject); + procedure FormCreate(Sender: TObject); + procedure ButtonSMBReadClick(Sender: TObject); procedure ButtonSMBScanClick(Sender: TObject); private { Private declarations } @@ -69,7 +76,7 @@ var implementation -uses SMBus; +uses SMBus, ZLPortIO; var MyPCI: PCI_Info; @@ -221,6 +228,15 @@ begin else AForm.LabelCountry.Caption := '---'; end; +procedure DoAnalysis(d: array of byte); +begin + ShowRAW(d); + CheckPwd(d); + CheckUUID(d); + CheckOEM(d); + CheckMachine(d); +end; + procedure TAForm.ButtonOpenClick(Sender: TObject); var f: file of byte; d: array[0..255] of byte; @@ -231,12 +247,8 @@ begin Reset(f); for i:=0 to 255 do Read(f,d[i]); CloseFile(f); - ShowRAW(d); - CheckPwd(d); - CheckUUID(d); - CheckOEM(d); - CheckMachine(d); - PageControl1.ActivePageIndex := 0; + DoAnalysis(d); + AForm.PageControl1.ActivePageIndex := 0; end; end; @@ -258,9 +270,60 @@ begin end; end; +procedure TAForm.FormCreate(Sender: TObject); +begin + if NOT ZlIOStarted then ShowMessage('The driver ZLPORTIO.SYS could not be loaded. The program won''t be able to read out SMBus under Windows NT/2000/XP! Make sure, the file is in path or in the program directory.'); +end; + +function PowerInt(base, exp: integer): Int64; +begin + if (exp = 0) then Result := 1 else begin + Result := base; + while (exp>1) do begin + Result := Result * base; + Dec(exp); + end; + end; +end; + +function HexToInt(x: string): int64; +const hexset = '0123456789abcdef'; +var i, p: integer; +begin + Result := 0; + if Length(x)<=8 then begin + x := LowerCase(x); + i := Pos('0x', x); + if (i>0) then Delete(x, 1, i+1); + for i:=1 to Length(x) do begin + p := Pos(x[i], hexset)-1; + if (p>0) then Result := Result + p*PowerInt(16, Length(x)-i); + end; + end; +end; + +procedure TAForm.ButtonSMBReadClick(Sender: TObject); +var i: integer; + dev: word; + d: TSMBData; +begin + dev := HexToInt(AForm.ComboSMB.Text); + if dev=$57 then begin + Screen.Cursor := crHourGlass; + for i:=0 to 255 do begin + AForm.LabelSMBStatus.Caption := 'Now reading offset 0x'+IntToHex(i,2)+' ...'; + Application.ProcessMessages; + d[i] := smbGetReg(MyPCI.SMB_Address, i, dev); + end; + Screen.Cursor := crDefault; + end; + DoAnalysis(d); + AForm.PageControl1.ActivePageIndex := 0; +end; + procedure TAForm.ButtonSMBScanClick(Sender: TObject); begin - //asd + AForm.LabelSMBScan.Caption := IntToHex(smbGetReg(MyPCI.SMB_Address, $01, $10), 2); end; end. diff --git a/DLPORTIO.dll b/DLPORTIO.dll deleted file mode 100644 index 9849434db68a63483b9ede802875b0394ddd7a67..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 34816 zcmeHw4SZD9weOx}2t!E7APEMHGSW~{z9yMWKA4$I0wI6~I3dXd1%Z%Em<%CFlQVqS zsG$>Vl4EYUUTf*qXNh1hz2&vMKJI;Jy*eS3fMP{!D^+V_YwfW?MX@0$Fz>(iJ|{DY z)Z6>+eed1(d!Ddo?Y;KeYp=cb+G~HDJ;RE-_OMvSm=PfyX6z^+Jq7&pi$B_sJ!!_% zlh~07FW!9AQ1ar<<-WQWOH*^>=H{xcmg=g8hDO=4$!lp2G+62yEJdrzEL$6Eyz>(i z3~}ry@7$58*EYZ=-8|6{8_$Y?S*>A{0nG>-dD_h5F+y&_ko^2PgHJ7i zY&s$JB2@Yv(uDRLND0-I0L&jR=zvZbyiE3ea8i1sR(=2N_KWsR(NjqMicALi6hc z;rVgM*oQ!EBl@VPfascAnyZ21I)QFD-L@zqL<^|iW^a8X2oJ;q5keq2TM?q30>&0a zCBKaRC(=OBWo?4}1yX%kfIdp7f55od9pauq9(R-m$*~0H>7l&fut}a095&07g2NUW z$pU$zEi|};Qw@GC=*lH-@_3Q1vJH8BZ7A=L^>}=MZN3A@52q~aAy(nQf;_tuh`?9; zW?u&)z57GDK4_rkjR`sa?n?5*ZV(JeCa$>Cl443djLO&cuOF4w} zsP{$Kn-w`d0raNJ7aF*5YL&<&*`hLQ8%6HoYZm3170S6?=Q^NUPdKFrdi?=)k#b&6 z>Mp+GG~95i?d{=UuX%8D|B~T0WOXmOEcvFf80Kfblhj*qux;U#T$JoyGThz011gkC z{gnL-^<&_2I0b%CM4X8DjsPv_O4Us>84Dga1&4V>1Hs+`Wr?ZNq^wBb-P@V5Uirh_ zX#D9>52*x2l6IeiKtk%EE8%M}y8X%c4CFgw1Cx0>^^h35L-);D7Ic-MPPU&AfpO|1D5CCyD_1Y0PtXaZlg(>UOQ#)>422{Wubfu96$?1wK6_MbF#ypPMK1CTXgdRa{ zd*7Ev(k7F%wY++hFP$(J!juaPG&(`eMI4>h*FTQSgcJm-fh2^~6{A6aqFN`0ipW9w zRCL-?$(<)$l;i5QBqdIh>V(m8b^Avf*7teTF6cj;vV%rOIVm60fYBCO-{+Sx4DZEK z2#QwD?;et^o*p8AR%8%^(F~8ef{Seor!)c88OIH|zt~9Le0?8rQP+Y!F9*glO&G19 z>>o#*h-z$msQ>y4q+uCE1=Oi*G=--!oYDaf%6VOwc1jJy_?L2tU*N4b5k{UP2%zWOS!Ov@qV)^UEx_!b{p~Rhk8y2U0hO6Qv2UR7MO==_fX(Eoh`4M zbW^7kr$ZwXB=v_v`%3X_k$zN9TSZ#Y)43x3bv<1m(p&U&kw~uFV*X)OlPB9_$tD#{^Rgy<Zr@V@oWCWE06 z(>Xw5u47!9GusD(uzt?< z{vTs4!eh3f-S6L5q{NbuW(|!u$O|CuUWkiI(v=g+&w~Sh48A?1cR059?HFYbHBO1` zPB<0&e5ax7`i@d#@zP+Q(ec6k&)9}+VdX|5hJ;h8Y%cno!*Qbm<#SB%tnBcJ6u=LCmi0ˡz+kdXvQ!jY8s5^2qQk*p!B7| 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 0 do begin Application.ProcessMessages; - Status := DlPortReadPortUchar(BaseAddr); + //Status := DlPortReadPortUchar(BaseAddr); + Status := PortReadB(BaseAddr); + end; + if (Status and $1e) <> 0 then begin + //DlPortWritePortUchar(BaseAddr, Status); + PortWriteB(BaseAddr, Status); end; - if (Status and $1e) <> 0 then - DlPortWritePortUchar(BaseAddr, Status); end; procedure smbWaitForEnd(BaseAddr: word); var Status: byte; begin - Status := DlPortReadPortUchar(BaseAddr); + //Status := DlPortReadPortUchar(BaseAddr); + Status := PortReadB(BaseAddr); while (Status and 1) = 1 do begin Application.ProcessMessages; - Status := DlPortReadPortUchar(BaseAddr); + //Status := DlPortReadPortUchar(BaseAddr); + Status := PortReadB(BaseAddr); end; end; @@ -163,14 +183,18 @@ var Dump1: word; begin smbWaitForFree(BaseAddr); - DlPortWritePortUchar(BaseAddr + 3, CMD); - DlPortWritePortUchar(BaseAddr + 4, (Slave shl 1) or RW); - DlPortWritePortUchar(BaseAddr + 2, $48); - sleep(1); - Application.ProcessMessages; +// DlPortWritePortUchar(BaseAddr + 3, CMD); +// DlPortWritePortUchar(BaseAddr + 4, (Slave shl 1) or RW); +// DlPortWritePortUchar(BaseAddr + 2, $48); + PortWriteB(BaseAddr + 3, CMD); + PortWriteB(BaseAddr + 4, (Slave shl 1) or RW); + PortWriteB(BaseAddr + 2, $48); + Sleep(1); smbWaitForEnd(BaseAddr); - Dump1 := ( DlPortReadPortUchar(BaseAddr + 6) shl 8); - Dump1 := Dump1 or DlPortReadPortUchar(BaseAddr + 5); +// Dump1 := ( DlPortReadPortUchar(BaseAddr + 6) shl 8); +// Dump1 := Dump1 or DlPortReadPortUchar(BaseAddr + 5); + Dump1 := ( PortReadB(BaseAddr + 6) shl 8); + Dump1 := Dump1 or PortReadB(BaseAddr + 5); Result := Dump1; end; @@ -179,12 +203,34 @@ var Data: cardinal; begin smbWaitForFree(BaseAddr); - DlPortWritePortUchar(BaseAddr + 5, 0); - DlPortWritePortUchar(BaseAddr + 6, 0); +// DlPortWritePortUchar(BaseAddr + 5, 0); +// DlPortWritePortUchar(BaseAddr + 6, 0); + PortWriteB(BaseAddr + 5, 0); + PortWriteB(BaseAddr + 6, 0); Data := smbCallBus(BaseAddr, Reg, Slave, RW_READ); Result := (Data and $ff); end; +function smbGetArray(BaseAddr: word; Reg: byte; Slave: byte; len: byte): TSMBData; +var Data: cardinal; + i: byte; +begin + smbWaitForFree(BaseAddr); + PortWriteB(BaseAddr + 5, 0); + PortWriteB(BaseAddr + 6, 0); + for i:=reg to reg+len-1 do begin + smbWaitForFree(BaseAddr); + PortWriteB(BaseAddr + 3, i); + PortWriteB(BaseAddr + 4, (Slave shl 1) or RW_READ); + PortWriteB(BaseAddr + 2, $48); + Sleep(1); + smbWaitForEnd(BaseAddr); + Data := ( PortReadB(BaseAddr + 6) shl 8); + Data := Data or PortReadB(BaseAddr + 5); + Result[i] := Data AND $FF; + end; +end; + function smbGetAddress(BaseAddr: word): string; var Data: word; @@ -194,8 +240,10 @@ begin Cheque := ''; for idx := $20 to $4F do begin smbWaitForFree(BaseAddr); - DlPortWritePortUchar(BaseAddr + 5, 0); - DlPortWritePortUchar(BaseAddr + 6, 0); +// DlPortWritePortUchar(BaseAddr + 5, 0); +// DlPortWritePortUchar(BaseAddr + 6, 0); + PortWriteB(BaseAddr + 5, 0); + PortWriteB(BaseAddr + 6, 0); Data := smbCallBus(BaseAddr, 0, idx, RW_READ); if (Data and $FF) <> 0 then begin Cheque := Cheque + IntToHex(idx,2); diff --git a/ddkint.pas b/ddkint.pas new file mode 100644 index 0000000..d5b36be --- /dev/null +++ b/ddkint.pas @@ -0,0 +1,251 @@ +{ -----------------------------------------------------------------------------} +{ Copyright 2000-2001, Zloba Alexander. All Rights Reserved. } +{ This unit can be freely used and distributed in commercial and private } +{ environments, provided this notice is not modified in any way. } +{ -----------------------------------------------------------------------------} +{ Feel free to contact me if you have any questions, comments or suggestions at} +{ zal@specosoft.com (Zloba Alexander) } +{ You can always find the latest version of this unit at: } +{ http://www.specosoft.com } + +{ -----------------------------------------------------------------------------} +{ Date last modified: 08/10/2001 } +{ -----------------------------------------------------------------------------} +{ Description: } +{ This unit include service function to work with NT drivers and some } +{ constant from ntddk.h } +{------------------------------------------------------------------------------} +{ Revision History: } +{ 1.00: + First public release } +{ 1.10: + added compiler directives for correct compilation } +{ 1.20: + optimized code } +{ 1.30: + added constant for compatibility with delphi 3.0 } +{------------------------------------------------------------------------------} + +{$A-,H-} +unit ddkint; + +interface +uses windows,winsvc; + +function CTL_CODE(const DeviceType,Func,Method,Access:Cardinal):cardinal; + +const + FILE_DEVICE_BEEP = $00000001; + FILE_DEVICE_CD_ROM = $00000002; + FILE_DEVICE_CD_ROM_FILE_SYSTEM = $00000003; + FILE_DEVICE_CONTROLLER = $00000004; + FILE_DEVICE_DATALINK = $00000005; + FILE_DEVICE_DFS = $00000006; + FILE_DEVICE_DISK = $00000007; + FILE_DEVICE_DISK_FILE_SYSTEM = $00000008; + FILE_DEVICE_FILE_SYSTEM = $00000009; + FILE_DEVICE_INPORT_PORT = $0000000a; + FILE_DEVICE_KEYBOARD = $0000000b; + FILE_DEVICE_MAILSLOT = $0000000c; + FILE_DEVICE_MIDI_IN = $0000000d; + FILE_DEVICE_MIDI_OUT = $0000000e; + FILE_DEVICE_MOUSE = $0000000f; + FILE_DEVICE_MULTI_UNC_PROVIDER = $00000010; + FILE_DEVICE_NAMED_PIPE = $00000011; + FILE_DEVICE_NETWORK = $00000012; + FILE_DEVICE_NETWORK_BROWSER = $00000013; + FILE_DEVICE_NETWORK_FILE_SYSTEM= $00000014; + FILE_DEVICE_NULL = $00000015; + FILE_DEVICE_PARALLEL_PORT = $00000016; + FILE_DEVICE_PHYSICAL_NETCARD = $00000017; + FILE_DEVICE_PRINTER = $00000018; + FILE_DEVICE_SCANNER = $00000019; + FILE_DEVICE_SERIAL_MOUSE_PORT = $0000001a; + FILE_DEVICE_SERIAL_PORT = $0000001b; + FILE_DEVICE_SCREEN = $0000001c; + FILE_DEVICE_SOUND = $0000001d; + FILE_DEVICE_STREAMS = $0000001e; + FILE_DEVICE_TAPE = $0000001f; + FILE_DEVICE_TAPE_FILE_SYSTEM = $00000020; + FILE_DEVICE_TRANSPORT = $00000021; + FILE_DEVICE_UNKNOWN = $00000022; + FILE_DEVICE_VIDEO = $00000023; + FILE_DEVICE_VIRTUAL_DISK = $00000024; + FILE_DEVICE_WAVE_IN = $00000025; + FILE_DEVICE_WAVE_OUT = $00000026; + FILE_DEVICE_8042_PORT = $00000027; + FILE_DEVICE_NETWORK_REDIRECTOR = $00000028; + FILE_DEVICE_BATTERY = $00000029; + FILE_DEVICE_BUS_EXTENDER = $0000002a; + FILE_DEVICE_MODEM = $0000002b; + FILE_DEVICE_VDM = $0000002c; + FILE_DEVICE_MASS_STORAGE = $0000002d; + FILE_DEVICE_SMB = $0000002e; + FILE_DEVICE_KS = $0000002f; + FILE_DEVICE_CHANGER = $00000030; + FILE_DEVICE_SMARTCARD = $00000031; + FILE_DEVICE_ACPI = $00000032; + FILE_DEVICE_DVD = $00000033; + FILE_DEVICE_FULLSCREEN_VIDEO = $00000034; + FILE_DEVICE_DFS_FILE_SYSTEM = $00000035; + FILE_DEVICE_DFS_VOLUME = $00000036; + FILE_DEVICE_SERENUM = $00000037; + FILE_DEVICE_TERMSRV = $00000038; + FILE_DEVICE_KSEC = $00000039; + + FILE_DEVICE_KRNLDRVR = $80ff; + + METHOD_BUFFERED = 0; + METHOD_IN_DIRECT = 1; + METHOD_OUT_DIRECT = 2; + METHOD_NEITHER = 3; + + FILE_ANY_ACCESS = 0; + FILE_SPECIAL_ACCESS = (FILE_ANY_ACCESS); + FILE_READ_ACCESS = ( $0001 ); // file & pipe + FILE_WRITE_ACCESS = ( $0002 ); // file & pipe + + {$IFDEF VER100 or VER110} + // for compatibilty with delphi 3.0 +const + SERVICE_KERNEL_DRIVER = $00000001; + SERVICE_DEMAND_START = $00000003; + SERVICE_ERROR_NORMAL = $00000001; + +{$ENDIF} + +function driverstart(const name:pchar):integer; +function driverstop(const name:pchar):integer; + +// for this function must have Administrators or Power users rigths +function driverinstall(const path,name:pchar):integer; +function driverremove(const name:pchar):integer; + + +// exlpanation function +function messagestring(const error:integer):string; + +implementation + +function CTL_CODE(const DeviceType,Func,Method,Access:Cardinal):cardinal; +begin + Result := DeviceType shl 16 or Access shl 14 or Func shl 2 or Method; +end; + + +function driverinstall(const path,name:pchar):integer; +var hService: SC_HANDLE; + hSCMan : SC_HANDLE; +begin + + Result := 0; + + hSCMan := OpenSCManager(nil, nil, SC_MANAGER_ALL_ACCESS); + if hSCMan = 0 then begin + result := getlasterror; + exit; + end; + + hService := CreateService(hSCMan, name,name, + SERVICE_ALL_ACCESS, SERVICE_KERNEL_DRIVER, SERVICE_DEMAND_START, + SERVICE_ERROR_NORMAL, path, + nil, nil, nil, nil, nil); + + if (hService = 0) then begin + result := getlasterror; + CloseServiceHandle(hSCMan); + exit; + end + else + CloseServiceHandle(hService); + CloseServiceHandle(hSCMan); +end; + +function driverstart(const name:pchar):integer; +var + hService: SC_HANDLE; + hSCMan : SC_HANDLE; + args:pchar; +begin + + hSCMan := OpenSCManager(nil, nil, SC_MANAGER_CONNECT); + if hSCMan = 0 then begin + result := getlasterror; + exit; + end; + + // get a handle to the service + hService := OpenService(hSCMan, name, SERVICE_START); + if hService <> 0 then Begin + // start the driver + args := nil; + Result := 0; + if integer(StartService(hService, 0, args ))=0 then + result := getlasterror; + CloseServiceHandle(hService); + end + else + result := getlasterror; + CloseServiceHandle(hSCMan); +end; + +function driverstop(const name:pchar):integer; +Var + serviceStatus: TServiceStatus; + hService: SC_HANDLE; + hSCMan : SC_HANDLE; +begin + + hSCMan := OpenSCManager(nil, nil, SC_MANAGER_CONNECT); + if hSCMan = 0 then begin + result := getlasterror; + exit; + end; + + // get a handle to the service + hService := OpenService(hSCMan, Name, SERVICE_STOP); + if hService <> 0 then Begin + // start the driver + Result := 0; + if integer(ControlService(hService, SERVICE_CONTROL_STOP, serviceStatus))=0 then + result := getlasterror; + CloseServiceHandle(hService); + end + else + result := getlasterror; + CloseServiceHandle(hSCMan); +end; + +function driverremove(const name:pchar):integer; +Var + hService: SC_HANDLE; + hSCMan : SC_HANDLE; +begin + + hSCMan := OpenSCManager(nil, nil, SC_MANAGER_ALL_ACCESS); + if hSCMan = 0 then begin + result := getlasterror; + exit; + end; + + // get a handle to the service + hService := OpenService(hSCMan, Name, SERVICE_ALL_ACCESS); + if hService <> 0 then Begin + // remove driver description from the registry + Result := 0; + if integer(DeleteService(hService)) = 0 then + result := getlasterror; + CloseServiceHandle(hService); + end + else + result := getlasterror; + CloseServiceHandle(hSCMan); +end; + +function messagestring(const error:integer):string; +var p:pchar; +begin + GetMem(p, 200); + FillChar(p^, 200, 0); + formatmessage(FORMAT_MESSAGE_FROM_SYSTEM,nil,error,0,p,199,nil); + Result := p; + freemem(p,200); +end; + +end. diff --git a/zlportio.pas b/zlportio.pas new file mode 100644 index 0000000..5a87be8 --- /dev/null +++ b/zlportio.pas @@ -0,0 +1,283 @@ +{ -----------------------------------------------------------------------------} +{ Copyright 2000-2001, Zloba Alexander. All Rights Reserved. } +{ This unit can be freely used and distributed in commercial and private } +{ environments, provided this notice is not modified in any way. } +{ -----------------------------------------------------------------------------} +{ Feel free to contact me if you have any questions, comments or suggestions at} +{ zal@specosoft.com (Zloba Alexander) } +{ You can always find the latest version of this unit at: } +{ http://www.specosoft.com } + +{ -----------------------------------------------------------------------------} +{ Date last modified: 08/10/2001 } +{ -----------------------------------------------------------------------------} +{ ZLPortIO driver interface unit v1.20 } +{ -----------------------------------------------------------------------------} +{ Description: } +{ This unit allow your application direct access port input and output under } +{ all versions of Microsoft Windows® } +{ Depends: } +{ zlportio.sys ddkint.pas } +{ You must distribute zlportio.sys with your application } +{ Procedures and functions: } +{ procedure zlioportread( const Port,DataType:dword ):dword; } +{ procedure zlioportwrite( const Port,DataType,Data:dword ); } +{ } +{ function portreadb( const Port:dword ):byte; } +{ function portreadw( const Port:dword ):word; } +{ function portreadl( const Port:dword ):dword; } +{ } +{ procedure portwriteb( const Port:Dword;const Data:byte ); } +{ procedure portwritew( const Port:dword;const Data:word ); } +{ procedure portwritel( const Port,Data:dword ); } +{ } +{ Examples: } +{ // get data bits from LPT port } +{ databits := portreadb( $378 ) } +{ // set data bits from LPT port } +{ portwriteb( $378, databits ) } +{ // The second parameter determine the databus length for operation } +{ -----------------------------------------------------------------------------} +{ Revision History: } +{ 1.00: + First public release } +{ 1.10: + Added new functions (portreadX,portwriteX) for convenience of usage } +{ 1.20: + Added new function (zliosetiopm) for enabling direct access to ports} +{ 1.30: + added compiler directives for correct compilation } +{ 1.40: + added opportunity to run multiply instances client to driver } +{ 1.50: - fixed bug with work under win98 } +{------------------------------------------------------------------------------} + +{$A-,H-} +unit zlportio; + +interface + +uses windows,sysutils,ddkint; + +Const + ZLIO_BYTE = 0; + ZLIO_WORD = 1; + ZLIO_DWORD = 2; + +var + +// if TRUE then driver was started +// in other case something wrong +// We start driver in initialization section of unit. + + ZlIOStarted:boolean = false; + +// if TRUE then we can use asm IN,OUT under NT/2000 +// see zliosetiopm for more details + ZlIODirect:boolean = false; + +// handle to opened driver + + HZLIO:THandle; + + +function portreadb( const Port:dword ):byte; +function portreadw( const Port:dword ):word; +function portreadl( const Port:dword ):dword; + +procedure portwriteb( const Port:Dword;const Data:byte ); +procedure portwritew( const Port:dword;const Data:word ); +procedure portwritel( const Port,Data:dword ); + + +procedure zlioportwrite( const Port,DataType,Data:dword ); +function zlioportread( const Port,DataType:dword ):dword; + +// if you need the best perfomance for your IO operations +// call zliosetiopm(TRUE). This allow your application +// to use asm command IN,OUT directly in your code. + +procedure zliosetiopm( const Direct:boolean ); + +// internal + +function zliostart:boolean; +procedure zliostop; + + +implementation + +const + ZLIODriverName='zlportio'; + +var + IOCTL_ZLUNI_PORT_READ:cardinal; + IOCTL_ZLUNI_PORT_WRITE:cardinal; + IOCTL_ZLUNI_IOPM_ON:cardinal; + IOCTL_ZLUNI_IOPM_OFF:cardinal; + +type +TzlIOData = record + Port,DataType,Data:dword; +end; + + +procedure zlioportwrite( const Port,DataType,Data:dword ); +var resdata:TZLIOData; + cBR:cardinal; +begin + if (not ZLIODirect) then begin + resdata.Port := Port; + resdata.Data := Data; + resdata.DataType := DataType; + if ZLIOStarted then + DeviceIoControl(HZLIO,IOCTL_ZLUNI_PORT_WRITE,@resdata,sizeof(resdata),nil,0,cBR,nil ); + end + else begin + Case DataType of + ZLIO_BYTE : asm mov edx,Port;mov eax,data;out dx,al; end; + ZLIO_WORD : asm mov edx,Port;mov eax,data;out dx,ax; end; + ZLIO_DWORD: asm mov edx,Port;mov eax,data;out dx,eax; end; + end; + end; +end; + +function zlioportread(const Port,DataType:dword):dword; +var resdata:TZLIOData; + cBR:cardinal;i:dword; +begin + if (not ZLIODirect) then begin + resdata.Port := Port; + resdata.DataType := DataType; + if ZLIOStarted then + DeviceIoControl(HZLIO,IOCTL_ZLUNI_PORT_READ,@resdata,sizeof(resdata),@i,sizeof(dword),cBR,nil ); + end + else begin + Case DataType of + ZLIO_BYTE : asm mov edx,Port;xor eax,eax;in al,dx;mov i,eax; end; + ZLIO_WORD : asm mov edx,Port;xor eax,eax;in ax,dx;mov i,eax; end; + ZLIO_DWORD: asm mov edx,Port;xor eax,eax;in eax,dx;mov i,eax end; + end; + end; + result := i; +end; + +function portreadb( const Port:dword ):byte; +begin + Result := zlioportread(Port,ZLIO_BYTE); +end; + +function portreadw( const Port:dword ):word; +begin + Result := zlioportread(Port,ZLIO_WORD); +end; + +function portreadl( const Port:dword ):dword; +begin + Result := zlioportread(Port,ZLIO_DWORD); +end; + +procedure portwriteb( const Port:Dword;const Data:byte ); +begin + zlioportwrite(Port,ZLIO_BYTE,Data); +end; + +procedure portwritew( const Port:dword;const Data:word ); +begin + zlioportwrite(Port,ZLIO_WORD,Data); +end; + +procedure portwritel( const Port,Data:dword ); +begin + zlioportwrite(Port,ZLIO_DWORD,Data); +end; + +procedure zliosetiopm( const Direct:boolean ); +var cBR:cardinal; +begin + if Win32Platform=VER_PLATFORM_WIN32_NT then + if ZLIOStarted then begin + if Direct then + DeviceIoControl(HZLIO,IOCTL_ZLUNI_IOPM_ON,nil,0,nil,0,cBR,nil ) + else + DeviceIoControl(HZLIO,IOCTL_ZLUNI_IOPM_OFF,nil,0,nil,0,cBR,nil ); + ZLIODirect := Direct; + end +end; + + + + +function zliostart; +var dir:shortstring; +begin + if Win32Platform<>VER_PLATFORM_WIN32_NT then begin + result := true; + exit; + end; +// Result := false; + zliostop; + dir := ExtractFileDir(ParamStr(0))+'\'+ZLIODriverName+'.sys'#0; + driverinstall(pchar(@dir[1]),ZLIODriverName+#0); + Result := driverstart(ZLIODriverName) = 0; +end; + +procedure zliostop; +begin + if Win32Platform<>VER_PLATFORM_WIN32_NT then + exit; + driverstop(ZLIODriverName); + driverremove(ZLIODriverName); +end; + +function zlioopen( var Handle:thandle):boolean; +var cERR:integer; + s:string; +begin + if Win32Platform<>VER_PLATFORM_WIN32_NT then begin + result := true; + exit; + end; + Result := false; + Handle := THandle(-1); + Handle := createFile('\\.\ZLPORTIO', + GENERIC_READ or GENERIC_WRITE, + 0, + nil, + OPEN_EXISTING, + FILE_ATTRIBUTE_NORMAL, + 0 ); + cERR := getlasterror; + s := messagestring( cerr); + if (cERR = ERROR_ALREADY_EXISTS)or(cERR = ERROR_SUCCESS) then Result := True; +end; + +procedure zlioclose( const Handle:thandle); +begin + if (Win32Platform=VER_PLATFORM_WIN32_NT) then + closehandle(Handle); +end; + + +initialization + +IOCTL_ZLUNI_PORT_READ := CTL_CODE(FILE_DEVICE_KRNLDRVR, 1, METHOD_BUFFERED, FILE_ANY_ACCESS); +IOCTL_ZLUNI_PORT_WRITE := CTL_CODE(FILE_DEVICE_KRNLDRVR, 2, METHOD_BUFFERED, FILE_ANY_ACCESS); +IOCTL_ZLUNI_IOPM_ON := CTL_CODE(FILE_DEVICE_KRNLDRVR, 3, METHOD_BUFFERED, FILE_ANY_ACCESS); +IOCTL_ZLUNI_IOPM_OFF := CTL_CODE(FILE_DEVICE_KRNLDRVR, 4, METHOD_BUFFERED, FILE_ANY_ACCESS); + + if Win32Platform<>VER_PLATFORM_WIN32_NT then begin + zliostarted := true; + zliodirect := true; + end + else begin + if not zlioopen(HZLIO) then begin + if zliostart then + ZLIOStarted := zlioopen(HZLIO) or (Win32Platform<>VER_PLATFORM_WIN32_NT); + end + else + ZLIOStarted := true; + end; +finalization + +if ZLIOStarted then + zliostop; + + + +end. diff --git a/zlportio.sys b/zlportio.sys new file mode 100644 index 0000000000000000000000000000000000000000..a897a02004da389af64fd2428190cc62ec7223d5 GIT binary patch literal 4016 zcmds4drVvB6+Z^kIKe!og(+2>)k%qpw8%?h*G)sWnZkAL6oZ3#DGMczxqykWz3XcV zRhlLv*>bsxI#um9O?#wTwXIsFMO(I26V;p&6{3-hCbUbntV0vh9Dz2}HvEIJl-_HA0P@aLv{)HyMT7UmjP9P_W*YR`6IVSkTR8L7FSb8~13m1kuaf%^#`n37bD~zZJpM zrd3RVtseU^`%i8d7fjznPwiLdie6^PS&ONr`cKFI{b+~j_yJW|8h7v8Wi-&Z+tsY2 z_^6H?gFwR`OF6>$5#Fy=q~I0-U;|s#Q>7T5-KY&1wTdg4Pz6)xQ(wLMhKVNCx=N#3 zUuoKVLv>Y+yWodtIJgC1A+2Ht%Jx)F4?3PIdrGO%EtHxqN{uC72Yoqs@SL#N8`rC^ z;O>A$HWQ%qg3hF5b1xSU;cO-oEuPKl>KjIy)O-6FdYd%2sqQ1H$9(DoBWWkgPER4V zQy-XgTG45t+)j^i_zuZCymGlW`8O?Y(spYV=dr$X zH@eZ_gUr6d?AS<_`x$e;=`(gdI%t$!D=xNq z#l1DF4Q9oloUo`Tw*1PZUe9bsbv(PdwVk)2tL?mnXZ|=$btKXNg((Dlm=57K_ERG@ zQ8Rggd9Y55600;5pMoy?Uew=HOc7P$jvK}0b30G=6Ug}9UvGSxcju1`Pm1<^&VVR; zV>O|Wm`M17ar!|<>Wx93k@}?=PttyaH}-@m*Cr)NjLJFbPDty-h$xG7;y^eg5^aa1 zRuY4<7#Qk58jFNO_2K9--0=mz{+bA09hhl|MQekhUa`w3_Q#|l+PZ9$^U_t=BuBi_ zu-p<2hwz0Fkfm_6hv+3}cGt%G;~cU{{8~~>;AQzG_;yR;J$@fr&Te%sQ8|`4CPgDQ zaS$1|Qj<_q*XeI;YVK^Q_0%*`d%h&#!30rTzO25n;R)=AwkB`0kZ(v&t&(L-J66eb zQ}Wc*+qxo=^%i-R%)nnMv?cSJ&6_dk-!Qw^krQ5m9%x!O5xvMSy*1;-LI)(R6rfH# z1?>BPzV92rd#Qok*)#CE@n8SVd?{sOG0i9GD_MU=1Y-C3uj2QyZw>G#B4Q4C*?VMzlDz zL$C_~x?x4MpEklK7n{#}0veoC9P?r5McI^|L2hwyQdY_`Cl%+}w!&6|^@`0N+C^4m zyz<<`X0%t2$#u%QO%yps@-kg7mYY6z`MMbIkRLIqv+ueX+rQDC@(j$MWkw24KO} zK2Aww96>~ax6dL5&&R+g(RVqo3+t_yb=`H?udl;uKWkUxqt+smV{T`J^(ymoJV5s& z$NaSt^p!kNx5E;siFcSy-*5e>7T>P`15Oh6IoHXR-Htn+4UnqpP1n@p8JMQ3?&Xf6N$$p zIUKWf9ql0qKCz?!6U91Qa{5PPwjTa}^N*nUU(f<7ySWRi_fU3@U)#;#AI#$i!PkO^ U8TLuh)F}9RDDu5tK<1nO1MA;B9{>OV literal 0 HcmV?d00001