commit c9160d9591c42a028a4d6d803497c5103de5aed7
Author: mbirth <mbirth>
Date:   Wed Dec 8 09:47:52 2004 +0000

    Initial Revision

diff --git a/Analyzer.cfg b/Analyzer.cfg
new file mode 100644
index 0000000..5e8598d
--- /dev/null
+++ b/Analyzer.cfg
@@ -0,0 +1,38 @@
+-$A8
+-$B-
+-$C+
+-$D+
+-$E-
+-$F-
+-$G+
+-$H+
+-$I+
+-$J-
+-$K-
+-$L+
+-$M-
+-$N+
+-$O+
+-$P+
+-$Q-
+-$R-
+-$S-
+-$T-
+-$U-
+-$V+
+-$W-
+-$X+
+-$Y+
+-$Z1
+-cg
+-AWinTypes=Windows;WinProcs=Windows;DbiTypes=BDE;DbiProcs=BDE;DbiErrs=BDE;
+-H+
+-W+
+-M
+-$M16384,1048576
+-K$00400000
+-LE"c:\program files\borland\delphi7\Projects\Bpl"
+-LN"c:\program files\borland\delphi7\Projects\Bpl"
+-w-UNSAFE_TYPE
+-w-UNSAFE_CODE
+-w-UNSAFE_CAST
diff --git a/Analyzer.dof b/Analyzer.dof
new file mode 100644
index 0000000..57f19d0
--- /dev/null
+++ b/Analyzer.dof
@@ -0,0 +1,139 @@
+[FileVersion]
+Version=7.0
+[Compiler]
+A=8
+B=0
+C=1
+D=1
+E=0
+F=0
+G=1
+H=1
+I=1
+J=0
+K=0
+L=1
+M=0
+N=1
+O=1
+P=1
+Q=0
+R=0
+S=0
+T=0
+U=0
+V=1
+W=0
+X=1
+Y=2
+Z=1
+ShowHints=1
+ShowWarnings=1
+UnitAliases=WinTypes=Windows;WinProcs=Windows;DbiTypes=BDE;DbiProcs=BDE;DbiErrs=BDE;
+NamespacePrefix=
+SymbolDeprecated=1
+SymbolLibrary=1
+SymbolPlatform=1
+UnitLibrary=1
+UnitPlatform=1
+UnitDeprecated=1
+HResultCompat=1
+HidingMember=1
+HiddenVirtual=1
+Garbage=1
+BoundsError=1
+ZeroNilCompat=1
+StringConstTruncated=1
+ForLoopVarVarPar=1
+TypedConstVarPar=1
+AsgToTypedConst=1
+CaseLabelRange=1
+ForVariable=1
+ConstructingAbstract=1
+ComparisonFalse=1
+ComparisonTrue=1
+ComparingSignedUnsigned=1
+CombiningSignedUnsigned=1
+UnsupportedConstruct=1
+FileOpen=1
+FileOpenUnitSrc=1
+BadGlobalSymbol=1
+DuplicateConstructorDestructor=1
+InvalidDirective=1
+PackageNoLink=1
+PackageThreadVar=1
+ImplicitImport=1
+HPPEMITIgnored=1
+NoRetVal=1
+UseBeforeDef=1
+ForLoopVarUndef=1
+UnitNameMismatch=1
+NoCFGFileFound=1
+MessageDirective=1
+ImplicitVariants=1
+UnicodeToLocale=1
+LocaleToUnicode=1
+ImagebaseMultiple=1
+SuspiciousTypecast=1
+PrivatePropAccessor=1
+UnsafeType=0
+UnsafeCode=0
+UnsafeCast=0
+[Linker]
+MapFile=0
+OutputObjs=0
+ConsoleApp=1
+DebugInfo=0
+RemoteSymbols=0
+MinStackSize=16384
+MaxStackSize=1048576
+ImageBase=4194304
+ExeDescription=SONY VAIO 0x57 Analyzer
+[Directories]
+OutputDir=
+UnitOutputDir=
+PackageDLLOutputDir=
+PackageDCPOutputDir=
+SearchPath=
+Packages=vcl;dclOfficeXP;vcldb;rtl;vclx;indy;inet;xmlrtl;vclie;inetdbbde;inetdbxpress;dbrtl;dsnap;dsnapcon;soaprtl;VclSmp;dbexpress;dbxcds;inetdb;bdertl;vcldbx;webdsnap;websnap;ibxpress;teeui;teedb;tee;dss;visualclx;visualdbclx;vclshlctrls;IntrawebDB_50_70;Intraweb_50_70;Rave50CLX;Rave50VCL;vclactnband;dclusr;adortl
+Conditionals=
+DebugSourceDirs=
+UsePackages=0
+[Parameters]
+RunParams=
+HostApplication=
+Launcher=
+UseLauncher=0
+DebugCWD=
+[Language]
+ActiveLang=
+ProjectLang=
+RootDir=C:\Program Files\Borland\Delphi7\Bin\
+[Version Info]
+IncludeVerInfo=1
+AutoIncBuild=1
+MajorVer=1
+MinorVer=0
+Release=0
+Build=2
+Debug=0
+PreRelease=0
+Special=0
+Private=0
+DLL=0
+Locale=1033
+CodePage=1252
+[Version Info Keys]
+CompanyName=
+FileDescription=Parses SONY VAIO security eeprom dump and extracts some interesting information.
+FileVersion=1.0.0.2
+InternalName=Analyzer
+LegalCopyright=
+LegalTrademarks=
+OriginalFilename=Analyzer.exe
+ProductName=SONY VAIO 0x57 Analyzer
+ProductVersion=1.0.0.0
+Comments=
+[HistoryLists\hlUnitAliases]
+Count=1
+Item0=WinTypes=Windows;WinProcs=Windows;DbiTypes=BDE;DbiProcs=BDE;DbiErrs=BDE;
diff --git a/Analyzer.dpr b/Analyzer.dpr
new file mode 100644
index 0000000..24dd4cc
--- /dev/null
+++ b/Analyzer.dpr
@@ -0,0 +1,14 @@
+program Analyzer;
+
+uses
+  Forms,
+  AnalyzerU in 'AnalyzerU.pas' {AForm};
+
+{$R *.res}
+
+begin
+  Application.Initialize;
+  Application.Title := 'SONY VAIO 0x57 Analyzer';
+  Application.CreateForm(TAForm, AForm);
+  Application.Run;
+end.
diff --git a/AnalyzerU.dfm b/AnalyzerU.dfm
new file mode 100644
index 0000000..e26f411
--- /dev/null
+++ b/AnalyzerU.dfm
@@ -0,0 +1,558 @@
+object AForm: TAForm
+  Left = 192
+  Top = 107
+  Width = 517
+  Height = 407
+  Caption = 'SONY VAIO 0x57 Analyzer'
+  Color = clBtnFace
+  Font.Charset = DEFAULT_CHARSET
+  Font.Color = clWindowText
+  Font.Height = -11
+  Font.Name = 'MS Sans Serif'
+  Font.Style = []
+  OldCreateOrder = False
+  PixelsPerInch = 96
+  TextHeight = 13
+  object LabelHeading: TLabel
+    Left = 8
+    Top = 8
+    Width = 321
+    Height = 29
+    Caption = 'SONY VAIO 0x57 Analyzer'
+    Font.Charset = DEFAULT_CHARSET
+    Font.Color = clBlue
+    Font.Height = -24
+    Font.Name = 'MS Sans Serif'
+    Font.Style = [fsBold, fsItalic]
+    ParentFont = False
+    Transparent = True
+  end
+  object ButtonOpen: TButton
+    Left = 368
+    Top = 8
+    Width = 129
+    Height = 25
+    Caption = 'Open dump...'
+    TabOrder = 0
+    OnClick = ButtonOpenClick
+  end
+  object PageControl1: TPageControl
+    Left = 8
+    Top = 48
+    Width = 497
+    Height = 329
+    ActivePage = SheetSMBus
+    TabOrder = 1
+    object SheetParsed: TTabSheet
+      Caption = 'Parsed info'
+      object GroupBox1: TGroupBox
+        Left = 8
+        Top = 0
+        Width = 417
+        Height = 89
+        Caption = 'Password'
+        TabOrder = 0
+        object Label3: TLabel
+          Left = 9
+          Top = 28
+          Width = 79
+          Height = 13
+          Caption = 'Encrypted bytes:'
+        end
+        object Label4: TLabel
+          Left = 37
+          Top = 51
+          Width = 49
+          Height = 13
+          Caption = 'Password:'
+        end
+        object LabelPwdAsk: TLabel
+          Left = 8
+          Top = 72
+          Width = 401
+          Height = 13
+          Alignment = taCenter
+          AutoSize = False
+          Caption = 'Ask for password at startup'
+          Enabled = False
+        end
+        object LabelPwdSetM: TLabel
+          Left = 88
+          Top = 11
+          Width = 153
+          Height = 13
+          Alignment = taCenter
+          AutoSize = False
+          Caption = 'Machine password'
+          Enabled = False
+        end
+        object LabelPwdSetU: TLabel
+          Left = 256
+          Top = 11
+          Width = 153
+          Height = 13
+          Alignment = taCenter
+          AutoSize = False
+          Caption = 'User password'
+          Enabled = False
+        end
+        object EditPwdEncM: TEdit
+          Left = 88
+          Top = 24
+          Width = 153
+          Height = 22
+          Enabled = False
+          Font.Charset = DEFAULT_CHARSET
+          Font.Color = clWindowText
+          Font.Height = -11
+          Font.Name = 'Courier New'
+          Font.Style = []
+          ParentFont = False
+          ReadOnly = True
+          TabOrder = 0
+          Text = '00 00 00 00 00 00 00'
+        end
+        object EditPwdM: TEdit
+          Left = 88
+          Top = 48
+          Width = 57
+          Height = 22
+          Enabled = False
+          Font.Charset = DEFAULT_CHARSET
+          Font.Color = clWindowText
+          Font.Height = -11
+          Font.Name = 'Courier New'
+          Font.Style = [fsBold]
+          ParentFont = False
+          ReadOnly = True
+          TabOrder = 1
+          Text = '.......'
+        end
+        object EditPwdEncU: TEdit
+          Left = 256
+          Top = 24
+          Width = 153
+          Height = 22
+          Enabled = False
+          Font.Charset = DEFAULT_CHARSET
+          Font.Color = clWindowText
+          Font.Height = -11
+          Font.Name = 'Courier New'
+          Font.Style = []
+          ParentFont = False
+          ReadOnly = True
+          TabOrder = 2
+          Text = '00 00 00 00 00 00 00'
+        end
+        object EditPwdU: TEdit
+          Left = 256
+          Top = 48
+          Width = 57
+          Height = 22
+          Enabled = False
+          Font.Charset = DEFAULT_CHARSET
+          Font.Color = clWindowText
+          Font.Height = -11
+          Font.Name = 'Courier New'
+          Font.Style = [fsBold]
+          ParentFont = False
+          ReadOnly = True
+          TabOrder = 3
+          Text = '.......'
+        end
+      end
+      object GroupBox2: TGroupBox
+        Left = 8
+        Top = 96
+        Width = 281
+        Height = 65
+        Caption = 'UUID'
+        TabOrder = 1
+        object Label5: TLabel
+          Left = 9
+          Top = 44
+          Width = 69
+          Height = 13
+          Caption = 'Ethernet MAC:'
+        end
+        object EditUUID: TEdit
+          Left = 8
+          Top = 16
+          Width = 265
+          Height = 22
+          Font.Charset = DEFAULT_CHARSET
+          Font.Color = clWindowText
+          Font.Height = -11
+          Font.Name = 'Courier New'
+          Font.Style = []
+          ParentFont = False
+          ReadOnly = True
+          TabOrder = 0
+          Text = '........-....-....-....-............'
+        end
+        object EditMAC: TEdit
+          Left = 80
+          Top = 40
+          Width = 129
+          Height = 22
+          Font.Charset = DEFAULT_CHARSET
+          Font.Color = clWindowText
+          Font.Height = -11
+          Font.Name = 'Courier New'
+          Font.Style = []
+          ParentFont = False
+          ReadOnly = True
+          TabOrder = 1
+          Text = '00:00:00:00:00:00'
+        end
+      end
+      object GroupBox3: TGroupBox
+        Left = 304
+        Top = 96
+        Width = 137
+        Height = 65
+        Caption = 'OEM Info'
+        TabOrder = 2
+        object LabelContinent: TLabel
+          Left = 8
+          Top = 40
+          Width = 121
+          Height = 13
+          Alignment = taCenter
+          AutoSize = False
+          Caption = '---'
+          Font.Charset = DEFAULT_CHARSET
+          Font.Color = clWindowText
+          Font.Height = -11
+          Font.Name = 'MS Sans Serif'
+          Font.Style = [fsBold]
+          ParentFont = False
+        end
+        object MemoOEM: TMemo
+          Left = 8
+          Top = 16
+          Width = 121
+          Height = 22
+          Font.Charset = DEFAULT_CHARSET
+          Font.Color = clWindowText
+          Font.Height = -11
+          Font.Name = 'Courier New'
+          Font.Style = []
+          Lines.Strings = (
+            '................')
+          ParentFont = False
+          ReadOnly = True
+          TabOrder = 0
+        end
+      end
+      object GroupBox4: TGroupBox
+        Left = 8
+        Top = 168
+        Width = 337
+        Height = 121
+        Caption = 'Machine'
+        TabOrder = 3
+        object Label6: TLabel
+          Left = 8
+          Top = 24
+          Width = 73
+          Height = 13
+          Caption = 'Machine name:'
+        end
+        object Label7: TLabel
+          Left = 248
+          Top = 24
+          Width = 44
+          Height = 13
+          Caption = 'Revision:'
+        end
+        object Label8: TLabel
+          Left = 229
+          Top = 93
+          Width = 56
+          Height = 13
+          Caption = 'Code: PCG-'
+        end
+        object Label9: TLabel
+          Left = 10
+          Top = 68
+          Width = 67
+          Height = 13
+          Caption = 'Serial number:'
+        end
+        object Label10: TLabel
+          Left = 9
+          Top = 91
+          Width = 73
+          Height = 13
+          Caption = 'Date of manuf.:'
+        end
+        object LabelCountry: TLabel
+          Left = 84
+          Top = 24
+          Width = 157
+          Height = 13
+          Alignment = taRightJustify
+          AutoSize = False
+          Caption = '---'
+          Font.Charset = DEFAULT_CHARSET
+          Font.Color = clWindowText
+          Font.Height = -11
+          Font.Name = 'MS Sans Serif'
+          Font.Style = [fsBold]
+          ParentFont = False
+        end
+        object EditName: TEdit
+          Left = 8
+          Top = 40
+          Width = 233
+          Height = 22
+          Font.Charset = DEFAULT_CHARSET
+          Font.Color = clWindowText
+          Font.Height = -11
+          Font.Name = 'Courier New'
+          Font.Style = []
+          ParentFont = False
+          ReadOnly = True
+          TabOrder = 0
+          Text = '................................'
+        end
+        object EditRev: TEdit
+          Left = 248
+          Top = 40
+          Width = 81
+          Height = 22
+          Font.Charset = DEFAULT_CHARSET
+          Font.Color = clWindowText
+          Font.Height = -11
+          Font.Name = 'Courier New'
+          Font.Style = []
+          ParentFont = False
+          ReadOnly = True
+          TabOrder = 1
+          Text = '..........'
+        end
+        object Edit4char: TEdit
+          Left = 288
+          Top = 88
+          Width = 41
+          Height = 22
+          Font.Charset = DEFAULT_CHARSET
+          Font.Color = clWindowText
+          Font.Height = -11
+          Font.Name = 'Courier New'
+          Font.Style = []
+          ParentFont = False
+          ReadOnly = True
+          TabOrder = 2
+          Text = '....'
+        end
+        object EditSerial: TEdit
+          Left = 88
+          Top = 64
+          Width = 241
+          Height = 22
+          Font.Charset = DEFAULT_CHARSET
+          Font.Color = clWindowText
+          Font.Height = -11
+          Font.Name = 'Courier New'
+          Font.Style = []
+          ParentFont = False
+          ReadOnly = True
+          TabOrder = 3
+          Text = '00000000-0000000................'
+        end
+        object EditDateMan: TEdit
+          Left = 88
+          Top = 88
+          Width = 137
+          Height = 22
+          Font.Charset = DEFAULT_CHARSET
+          Font.Color = clWindowText
+          Font.Height = -11
+          Font.Name = 'Courier New'
+          Font.Style = []
+          ParentFont = False
+          ReadOnly = True
+          TabOrder = 4
+          Text = '..................'
+        end
+      end
+    end
+    object SheetRaw: TTabSheet
+      Caption = 'RAW view'
+      ImageIndex = 1
+      object ListRAW: TListBox
+        Left = 0
+        Top = 4
+        Width = 489
+        Height = 241
+        Font.Charset = DEFAULT_CHARSET
+        Font.Color = clWindowText
+        Font.Height = -11
+        Font.Name = 'Courier New'
+        Font.Style = []
+        ItemHeight = 14
+        ParentFont = False
+        TabOrder = 0
+      end
+    end
+    object SheetSMBus: TTabSheet
+      Caption = 'SMBus'
+      ImageIndex = 3
+      object Label1: TLabel
+        Left = 96
+        Top = 272
+        Width = 306
+        Height = 29
+        Caption = 'UNDER CONSTRUCTION'
+        Font.Charset = DEFAULT_CHARSET
+        Font.Color = clWindowText
+        Font.Height = -24
+        Font.Name = 'MS Sans Serif'
+        Font.Style = [fsBold]
+        ParentFont = False
+      end
+      object GroupBox5: TGroupBox
+        Left = 0
+        Top = 0
+        Width = 489
+        Height = 41
+        Caption = 'PCI Information / SMBus Controller'
+        TabOrder = 0
+        object LabelStatus: TLabel
+          Left = 48
+          Top = 18
+          Width = 433
+          Height = 13
+          AutoSize = False
+          Caption = 'Push button to scan PCI bus for SMBus controller.'
+        end
+        object ButtonPCIScan: TButton
+          Left = 8
+          Top = 16
+          Width = 33
+          Height = 17
+          Caption = 'Scan'
+          TabOrder = 0
+          OnClick = ButtonPCIScanClick
+        end
+      end
+      object GroupSMBus: TGroupBox
+        Left = 0
+        Top = 56
+        Width = 489
+        Height = 105
+        Caption = 'SMBus'
+        Enabled = False
+        TabOrder = 1
+        object ButtonSMBScan: TButton
+          Left = 8
+          Top = 16
+          Width = 75
+          Height = 17
+          Caption = 'Enum SMBus'
+          Enabled = False
+          TabOrder = 0
+          OnClick = ButtonSMBScanClick
+        end
+      end
+    end
+    object SheetAbout: TTabSheet
+      Caption = 'About'
+      ImageIndex = 2
+      object Label2: TLabel
+        Left = 56
+        Top = 248
+        Width = 377
+        Height = 41
+        Alignment = taCenter
+        AutoSize = False
+        Caption = 
+          'A BIG *THANKS* goes to Jean Delvare for his collected infos abou' +
+          't the SONY VAIO EEPROM.'
+        Font.Charset = DEFAULT_CHARSET
+        Font.Color = clWindowText
+        Font.Height = -13
+        Font.Name = 'MS Sans Serif'
+        Font.Style = [fsBold]
+        ParentFont = False
+        WordWrap = True
+      end
+      object Label11: TLabel
+        Left = 80
+        Top = 280
+        Width = 327
+        Height = 13
+        Caption = 
+          'check out http://www.ensicaen.ismra.fr/~delvare/ for his homepag' +
+          'e.'
+      end
+      object Label12: TLabel
+        Left = 88
+        Top = 224
+        Width = 312
+        Height = 13
+        Caption = 'This program was written by Markus Birth <mbirth@webwriters.de>'
+        Enabled = False
+      end
+      object MemoAbout: TMemo
+        Left = 88
+        Top = 8
+        Width = 313
+        Height = 209
+        Color = clMenu
+        Ctl3D = False
+        Lines.Strings = (
+          'This program was written after playing around with a SONY '
+          'VAIO notebook trying to find out the Power On Password.'
+          ''
+          'After spending lots of hours searching the internet and trying '
+          'different tricks, I found Jean Delvare'#39's homepage[1] with infos '
+          'about the format of the data stored in the security eeprom. '
+          'Jean also wrote the eeprom-module[2] for lm-sensors[3] for '
+          'Linux. He mentioned that the eeprom is easily accessible via '
+          'the SMBus interface.'
+          ''
+          'Since I didn'#39't want to hassle around with reading out the '
+          'SMBus, I - again - searched the internet and read that there '
+          'should be a utilty called GETSMBUS.EXE to read out SMBus '
+          'components included in the DOS-version of HWiNFO[4].'
+          ''
+          'I downloaded the package, put the GETSMBUS.EXE onto a '
+          'FAT32-partition, booted from an old Win98-CD (press F5 at '
+          'CD-ROM-Support-Selection!) and ran GETSMBUS.EXE. It '
+          'created the 4 files SMBUS34.DAT, SMBUS54.DAT, SMBUS'
+          '57.DAT and SMBUS69.DAT. From Jean'#39's homepage I knew '
+          'the address of the security eeprom was 0x57 - so the file '
+          'SMBUS57.DAT was the one.'
+          ''
+          'You can use this program to parse the file and extract the '
+          
+            'interesting information. Also the password is decrypted, just in' +
+            ' '
+          'case you forgot your machine password.'
+          ''
+          'Have fun!'
+          ''
+          ''
+          '[1] http://www.ensicaen.ismra.fr/~delvare/'
+          '[2] http://www.ensicaen.ismra.fr/~delvare/vaio/'
+          '[3] http://www.lm-sensors.nu'
+          '[4] http://www.hwinfo.com')
+        ParentCtl3D = False
+        ReadOnly = True
+        ScrollBars = ssVertical
+        TabOrder = 0
+      end
+    end
+  end
+  object OpenDialog1: TOpenDialog
+    Filter = 
+      'Sony 0x57 dump|SMBUS57.DAT|Other dumps (SMBUS*.DAT)|SMBUS*.DAT|A' +
+      'll files (*.*)|*.*'
+    Options = [ofHideReadOnly, ofPathMustExist, ofFileMustExist, ofEnableSizing, ofDontAddToRecent]
+    Left = 336
+    Top = 8
+  end
+end
diff --git a/AnalyzerU.pas b/AnalyzerU.pas
new file mode 100644
index 0000000..9588820
--- /dev/null
+++ b/AnalyzerU.pas
@@ -0,0 +1,266 @@
+unit AnalyzerU;
+
+interface
+
+uses
+  SysUtils, StdCtrls, Classes, Graphics, Controls, Forms, Dialogs, ComCtrls;
+
+type
+  TAForm = class(TForm)
+    LabelHeading: TLabel;
+    OpenDialog1: TOpenDialog;
+    ButtonOpen: TButton;
+    PageControl1: TPageControl;
+    SheetParsed: TTabSheet;
+    SheetRaw: TTabSheet;
+    ListRAW: TListBox;
+    SheetAbout: TTabSheet;
+    Label2: TLabel;
+    GroupBox1: TGroupBox;
+    EditPwdEncM: TEdit;
+    Label3: TLabel;
+    EditPwdM: TEdit;
+    Label4: TLabel;
+    LabelPwdAsk: TLabel;
+    GroupBox2: TGroupBox;
+    EditUUID: TEdit;
+    EditMAC: TEdit;
+    Label5: TLabel;
+    GroupBox3: TGroupBox;
+    MemoOEM: TMemo;
+    LabelContinent: TLabel;
+    GroupBox4: TGroupBox;
+    EditName: TEdit;
+    Label6: TLabel;
+    EditRev: TEdit;
+    Edit4char: TEdit;
+    Label7: TLabel;
+    Label8: TLabel;
+    EditSerial: TEdit;
+    Label9: TLabel;
+    EditDateMan: TEdit;
+    Label10: TLabel;
+    Label11: TLabel;
+    Label12: TLabel;
+    MemoAbout: TMemo;
+    LabelCountry: TLabel;
+    EditPwdEncU: TEdit;
+    EditPwdU: TEdit;
+    LabelPwdSetM: TLabel;
+    LabelPwdSetU: TLabel;
+    SheetSMBus: TTabSheet;
+    GroupBox5: TGroupBox;
+    ButtonPCIScan: TButton;
+    LabelStatus: TLabel;
+    GroupSMBus: TGroupBox;
+    ButtonSMBScan: TButton;
+    Label1: TLabel;
+    procedure ButtonOpenClick(Sender: TObject);
+    procedure ButtonPCIScanClick(Sender: TObject);
+    procedure ButtonSMBScanClick(Sender: TObject);
+  private
+    { Private declarations }
+  public
+    { Public declarations }
+  end;
+
+var
+  AForm: TAForm;
+
+implementation
+
+uses SMBus;
+
+var
+  MyPCI: PCI_Info;
+
+{$R *.dfm}
+
+procedure ShowRAW(x: array of byte);
+var i: integer;
+    tmph, tmpb: string;
+begin
+  tmph := '';
+  tmpb := '';
+  for i:=0 to 255 do begin
+    tmph := tmph + ' ' + IntToHex(x[i], 2);
+    if (x[i] IN [$20..$FF]) then tmpb := tmpb + Chr(x[i]) else tmpb := tmpb + '.';
+    if ((i+1) MOD 16 = 0) then begin
+      AForm.ListRAW.Items.Add(Trim(tmph)+' '+Trim(tmpb));
+      tmph := '';
+      tmpb := '';
+    end;
+  end;
+end;
+
+procedure EDL(o: TLabel; state: boolean);
+// Enable/Disable Label
+begin
+  if state then begin
+    o.Enabled := true;
+    o.Font.Style := [fsBold];
+    o.Font.Color := clGreen;
+  end else begin
+    o.Enabled := false;
+    o.Font.Style := [];
+    o.Font.Color := clBlack;
+  end;
+end;
+
+function GetText(x: array of byte; pf, pt: integer): string;
+var i: integer;
+begin
+  Result := '';
+  for i:=pf to pt do if (x[i]>0) then Result := Result + Chr(x[i]) else Break;
+end;
+
+function GetHex(x: array of byte; pf, pt: integer; sep: boolean = true): string;
+var i: integer;
+begin
+  Result := '';
+  for i:=pf to pt do if sep then Result := Result + ' ' + IntToHex(x[i],2) else Result := Result + IntToHex(x[i],2);
+  Result := Trim(Result);
+end;
+
+procedure CheckPwd(x: array of byte);
+var i: integer;
+    tmph: string;
+    isset: boolean;
+begin
+  // Machine password
+  isset := false;
+  tmph := '';
+  for i:=$00 to $06 do begin
+    if (x[i]>0) then isset := true;
+    tmph := tmph + ' ' + IntToHex(x[i], 2);
+  end;
+  AForm.EditPwdEncM.Text := Trim(tmph);
+  AForm.EditPwdEncM.Enabled := isset;
+  EDL(AForm.LabelPwdSetM, isset);
+
+  if isset then begin
+    tmph := '';
+    for i:=$00 to $06 do begin
+      tmph := tmph + Chr((x[i] DIV 2));
+    end;
+    AForm.EditPwdM.Text := tmph;
+  end else AForm.EditPwdM.Text := '.......';
+  AForm.EditPwdM.Enabled := isset;
+
+  // User password
+  isset := false;
+  tmph := '';
+  for i:=$07 to $0d do begin
+    if (x[i]>0) then isset := true;
+    tmph := tmph + ' ' + IntToHex(x[i], 2);
+  end;
+  AForm.EditPwdEncU.Text := Trim(tmph);
+  AForm.EditPwdEncU.Enabled := isset;
+  EDL(AForm.LabelPwdSetU, isset);
+
+  if isset then begin
+    tmph := '';
+    for i:=$07 to $0d do begin
+      tmph := tmph + Chr((x[i] DIV 2));
+    end;
+    AForm.EditPwdU.Text := tmph;
+  end else AForm.EditPwdU.Text := '.......';
+  AForm.EditPwdU.Enabled := isset;
+
+  if (x[$0f]=$4E) OR (x[$0f]=$FF) then EDL(AForm.LabelPwdAsk, true) else EDL(AForm.LabelPwdAsk, false);
+end;
+
+procedure CheckUUID(x: array of byte);
+var i: integer;
+    tu, tm: string;
+begin
+  tu := GetHex(x, $10, $1f, false);
+  tm := GetHex(x, $1a, $1f);
+  tu := Copy(tu,1,8)+'-'+Copy(tu,9,4)+'-'+Copy(tu,13,4)+'-'+Copy(tu,17,4)+'-'+Copy(tu,21,12);
+  for i:=1 to Length(tm) do if tm[i]=' ' then tm[i]:=':';
+  AForm.EditUUID.Text := tu;
+  AForm.EditMAC.Text := tm;
+end;
+
+procedure CheckOEM(x: array of byte);
+var toem: string;
+begin
+  toem := GetText(x, $20, $2f);
+  AForm.MemoOEM.Text := toem;
+  toem := Copy(toem,1,2);
+  if (toem = 'EU') then AForm.LabelContinent.Caption := 'Europe'
+    else if (toem = 'UC') then AForm.LabelContinent.Caption := 'North America'
+    else if (toem = 'JP') then AForm.LabelContinent.Caption := 'Japan'
+    else AForm.LabelContinent.Caption := '---';
+end;
+
+procedure CheckMachine(x: array of byte);
+var i: integer;
+    mn, cc: string;
+    isin: boolean;
+begin
+  mn := GetText(x, $80, $9f);
+  AForm.EditName.Text := mn;
+  AForm.EditRev.Text := GetText(x, $a0, $a9);
+  AForm.Edit4char.Text := GetText(x, $aa, $ad);
+  AForm.EditSerial.Text := GetText(x, $c0, $df);
+  AForm.EditDateMan.Text := GetText(x, $e0, $f2);
+
+  cc := '';
+  isin := false;
+  for i:=1 to Length(mn) do begin
+    if (mn[i]=')') then break;
+    if isin then cc := cc + mn[i];
+    if (mn[i]='(') then isin := true;
+  end;
+  if (cc = 'FR') then AForm.LabelCountry.Caption := 'France'
+    else if (cc = 'GB') then AForm.LabelCountry.Caption := 'Great Britain'
+    else if (cc = 'DE') then AForm.LabelCountry.Caption := 'Germany'
+    else if (cc = 'UC') then AForm.LabelCountry.Caption := 'United States of America'
+    else if (cc = 'J') then AForm.LabelCountry.Caption := 'Japan'
+    else AForm.LabelCountry.Caption := '---';
+end;
+
+procedure TAForm.ButtonOpenClick(Sender: TObject);
+var f: file of byte;
+    d: array[0..255] of byte;
+    i: integer;
+begin
+  if OpenDialog1.Execute then begin
+    AssignFile(f, OpenDialog1.FileName);
+    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;
+  end;
+end;
+
+procedure EnableGroup(grp: TGroupBox; new: boolean);
+var i: integer;
+begin
+  for i:=0 to grp.ControlCount-1 do grp.Controls[i].Enabled := new;
+  grp.Enabled := new;
+end;
+
+procedure TAForm.ButtonPCIScanClick(Sender: TObject);
+begin
+  Screen.Cursor := crHourGlass;
+  MyPCI := Scan_PCI(Application, AForm.LabelStatus);
+  Screen.Cursor := crDefault;
+  if (MyPCI.SMB_Address <> 0) AND (MyPCI.Vendor_Name <> '') then begin
+    AForm.LabelStatus.Caption := 'SMBus-Controller: '+MyPCI.Vendor_Name+' '+MyPCI.Device_Name+' Rev '+IntToStr(MyPCI.Rev)+' at addr 0x'+IntToHex(MyPCI.SMB_Address,4);
+    EnableGroup(AForm.GroupSMBus, true);
+  end;
+end;
+
+procedure TAForm.ButtonSMBScanClick(Sender: TObject);
+begin
+  //asd
+end;
+
+end.
diff --git a/DLPORTIO.dll b/DLPORTIO.dll
new file mode 100644
index 0000000..9849434
Binary files /dev/null and b/DLPORTIO.dll differ
diff --git a/DLPORTIO.sys b/DLPORTIO.sys
new file mode 100644
index 0000000..d3d932c
Binary files /dev/null and b/DLPORTIO.sys differ
diff --git a/SMBus.pas b/SMBus.pas
new file mode 100644
index 0000000..0d1409e
--- /dev/null
+++ b/SMBus.pas
@@ -0,0 +1,209 @@
+unit SMBus;
+
+interface
+
+  uses Forms, StdCtrls;
+
+  type
+    PCI_Info = record
+      Vendor_ID: word;
+      Vendor_Name: string;
+      Device_ID: word;
+      Device_Name: string;
+      Rev: byte;
+      Bus: byte;
+      Dev: byte;
+      Fun: byte;
+      SMB_Address: word;
+    end;
+
+    function Scan_PCI(Application: TApplication; Status: TLabel): PCI_Info;
+
+implementation
+
+uses SysUtils;
+
+const
+  RW_WRITE = 0;
+  RW_READ = 1;
+
+function DlPortReadPortUchar(Port: cardinal): cardinal; stdcall; external'dlportio.dll';
+function DlPortReadPortUlong(Port: cardinal): cardinal; stdcall; external'dlportio.dll';
+procedure DlPortWritePortUchar(Port: cardinal; Value: cardinal); stdcall; external'dlportio.dll';
+procedure DlPortWritePortUlong(Port: cardinal; Value: cardinal); stdcall; external'dlportio.dll';
+
+// http://www.tsgroup.it/smbus/index.htm
+function Get_PCI_Reg(Bus: cardinal;Dev: cardinal;Fun: cardinal;Reg: cardinal): cardinal;
+var
+  cc, t: cardinal;
+begin
+  cc := $80000000;
+  cc := cc or ((Bus and $FF) shl 16);//Bus
+  cc := cc or ((Dev and $1F) shl 11);//Dev
+  cc := cc or ((Fun and $07) shl 8);//func
+  cc := cc or ((Reg and $FC));//Reg
+  t := DlPortReadPortUlong($CF8);
+  DlPortWritePortUlong($CF8, cc);
+  Result := DlPortReadPortUlong($CFC);
+  DlPortWritePortUlong($CF8, t);
+end;
+
+// http://www.tsgroup.it/smbus/index.htm
+function Get_Info(Data: Longword; Bus: cardinal; Dev: cardinal; Fun: cardinal): PCI_Info;
+var PCI_Structure: PCI_Info;
+begin
+  PCI_Structure.Vendor_ID := Data and $FFFF;
+  PCI_Structure.Device_ID := (Data shr 16) and $FFFF;
+  PCI_Structure.Bus := Bus;
+  PCI_Structure.Dev := Dev;
+  PCI_Structure.Fun := Fun;
+  case Data of
+    $71138086:
+      begin
+        PCI_Structure.SMB_Address := Get_PCI_Reg(Bus, Dev, Fun, $90) and $FFF0;
+        PCI_Structure.Rev := Get_PCI_Reg(Bus, Dev, Fun, 8) and $FF;
+        PCI_Structure.Vendor_Name := 'Intel�';
+        PCI_Structure.Device_Name := '82371AB/EB (PIIX4)';
+      end;
+    $24138086:
+      begin
+        PCI_Structure.SMB_Address := Get_PCI_Reg(Bus, Dev, Fun, $20) and $FFF0;
+        PCI_Structure.Rev := Get_PCI_Reg(Bus, Dev, Fun, 8) and $FF;
+        PCI_Structure.Vendor_Name := 'Intel�';
+        PCI_Structure.Device_Name := '82801AA/ICH';
+      end;
+    $24238086:
+      begin
+        PCI_Structure.SMB_Address := Get_PCI_Reg(Bus, Dev, Fun, $20) and $FFF0;
+        PCI_Structure.Rev := Get_PCI_Reg(Bus, Dev, Fun, 8) and $FF;
+        PCI_Structure.Vendor_Name := 'Intel�';
+        PCI_Structure.Device_Name := '82801AB/ICH0';
+      end;
+    $24438086:
+      begin
+        PCI_Structure.SMB_Address := Get_PCI_Reg(Bus, Dev, Fun, $20) and $FFF0;
+        PCI_Structure.Rev := Get_PCI_Reg(Bus, Dev, Fun, 8) and $FF;
+        PCI_Structure.Vendor_Name := 'Intel�';
+        PCI_Structure.Device_Name := '82801BA/ICH2';
+      end;
+  else
+    PCI_Structure.SMB_Address := 0;
+    PCI_Structure.Rev := 0;
+    PCI_Structure.Vendor_Name := '';
+    PCI_Structure.Device_Name := '';
+  end;
+  Result := PCI_Structure;
+end;
+
+// http://www.tsgroup.it/smbus/index.htm
+function Scan_PCI(Application: TApplication; Status: TLabel): PCI_Info;
+var Bus, Dev, Fun: integer;
+    Info: PCI_Info;
+    Data: Longword;
+    loopdone: boolean;
+begin
+  for Bus := 0 to $FF do begin
+    Status.Caption := 'Now scanning Bus 0x'+IntToHex(Bus,2)+' ...';
+    Application.ProcessMessages;
+    for Dev := 0 to $1F do begin
+      for Fun := 0 to $07 do begin
+        loopdone := false;
+        Data := Get_PCI_Reg(Bus, Dev, Fun, 0); {In Data abbiamo il nostro codice di identificazione oppure nulla (0x0 or 0xFFFFFFFF). Da questo punto si salta alla routine di decodifica del CHIP. }
+        if (Data <> $FFFFFFFF) and (Data <> 0) then begin
+          Info := Get_Info(Data, Bus, Dev, Fun);
+          if Info.Vendor_Name <> '' then Break;
+        end;
+        loopdone := true;
+      end;
+      if Info.Vendor_Name <> '' then Break;
+    end;
+    if Info.Vendor_Name <> '' then Break;
+  end;
+  if (Info.SMB_Address <> 0) AND (Info.Vendor_Name<>'') AND (NOT loopdone) then begin
+    Status.Caption := 'SMBus-Controller found at Bus 0x'+IntToHex(Bus,2)+', Dev 0x'+IntToHex(Dev,2);
+  end else begin
+    Status.Caption := 'No compatible SMBus-Controller found!';
+  end;
+  Result := Info;
+end;
+
+
+
+(******************************************************************************
+******* SMBus routines follow                                           *******
+******************************************************************************)
+
+
+procedure smbWaitForFree(BaseAddr: word);
+var
+  Status: byte;
+begin
+  Status := DlPortReadPortUchar(BaseAddr);
+  while (Status and 1) <> 0 do begin
+    Application.ProcessMessages;
+    Status := DlPortReadPortUchar(BaseAddr);
+  end;
+  if (Status and $1e) <> 0 then
+    DlPortWritePortUchar(BaseAddr, Status);
+end;
+
+procedure smbWaitForEnd(BaseAddr: word);
+var
+  Status: byte;
+begin
+  Status := DlPortReadPortUchar(BaseAddr);
+  while (Status and 1) = 1 do begin
+    Application.ProcessMessages;
+    Status := DlPortReadPortUchar(BaseAddr);
+  end;
+end;
+
+function smbCallBus(BaseAddr: word; CMD: byte; Slave: byte; RW: byte): cardinal;
+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;
+  smbWaitForEnd(BaseAddr);
+  Dump1 := ( DlPortReadPortUchar(BaseAddr + 6) shl 8);
+  Dump1 := Dump1 or DlPortReadPortUchar(BaseAddr + 5);
+  Result := Dump1;
+end;
+
+function smbGetReg(BaseAddr: word; Reg: byte; Slave: byte): word;
+var
+  Data: cardinal;
+begin
+  smbWaitForFree(BaseAddr);
+  DlPortWritePortUchar(BaseAddr + 5, 0);
+  DlPortWritePortUchar(BaseAddr + 6, 0);
+  Data := smbCallBus(BaseAddr, Reg, Slave, RW_READ);
+  Result := (Data and $ff);
+end;
+
+function smbGetAddress(BaseAddr: word): string;
+var
+  Data: word;
+  Cheque: string;
+  idx: integer;
+begin
+  Cheque := '';
+  for idx := $20 to $4F do begin
+    smbWaitForFree(BaseAddr);
+    DlPortWritePortUchar(BaseAddr + 5, 0);
+    DlPortWritePortUchar(BaseAddr + 6, 0);
+    Data := smbCallBus(BaseAddr, 0, idx, RW_READ);
+    if (Data and $FF) <> 0 then begin
+      Cheque := Cheque + IntToHex(idx,2);
+    end;
+  end;
+  Result := Cheque;
+end;
+
+begin
+
+end.
\ No newline at end of file
diff --git a/memmap.txt b/memmap.txt
new file mode 100644
index 0000000..0fac06b
--- /dev/null
+++ b/memmap.txt
@@ -0,0 +1,29 @@
+     0  1  2  3  4  5  6  7  8  9  a  b  c  d  e  f
+00: PP PP PP PP PP PP PP pp pp pp pp pp pp pp ?? SS
+10: UU UU UU UU UU UU UU UU UU UU UU UU UU UU UU UU
+20: OO OO OO OO OO OO OO OO OO OO OO OO OO OO OO OO
+30: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff
+40: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff
+50: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff
+60: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff
+70: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff
+80: MM MM MM MM MM MM MM MM MM MM MM MM MM MM MM MM
+90: MM MM MM MM MM MM MM MM MM MM MM MM MM MM MM MM
+a0: RR RR RR RR RR RR RR RR RR RR NN NN NN NN ?? ??
+b0: ?? ?? ?? ?? ?? ?? 0? ?? ?? ?? ?? ?? 0? 0? ?5 ??
+c0: ss ss ss ss ss ss ss ss ss ss ss ss ss ss ss ss
+d0: ss ss ss ss ss ss ss ss ss ss ss ss ss ss ss ss
+e0: tt tt tt tt tt tt tt tt tt tt tt tt tt tt tt tt
+f0: tt tt ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ??
+
+
+PP - Machine password
+pp - User password
+SS - Security setting (FF/4E: ask at startup; FE/00: don't ask)
+UU - UUID
+OO - OEM Info
+MM - Machine name
+RR - Revision
+NN - Model Name (4-character!)
+ss - Serial number
+tt - Timestamp
\ No newline at end of file