Forms Delphi

Title: How to display all AutoRun Information
Question: How to display all AutoRun Information
Answer:
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
ComCtrls, registry, ShlObj, ActiveX;
const
IID_IPersistFile: TGUID =
(D1:$0000010B;D2:$0000;D3:$0000;D4:($C0,$00,$00,$00,$00,$00,$00,$46));

type
TForm1 = class(TForm)
TreeView1: TTreeView;
procedure FormShow(Sender: TObject);
end;
var
Form1: TForm1;
procedure AddWinINICalls(Tree:TTreeView);
procedure AddAllFilesToRunView(Hndl:THandle;Tree:TTreeView;MainKey,MiddleKey,EndKey:String);
procedure AddAllRegToRunView(Tree:TTreeView;MainKey,MiddleKey:String);
procedure AddRegToRunView(Tree:TTreeView;MainKey,MiddleKey,EndKey:String);
procedure ShowAutoRunInformation(Hndl:THandle;TreeView:TTreeView);
function GetLinkInfo(WinhWnd:HWND;LnkObj:string):String;
implementation
{$R *.DFM}
procedure TForm1.FormShow(Sender: TObject);
begin
TreeView1.Items.BeginUpdate;
TreeView1.Items.Clear;
ShowAutoRunInformation(Form1.Handle,TreeView1);
TreeView1.FullExpand;
TreeView1.Items.EndUpdate;
end;
procedure ShowAutoRunInformation(Hndl:THandle;TreeView:TTreeView);
begin
AddRegToRunView(TreeView,'HKEY_LOCAL_MACHINE',
'\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Winlogon','Userinit');
AddAllRegToRunView(TreeView,'HKEY_LOCAL_MACHINE',
'\SOFTWARE\Microsoft\Windows\CurrentVersion\RunOnce');
AddAllRegToRunView(TreeView,'HKEY_LOCAL_MACHINE',
'\SOFTWARE\Microsoft\Windows\CurrentVersion\RunOnceEx');
AddRegToRunView(TreeView,'HKEY_CURRENT_USER',
'\Software\Microsoft\Windows NT\CurrentVersion\Windows','Run');
AddAllRegToRunView(TreeView,'HKEY_LOCAL_MACHINE',
'\SOFTWARE\Microsoft\Windows\CurrentVersion\Run');
AddAllRegToRunView(TreeView,'HKEY_CURRENT_USER',
'\Software\Microsoft\Windows\CurrentVersion\Run');
AddAllFilesToRunView(Hndl,TreeView,'HKEY_LOCAL_MACHINE',
'\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\Shell Folders','Common Startup');
AddAllFilesToRunView(Hndl,TreeView,'HKEY_LOCAL_MACHINE',
'\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\Shell Folders','Common AltStartup');
AddAllFilesToRunView(Hndl,TreeView,'HKEY_CURRENT_USER',
'\Software\Microsoft\Windows\CurrentVersion\Explorer\Shell Folders','Startup');
AddRegToRunView(TreeView,'HKEY_LOCAL_MACHINE',
'\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Windows','Load');
AddRegToRunView(TreeView,'HKEY_CURRENT_USER',
'\Software\Microsoft\Windows NT\CurrentVersion\Windows','Load');
AddAllRegToRunView(TreeView,'HKEY_LOCAL_MACHINE',
'\SOFTWARE\Microsoft\Windows\CurrentVersion\RunServices');
AddAllRegToRunView(TreeView,'HKEY_LOCAL_MACHINE',
'\SOFTWARE\Microsoft\Windows\CurrentVersion\RunServicesOnce');
AddAllRegToRunView(TreeView,'HKEY_CURRENT_USER',
'\Software\Microsoft\Windows\CurrentVersion\RunServices');
AddAllRegToRunView(TreeView,'HKEY_CURRENT_USER',
'\Software\Microsoft\Windows\CurrentVersion\RunServicesOnce');
AddRegToRunView(TreeView,'HKEY_CURRENT_USER',
'\Software\Microsoft\Windows NT\CurrentVersion\Winlogon','Userinit');
AddAllRegToRunView(TreeView,'HKEY_CURRENT_USER',
'\Software\Microsoft\Windows\CurrentVersion\RunOnce');
AddAllRegToRunView(TreeView,'HKEY_CURRENT_USER',
'\Software\Microsoft\Windows\CurrentVersion\RunOnceEx');
AddWinINICalls(TreeView);
end;
procedure AddRegToRunView(Tree:TTreeView;MainKey,MiddleKey,EndKey:String);
var
reg:TRegistry;
Node:TTreeNode;
s:String;
begin
reg:=TRegistry.Create;
try
if MainKey='HKEY_CURRENT_USER' then Reg.RootKey:=HKEY_CURRENT_USER else
if MainKey='HKEY_LOCAL_MACHINE' then Reg.RootKey:=HKEY_LOCAL_MACHINE;
if Reg.OpenKeyReadOnly(MiddleKey) then
if Reg.ValueExists(EndKey) then begin
s:=Reg.ReadString(EndKey);
if s'' then begin
Node:=Tree.Items.Add(nil,MainKey+MiddleKey+'\'+EndKey);
Tree.Items.AddChild(Node,s);
end;
end;
finally
Reg.CloseKey;
reg.Free;
end;
end;
procedure AddAllRegToRunView(Tree:TTreeView;MainKey,MiddleKey:String);
var
reg:TRegistry;
Node:TTreeNode;
Val:TStringList;
n:Integer;
s:String;
begin
reg:=TRegistry.Create;
try
if MainKey='HKEY_CURRENT_USER' then Reg.RootKey:=HKEY_CURRENT_USER else
if MainKey='HKEY_LOCAL_MACHINE' then Reg.RootKey:=HKEY_LOCAL_MACHINE;
if Reg.OpenKeyReadOnly(MiddleKey) then begin
Val:=TStringList.Create;
Reg.GetValueNames(Val);
if Val.Count0 then begin
Node:=Tree.Items.Add(nil,MainKey+MiddleKey+'\');
for n:=0 to Val.Count-1 do begin
s:=Reg.ReadString(Val[n]);
if s'' then Tree.Items.AddChild(Node,s);
end;
end;
Val.Free;
end;
finally
Reg.CloseKey;
reg.Free;
end;
end;
procedure AddAllFilesToRunView(Hndl:THandle;Tree:TTreeView;MainKey,MiddleKey,EndKey:String);
var
reg:TRegistry;
Node:TTreeNode;
s:String;
sr: TSearchRec;
begin
reg:=TRegistry.Create;
try
if MainKey='HKEY_CURRENT_USER' then Reg.RootKey:=HKEY_CURRENT_USER else
if MainKey='HKEY_LOCAL_MACHINE' then Reg.RootKey:=HKEY_LOCAL_MACHINE;
if Reg.OpenKeyReadOnly(MiddleKey) then
if Reg.ValueExists(EndKey) then begin
s:=Reg.ReadString(EndKey);
if FindFirst(s+'\*.*', $00, sr) = 0 then begin
Node:=Tree.Items.Add(nil,s);
Tree.Items.AddChild(Node,sr.Name+' - '+
GetLinkInfo(Hndl,s+'\'+sr.Name));
while FindNext(sr) = 0 do
Tree.Items.AddChild(Node,sr.Name+' - '+
GetLinkInfo(Hndl,s+'\'+sr.Name));
FindClose(sr);
end;
end;
finally
Reg.CloseKey;
reg.Free;
end;
end;
procedure AddWinINICalls(Tree:TTreeView);
var
Path : array[0..MAX_PATH] of Char;
sL,sR : String;
Node : TTreeNode;
List : TStringList;
n,n1 : Integer;
begin
GetWindowsDirectory(Path,SizeOf(Path));
if NOT FileExists(Path+'\WIN.INI') then exit;
List:=TStringList.create;
List.LoadFromFile(Path+'\WIN.INI');
sL:='';
sR:='';
for n:=0 to List.count-1 do if UpperCase(List[n])='[WINDOWS]' then break;
for n1:=n+1 to List.count-1 do begin
if copy(List[n1],1,1)='[' then break;
if copy(UpperCase(List[n1]),1,length('RUN='))='RUN=' then sR:=List[n1];
if copy(UpperCase(List[n1]),1,length('LOAD='))='LOAD=' then sL:=List[n1];
end;
list.Free;
if ((sL='') AND (sR='')) then exit;
Node:=Tree.Items.Add(nil,Path+'\WIN.INI');
if sL'' then Tree.Items.AddChild(Node,sL);
if sR'' then Tree.Items.AddChild(Node,sR);
end;
function GetLinkInfo(WinhWnd:HWND;LnkObj:string):String;
var
hres : HRESULT;
psl : IShellLink;
ppf : IPersistFile;
wfd : Win32_Find_Data;
Path : array[0..MAX_PATH] of Char;
begin
result := '????';
//initializes the Component Object Model(COM) library
CoInitialize(nil);
// Call CoCreateInstance to obtain the IShellLink Interface pointer.
hres:=CoCreateInstance(CLSID_ShellLink, nil,
CLSCTX_INPROC_SERVER, IID_IShellLinkA, psl);
if NOT SUCCEEDED(hres) then exit;
// The IShellLink Interface supports the IPersistFile
// interface. Get an interface pointer to it.
hres:=psl.QueryInterface(IID_IPersistFile,ppf);
if SUCCEEDED(hres) then begin
// Convert the given link name string to wide character string.
// and Load the file.
hres:=ppf.Load(StringToOLEStr(LnkObj),STGM_READ);
if SUCCEEDED(hres) then begin
// Resolve the link by calling the Resolve() interface function.
hres:=psl.Resolve(WinhWnd,SLR_ANY_MATCH OR SLR_NO_UI);
if SUCCEEDED(hres) then begin
hres:=psl.GetPath(Path,MAX_PATH,wfd,SLGP_SHORTPATH);
if SUCCEEDED(hres) then result:=Path;
end;
end;
end;
end;
end.