-
Доброго времени суток.
Итак, у меня есть прога написанная на Делфи.
Она имеет способность искать определенную инфу в нужных ветках и выдавать эту ифну на экран. Так же в ней есть вкладка, где можно осуществлять обычные поиск по реестру. Реализовано через технологию TRegistry (Tregisters, TReg).
Дак вот, высад в том, что она ищет всю инфу в текущем реестре. Т.е. в реестре винды, под которой мы сидим. А моя-то основная цель, это написать такую прогу, которая бы искала, как раз не в текущеем активном реестре, а в выбранных файлах реестра. пока не нашел как инструментом TRegistry подключать файл другого реестра и искать в нем. Мне подсказали, что возможно есть модуль уже написанный (хз на чем) который умеет переключаться на другой реестр (загружать другой реестр, загржуать файл другого реестра, другой винды) распознавать структуру. И уже там искать нужные параметры.
Вот, найти нужно возможность подключения файла реестра. поиска в нем. могу выложить сурсы проги если надо. Заранее спасибо
-
1 Часть unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, registry, StdCtrls, ComCtrls, ExtCtrls, ImgList;
type
TUsbItem = class(TObject)
id1:string;
id2:string;
DeviceDescr:String;
LocationInformation:string;
ClassGUID:string;
_Class:string;
Driver:string;
Mfg:string;
Service:string;
end;
type
TForm1 = class(TForm)
PageControl2: TPageControl;
TabSheet3: TTabSheet;
TabSheet4: TTabSheet;
Panel1: TPanel;
PageControl1: TPageControl;
TabSheet1: TTabSheet;
ListView1: TListView;
TabSheet2: TTabSheet;
Memo1: TMemo;
Panel2: TPanel;
Label1: TLabel;
Edit1: TEdit;
Label2: TLabel;
ComboBox1: TComboBox;
Label3: TLabel;
Edit2: TEdit;
Label4: TLabel;
ProgressBar1: TProgressBar;
Button1: TButton;
PageControl3: TPageControl;
TabSheet5: TTabSheet;
TabSheet6: TTabSheet;
Memo2: TMemo;
Panel3: TPanel;
Button2: TButton;
ListView2: TListView;
ImageList1: TImageList;
Memo3: TMemo;
save: TButton;
print: TButton;
SaveDialog1: TSaveDialog;
PrintDialog1: TPrintDialog;
RichEdit1: TRichEdit;
procedure Button1Click(Sender: TObject);
procedure FormKeyDown(Sender: TObject; var Key: Word;
Shift: TShiftState);
procedure FormCreate(Sender: TObject);
procedure Button2Click(Sender: TObject);
procedure FormClose(Sender: TObject; var Action: TCloseAction);
procedure ListView2Click(Sender: TObject);
procedure saveClick(Sender: TObject);
procedure printClick(Sender: TObject);
private
public
procedure FindTextInRegistry(r:TRegistry; text:string);
procedure FindUSBInRegistry(r:TRegistry; text:string; level: integer; usb_list_data:TList;num_item:integer);
procedure StopSearch();
function generateTXT():TStringList;
end;
var
Form1: TForm1;
reg:TRegistry;
stop:boolean;
start_scan_vid:boolean=false;
start_get_vid_params:boolean=false;
ccs_enum_usb_list:Tlist;
num_item:integer=0;
item: TUsbItem;
implementation
procedure TForm1.FormCreate(Sender: TObject);
begin
ccs_enum_usb_list:=TList.Create;
stop:=false;
end;
procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
begin
ccs_enum_usb_list.Free;
end;
procedure TForm1.Button1Click(Sender: TObject);
begin
if (edit1.text<>'') AND (edit2.text<>'') then
begin
Button1.Enabled:=false;
memo1.lines.add('Start');
reg:=TRegistry.Create();
reg.RootKey:=LongWord(ComboBox1.ItemIndex)+$80000000;
ProgressBar1.Position:=0;
ProgressBar1.Max:=1000;
FindTextInRegistry(reg,'\'+Edit2.text);
ProgressBar1.Position:=ProgressBar1.max;
stop:=false;
reg.Free;
end;
end;
procedure TForm1.FindTextInRegistry(r: TRegistry; text: string);
var
i: integer;
Keys: TStringList;
s:string;
li:TListItem;
begin
if (stop) then
begin
StopSearch();
exit;
end;
Keys := TStringList.Create;
r.OpenKey(text, False);
r.GetValueNames(Keys);
for i := 0 to Keys.Count - 1 do
begin
if (stop) then break;
memo1.lines.Add(Keys.Strings[i]);
if (pos(edit1.text, Keys.Strings[i])>0) OR (pos(LowerCase(edit1.text), LowerCase(Keys.Strings[i]))>0) then
begin
li:=ListView1.Items.Add;
li.Caption:=Keys.Strings[i];
li.SubItems.Add(text)
end;
end;
r.GetKeyNames(Keys);
r.CloseKey;
for i := 0 to Keys.Count - 1 do
begin
if (stop) then break;
s:=text + '\' + Keys.Strings[i] + '\';
s:=StringReplace(s,'\\','\',[rfReplaceAll]);
memo1.lines.Add('[' + s + ']');
Application.ProcessMessages;
ProgressBar1.Position:=ProgressBar1.Position+1;
if (ProgressBar1.Position=ProgressBar1.max) then ProgressBar1.Position:=0;
FindTextInRegistry(r, s );
Application.ProcessMessages;
end;
keys.Free;
end;
procedure TForm1.FormKeyDown(Sender: TObject; var Key: Word;
Shift: TShiftState);
begin
if key=VK_ESCAPE then
begin
stop:=true;
StopSearch();
end;
end;
procedure TForm1.StopSearch();
begin
Button1.Enabled:=true;
end;
-
2 часть
procedure TForm1.FindUSBInRegistry(r: TRegistry; text: string; level: integer; usb_list_data:TList; num_item:integer);
var
i: integer;
Keys: TStringList;
s:string;
begin
if (r.OpenKey(text, False)) then
begin
Keys := TStringList.Create;
r.GetValueNames(Keys);
for i := 0 to Keys.Count - 1 do
begin
memo2.lines.Add(Keys.Strings[i]);
if (level=3) AND not start_scan_vid AND start_get_vid_params then
begin
try
if (item<>nil) then
begin
if (Keys.Strings[i]='DeviceDescr') then item.DeviceDescr:=r.ReadString(Keys.Strings[i]);
if (Keys.Strings[i]='LocationInformation') then item.LocationInformation:=r.ReadString(Keys.Strings[i]);
if (Keys.Strings[i]='ClassGUID') then item.ClassGUID:=r.ReadString(Keys.Strings[i]);
if (Keys.Strings[i]='Class') then item._Class:=r.ReadString(Keys.Strings[i]);
if (Keys.Strings[i]='Driver') then item.Driver:=r.ReadString(Keys.Strings[i]);
if (Keys.Strings[i]='Mfg') then item.Mfg:=r.ReadString(Keys.Strings[i]);
if (Keys.Strings[i]='Service') then item.Service:=r.ReadString(Keys.Strings[i]);
end;
except
end;
end;
end;
if (item<>nil) AND (level=3) AND not start_scan_vid AND start_get_vid_params then
begin
start_get_vid_params:=false;
usb_list_data.Add(item);
end;
r.GetKeyNames(Keys);
r.CloseKey;
for i := 0 to Keys.Count - 1 do
begin
s:=text + '\' + Keys.Strings[i] + '\';
s:=StringReplace(s,'\\','\',[rfReplaceAll]);
memo2.lines.Add('[' + s + ']');
if (level=1) AND (pos('Vid_',Keys.Strings[i])>0) then
begin
item:=TUsbItem.Create;
inc(num_item);
if (item is TUsbItem) AND (item<>nil) then
begin
memo2.lines.add('###'+Keys.Strings[i]+'###');
start_scan_vid:=true;
item.id1:=Keys.Strings[i];
end;
end;
if (level=2) AND start_scan_vid then
begin
begin
memo2.lines.add('@@@'+Keys.Strings[i]+'@@@');
start_scan_vid:=false;
start_get_vid_params:=true;
item.id2:=Keys.Strings[i];
end;
end;
inc(level);
FindUSBInRegistry(r, s, level, usb_list_data,num_item);
dec(level);
Application.ProcessMessages;
end;
keys.Free;
end
else
begin
memo2.lines.add('Ошибка: '+text);
end;
end;
procedure TForm1.Button2Click(Sender: TObject);
var
r2:TRegistry;
i:integer;
li:TListItem;
s:string;
begin
memo3.Clear;
if (ccs_enum_usb_list.count>0) then
begin
for i:=0 to ccs_enum_usb_list.Count-1 do
TUsbItem(ccs_enum_usb_list.items[i]).Free;
ccs_enum_usb_list.Clear;
end;
ccs_enum_usb_list:=TList.Create;
if (ListView2.Items.Count>0) then
begin
ListView2.Items.Clear;
end;
r2:=TRegistry.Create;
r2.RootKey:=HKEY_LOCAL_MACHINE;
r2.Access:=KEY_READ;
FindUSBInRegistry(r2,'\SYSTEM\CurrentControlSet\Enum\USB',1, ccs_enum_usb_list, num_item);
for i:=0 to ccs_enum_usb_list.Count-1 do
begin
li:=ListView2.Items.add;
s:='';
if (TUsbItem(ccs_enum_usb_list.Items[i]).LocationInformation<>'') then
s:=TUsbItem(ccs_enum_usb_list.Items[i]).LocationInformation
else
s:=TUsbItem(ccs_enum_usb_list.Items[i]).mfg;
li.Caption:=s;
li.Data:=ccs_enum_usb_list.Items[i];
end;
r2.free;
if (ccs_enum_usb_list.Count>0) then
begin
print.Enabled:=true;
save.Enabled:=true;
end;
end;
procedure TForm1.ListView2Click(Sender: TObject);
var
usbitem:tusbitem;
begin
if (listview2.items.count>0) then
begin
if (ListView2.Selected<>nil) then
begin
usbitem:=TUsbItem(ListView2.Selected.Data);
memo3.Clear;
memo3.lines.add('ID: '+usbitem.id1+'\'+usbitem.id2);
memo3.lines.add('DeviceDescr: '+usbitem.DeviceDescr);
memo3.lines.add('LocationInformation: '+usbitem.LocationInformation);
memo3.lines.add('ClassGUID: '+usbitem.ClassGUID);
memo3.lines.add('Class: '+usbitem._Class);
memo3.lines.add('Driver: '+usbitem.Driver);
memo3.lines.add('Mfg: '+usbitem.Mfg);
memo3.lines.add('Service: '+usbitem.Service);
end;
end;
end;
procedure TForm1.saveClick(Sender: TObject);
var
txt:TStringList;
begin
if (SaveDialog1.Execute) then
begin
txt:=generateTXT();
txt.SaveToFile(SaveDialog1.FileName);
txt.free;
end;
end;
function TForm1.generateTXT:TStringList;
var
txt:TStringList;
i:integer;
s:string;
begin
txt:=TStringList.Create;
for i:=0 to ccs_enum_usb_list.Count-1 do
begin
s:='';
if (TUsbItem(ccs_enum_usb_list.Items[i]).LocationInformation<>'') then
s:=TUsbItem(ccs_enum_usb_list.Items[i]).LocationInformation
else
s:=TUsbItem(ccs_enum_usb_list.Items[i]).mfg;
txt.add('['+s+']');
txt.add('Class: '+TUsbItem(ccs_enum_usb_list.Items[i])._Class);
if (TUsbItem(ccs_enum_usb_list.Items[i]).Service<>'') then txt.add('Service: '+TUsbItem(ccs_enum_usb_list.Items[i]).Service);
if (TUsbItem(ccs_enum_usb_list.Items[i]).DeviceDescr<>'') then txt.add('DeviceDescr: '+TUsbItem(ccs_enum_usb_list.Items[i]).DeviceDescr);
txt.add('ClassGUID: '+TUsbItem(ccs_enum_usb_list.Items[i]).ClassGUID);
txt.add('Driver: '+TUsbItem(ccs_enum_usb_list.Items[i]).Driver);
txt.add('Mfg: '+TUsbItem(ccs_enum_usb_list.Items[i]).Mfg);
if (i<ccs_enum_usb_list.Count) then begin txt.add('----------------------------------------------');txt.add('');end;
end;
result:=txt;
end;
procedure TForm1.printClick(Sender: TObject);
begin
if (PrintDialog1.Execute) then
begin
RichEdit1.Lines.Text:=generateTXT.Text;
RichEdit1.Print('USB Devices List');
end;
end;
end.
-
> найти нужно возможность подключения файла реестра
А что ее искать ? Она прямо перед носом - TRegystry.LoadKey
|