![]() |
|
|
|||||||
| Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны |
![]() |
|
|
Опции темы | Поиск в этой теме | Опции просмотра |
|
|
|
#1
|
|||
|
|||
|
Доброго всем времени суток!!! (Если Вы ещё с нами???)
А тэраз усё с початку (т. е. с начала)... 1-й "Гемор" (рой) начался с уст-ки WinXPx64, а именно: Выкопал как-то на бескрайних просторах то-ли Гугла, то-ли Тындекса *.reg_файл приблизительно следующего содержания: Код:
извиняюсь что это не есть код от Его Величества Pascalя - но чтоб Админ про тэги не ругался:
;Добавление в контекстное меню "Мой компьютер" пункта "Диспетчер Устройств"
[HKEY_CLASSES_ROOT\CLSID\{20D04FE0-3AEA-1069-A2D8-08002B30309D}\shell\Диспетчер Устройств\command]
@="%SystemRoot%\system32\mmc.exe /s %SystemRoot%\system32\devmgmt.msc"
;Добавление в контекстное меню "Мой компьютер" пункта "Редактор Реестра"
[HKEY_CLASSES_ROOT\CLSID\{20D04FE0-3AEA-1069-A2D8-08002B30309D}\shell\Редактор Реестра\command]
@="Regedit.exe"
;Добавление в контекстное меню "Мой компьютер" пункта "Диспетчер задач"
[HKEY_CLASSES_ROOT\CLSID\{20D04FE0-3AEA-1069-A2D8-08002B30309D}\shell\Диспетчер Задач\command]
@="taskmgr"
;Добавление в контекстное меню "Мой компьютер" пункта "Установка и удаление программ"
[HKEY_CLASSES_ROOT\CLSID\{20D04FE0-3AEA-1069-A2D8-08002B30309D}\shell\Установка и Удаление программ\command]
@="control appwiz.cpl"Нууу!!! - думаю: я его Щааа Код:
Reg:= TRegistry.Create;
Reg.RootKey:= HKEY_CLASSES_ROOT;
If Form1.DevMan.Checked Then
begin // Диспетчер оборудования
Reg.OpenKey('CLSID\{20D04FE0-3AEA-1069-A2D8-08002B30309D}\shell\Диспетчер Оборудования\command\', True);
Reg.WriteExpandString('', '%SystemRoot%\system32\mmc.exe /s %SystemRoot%\system32\devmgmt.msc');
Reg.CloseKey;
end;Код:
Reg64:= TRegistry.Create(KEY_ALL_ACCESS OR $0100); 2-й "Гемор" (рой) начался с приобретения SSD-накопителя, а именно: Нагуглив инструкций по адаптации Винды к несвойственному для XPюши носителю (ведь родился XPюша в разгар эпохи магнитоблинных ХДДшников и про SSD у него ни малейшего понятия)в целях экономии оставшегося количества циклов записи/чтения решил написать программку (кот. планирую запускать через RunOnceEx дабы Винда не успевала сильно нашкодить с момента установки) которая через тот же Рег64 отключает восстановление системы (для этих дел - есть Акронис), свап-файл (РАМу и так 4Гб), службу индексации (выставить комбинацию битов на шине адреса ФлэшЯчейки и считать нужные данные - это гораздо быстрее, чем искать файл пусть и не по всему диску, а через таблицу индексации, да ещё запозиционировать головки на куазанную дорожку, да дождаться на этой дорожке куазанного сектора - за это время ССДшник успеет не только считать, но и записать файл обратно и я думаю аж дважды а то трижды), службу ЕвентЛог и т. д. и т. п. - согласно инструкции... Тут всё пучком - никаких гвоздей. В следующем наблюдении думаю все со мной согласятся: сколько мусора оседает в папках Temp? (+ некоторые интиллигентные проги свой мусор убирают:= лишние (губительные) циклы перезаписи ФлэшЯчеек). А как этого избежать? - естстно папку темп - на магнитные блины (на случай гибели их секторов - есть ХДДРегенератор, а ячейку хоть с бубном, хоть без - всё равно не воскресишь) а дилемму время-деньги я решаю в пользу денег и согласен пожертвовать в этом плане процентом времени (при распаковке какого-нить сэтаппера), но при этом притормозить "счётчик моточасов" ССДшника. Следующая папка: "Твои Тугаменты" со своими ДаунЛоудсами и МайИЗОФайлзами - на те же блины (правда тут без шаманства не обошлось). Ну вот, наконец, и добрались до танцев с бубнами... Допустим у Вас есть какие-никакие наработки на С:\ - закладки в Опере, загрузки в МюТорренте, DC++ и т. д. и т. п. И для какого-нить эксКримента надо поставить Винду на Д:\ и... О-Блин - ни закладок, никого... Не вопрос - копируем с Ц на Д все подпапки нужной проги из папки Application Data как Администратора(или Юзера - как ты вошёл в систему) так и Local Settings\Application Data, перезапускаем Оперу и ву-а-ля: все закладки и откр. вкладки последнего сеанса - как будто загружались с С:\... Вот только Опера ЗАПИСЫВАЕТ и ПЕРЕЗАПИСЫВАЕТ копеечные по "весу" mhtшки, coociesы и тд. А сколько ФлэшЯчеек перезатрёт фото , видео или аудио редактор при обработке bmp, avi, wav??? И было решено: всю папку C:\Documents and Settings - на те же блины, но... (вступает бубен): была нагуглена инфа - вот что рекомендует МелкоСофт: Чтобы переместить папку Documents and Settings в другое место на диске, выполните следующие действия. 1. ... 6. Выделите и скопируйте в новую папку все папки, кроме содержащей сведения о пользователе, который в данный момент работает в системе. 7. На панели управления дважды щелкните значок Система и перейдите на вкладку [Дополнительно - UFO 007] Профили пользователей. 8. Скопируйте в новую папку профиль текущего пользователя. 9. Нажмите кнопку OК, закройте панель управления, выйдите из системы и повторно войдите в нее с правами администратора. 10. В окне редактора реестра из меню Правка выберите команду Найти. 11. Введите в появившемся диалоговом окне строку documents and settings и нажмите кнопку Найти далее. 12. В каждом разделе, а также имени раздела или параметра реестра, который содержит исходный путь к папке, замените его новым значением. Примечание. Это действие необходимо выполнить для каждого случая вхождения исходного пути. В противном случае компьютер может не запуститься. Необходимо обновить все разделы и параметры реестра. После перезагрузки компьютера исходную папку Documents and Settings можно удалить. Партия бубна начинает разгораться уже с 6-го пункта: не удаётся скопировать avgam - нет доступа... закройте (в этом случае антивирус) и повторите попытку... и чем дальше в лес - тем толще партизаны и с LocalService и с NetworkService - с десяток (если не больше) файлов, заблокированных процессами... Вобщем в этом месте думаю навязать и предложить юзеру после ребута выбрать на этом же мультибутабельном диске пункт MiniXP из под которой он скопирует всё без всяких яких (хоть Дос-Навигатором). При загрузке обратно прога встретит его (вторая ссылка в RunOnceEx) с вопросом:"А ткните-ка, голубчик, меня носом - КУДА Вы спрятали папку?" Через ShellTreeView1 получаем новый путь, переходим к 12-му пункту и... партия бубна входит в свой апогей. Действие Второе: те же и ... небезызвестный RegistryChecker (вернее - позаимствованный и модифицированный движок: procedure Scan(Key, NewPath, OldPath: String) который, найдя в имени или в значении ключа или его параметров OldPath, вызывает RegValChange(ValName, ValData, NewPath_); - делов-то... Налюбовавшись на работу движка на Мемах и ЛистБоксах (все значения вродь правильные - РегЕдит подтверждает), разремировал RegValChange и вперёд - за работу. После обработки:"Делаем Ребут?" - Ноу... и все мои усилия были перечёркнуты первой же найденой РегЕдитом (стало быть пропущенной Scanом) строкой 'C:\Documents and Settings'... Дай-ка - думаю (чтобы бубен не захлёбывался от надрыва) вместо Reg применю Reg64 - значений было найдено вродь столько же (78 - что ли) зато через пару часов KeyCount зашкалил за 3 000 000 (это при весе-то NTUSER.DAT:= 1,8 Мб) и выскочила ощибка "Оут Оф Мемори" (4 Гб - кончились). Пытаясь понять - откуда же прёт такая невезуха, подумал а не от того ли что ТаскМанагер отображает ССД_Оптимизатор.ехе (как и саму Дэлфи32.ехе) с символом *32? Попытки выгуглить Д7х64 оказались тщетными (тут параллельный вопрос - мож хто знае где мона скачать такое чудо?) зато попался х64тый Лазарус (а чем не альтернатива, хоть его продукция раз в 15 и поувесистей? - главно же не мытьём, так катаньем). Наверное именно потому, что как за самим Лазарем, так и за его проджект1.ехе символ *32 отсутствует вот этот код |
| Этот пользователь сказал Спасибо UFO 007 за это полезное сообщение: | ||
OTVET (18.01.2013)
| ||
|
#2
|
|||
|
|||
|
Код:
unit Unit1;
{$mode objfpc}{$H+}
interface
uses
Classes, SysUtils, FileUtil, Forms, Graphics, Dialogs, StdCtrls, Registry;
type
{ TForm1 }
TForm1 = class(TForm)
Button1: TButton;
Edit1: TEdit;
Edit2: TEdit;
Edit3: TEdit;
Memo1: TMemo;
Memo2: TMemo;
Memo3: TMemo;
procedure Button1Click(Sender: TObject);
procedure FormCreate(Sender: TObject);
procedure PageControl1Change(Sender: TObject);
private
{ private declarations }
public
{ public declarations }
end;
var
Form1: TForm1;
CurDir: string;
KeyCount, Found, NotFound: integer;
Reg, Reg64: TRegistry;
implementation
{$R *.lfm}
{ TForm1 }
procedure TForm1.Button1Click(Sender: TObject);
procedure RegScan(Key, Search: string);
var
tskey, tsval: TStrings;
i,j: integer;
begin//1
inc(KeyCount);
Edit2.Text:= 'KeyCount= '+inttostr(KeyCount);
application.ProcessMessages;
tskey:= TStringList.Create;
tsval:= TStringList.Create;
If Not Reg64.OpenKey(key, false)Then
begin//2 if
Memo3.Lines.Add('нет такого ключа '+ key);
If Reg.OpenKey(key, false)// .aif
Then //если существ (открылся) имя = ''
begin//3
reg.GetKeyNames(tskey);//из ''->[0]=*;[1]=.386;[2]=.7z;[3]=.aca;...
reg.GetValueNames(tsval);//получаем и
for j:= 0 to tsval.Count - 1 do //просматриваем все параметры
begin//4 j
if Reg.GetDataType(tsval.Strings[j]) in [rdString, rdExpandString] then
If (Pos(Search, tsval.Strings[j]) > 0) Or
(Pos(Search, Reg.ReadString(tsval.Strings[j])) > 0)
Then
begin//5 if
Inc(found);
Memo2.Lines.Add(inttostr(KeyCount)+'j= '+Reg.ReadString(tsval.Strings[j]));
Memo1.Lines.Add(inttostr(KeyCount)+'key= '+key);
Edit1.Text:= inttostr(found);
end;//5 if
end;//4 j все парамктры проверены
end Else//3 если не существ Reg32 = ''
Memo3.Lines.Add('и 32-ого тоже '+ key);
Reg.CloseKey;
tsval.Clear;
for i:= 0 to tskey.Count - 1 do
begin//3 i
Reg.OpenKey(tskey.Strings[i], false);
reg.GetValueNames(tsval);//получаем и
Reg.CloseKey;
for j:= 0 to tsval.Count - 1 do //просматриваем все параметры
begin//4 j
if Reg.GetDataType(tsval.Strings[j]) in [rdString, rdExpandString] then
If Pos(Search, Reg.ReadString(tsval.Strings[j])) > 0 Then
begin//5 if
Inc(found);
Memo2.Lines.Add(inttostr(KeyCount)+'i= '+Reg.ReadString(tsval.Strings[j]));
Memo2.Lines.Add('');
Memo1.Lines.Add(inttostr(KeyCount)+tskey.Strings[i]);
Edit1.Text:= inttostr(found);
end;//5 if
end;//4 j
Edit1.Text:= inttostr(found);
RegScan(Key + '\' + tskey.Strings[i], Search);
end;//3 i
Inc(NotFound);
Edit3.Text:=inttostr(NotFound);
end//2 if
Else
begin//2
reg64.GetKeyNames(tskey);//1-open... 2-open... 3-persyst...
reg64.GetValueNames(tsval);
for j:= 0 to tsval.Count - 1 do
begin//3 j
if Reg64.GetDataType(tsval.Strings[j]) in [rdString, rdExpandString] then
If (Pos(Search, tsval.Strings[j]) > 0) Or
(Pos(Search, Reg64.ReadString(tsval.Strings[j])) > 0)
Then
begin//4 if
Inc(found);
Memo2.Lines.Add(inttostr(KeyCount)+'j= '+Reg64.ReadString(tsval.Strings[j]));
Memo1.Lines.Add(inttostr(KeyCount)+'key= '+key);
Edit1.Text:= inttostr(found);
end;//4 if
end;//3 j
Reg64.CloseKey;
tsval.Clear;
for i:= 0 to tskey.Count - 1 do
begin//3 i
Reg64.OpenKey(tskey.Strings[i], false);
reg64.GetValueNames(tsval);
Reg64.CloseKey;
for j:= 0 to tsval.Count - 1 do
begin//4 j
if Reg64.GetDataType(tsval.Strings[j]) in [rdString, rdExpandString] then
If Pos(Search, Reg64.ReadString(tsval.Strings[j])) > 0 Then
begin//5 if
Inc(found);
Memo2.Lines.Add(inttostr(KeyCount)+'i= '+Reg64.ReadString(tsval.Strings[j]));
Memo2.Lines.Add('');
Memo1.Lines.Add(inttostr(KeyCount)+tskey.Strings[i]);
Edit1.Text:= inttostr(found);
end;//5 if
end;//4 j
Edit1.Text:= inttostr(found);
RegScan(Key + '\' + tskey.Strings[i], Search);
end;//3 i
end;//2 i
//Memo2.Lines.Add(inttostr(tsval.Count));
//Memo1.Lines.Add(ts[5]);
end;//1 RegScan
begin
reg64.RootKey:= HKEY_CLASSES_ROOT;
RegScan('', 'C:\Documents and Settings');
{ RegScan(
'Installer\Products\4EA42A62D9304AC4784BF238120683FF', 'C:\Documents and Settings');
} reg.RootKey:= HKEY_CURRENT_USER;
RegScan('', 'C:\Documents and Settings');
reg.RootKey:= HKEY_LOCAL_MACHINE;
RegScan('', 'C:\Documents and Settings');
reg.RootKey:= HKEY_USERS;
RegScan('', 'C:\Documents and Settings');
reg.RootKey:= HKEY_CURRENT_CONFIG;
RegScan('', 'C:\Documents and Settings');
end;
procedure TForm1.FormCreate(Sender: TObject);
begin
Application.Title:= 'UFO'+'''s To SSD Optimizator';
CurDir:= ExtractFilePath(Application.ExeName);
Reg:= TRegistry.Create(KEY_ALL_ACCESS);
Reg64:= TRegistry.Create(KEY_ALL_ACCESS OR $0100);
memo1.Clear;
memo2.Clear;
end;
end.Заранее благодарен за любую подсказку (для апонятья). (Есть подозрение, что вопрос не совсем по адресу и мож следует обратиться к спецам ИМЕННО по Винде типа ОСьЗона.нет и проплагиатить этот материал там, но боюсь, что тамошние Гуру на Паскале "... ни в дугу и ни в тую...") |
| Этот пользователь сказал Спасибо UFO 007 за это полезное сообщение: | ||
OTVET (18.01.2013)
| ||
|
#3
|
|||
|
|||
|
А это будет сильно большой ошибкой, если между строками 148 и 149 не хватает
Код:
reg.RootKey:= HKEY_CLASSES_ROOT; Последний раз редактировалось UFO 007, 06.01.2013 в 03:18. |
|
#4
|
|||
|
|||
|
"Подозреваю" что это было ОЧЕНЬ большой ошибкой - подправил и теперь статистика такова :
KeyCount упал с 811980 до 560475 (NotFound Тоже упало с 2265 до 632, но не исчезло совсем!!! - как всё же побороть этот Рефлекшн? мож Рег64му ЫшО какой флаг задрать?) а кол-во найденых значений подпрыгнуло со 180 аж до 609 Последний раз редактировалось UFO 007, 06.01.2013 в 13:00. |
|
#5
|
|||
|
|||
|
Огромное всем спибо!!! (понимаю - все празднуют/отдыхают...) А где тут кнопочка [Решено]?
Как оказалось - целый кобель (а не собака) зарыт в самой среде разработки. Хватило движок от RegistryChecker_а приблизительно следующего содержания: Код:
procedure TForm1.FormCreate(Sender: TObject);
var
TS: TStrings;
begin
TS:= TStringList.Create;
Reg:= TRegistry.Create;
If FileExists(GetEnvironmentVariable('SYSTEMDRIVE')+'\SSD_User.dat') Then
TS.LoadFromFile(GetEnvironmentVariable('SYSTEMDRIVE')+'\SSD_User.dat');
Old:= TS.Strings[0];// C:\Documents and Settings
New:= TS.Strings[1];//E:\Профиль UFO 007(miniXP)
end;
procedure TForm1.Button1Click(Sender: TObject);
begin
Reg.RootKey:= HKEY_CLASSES_ROOT;
Form1.Memo1.Lines.Add('HKEY_CLASSES_ROOT');
Scan('', Old);
MessageBox('Готово!', 'Сообщение', MB_ICONQUESTION + MB_YESNO);
end;
procedure TForm1.Scan(Key, Search: string);
var
TSVal, TSKey: TStringList;
I: Integer;
begin
Inc(Total);
TotalEdit.Text:=inttostr(Total);
Application.ProcessMessages;
if Reg.OpenKey(Key, False) then //открываем ключ
try
TSVal := TStringList.Create;
TSKey := TStringList.Create;
try
Reg.GetValueNames(TSVal);//получаем список параметров ключа
for I := 0 to TSVal.Count - 1 do// и просматриваем их
begin
//Form1.Memo2.Lines.Add('RegKey= '+Key);
if Reg.GetDataType(TSVal.Strings[i]) in [rdString, rdExpandString] then
If Pos(AnsiUpperCase(Old), AnsiUpperCase(Reg.ReadString(TSVal.Strings[i])))>0
Then //значение параметра ключа
begin
Inc(Found);
Form1.FoundEdit.Text:= inttostr(Found);
if Reg.GetDataType(TSVal.Strings[i]) in [rdExpandString] then
begin
Form1.Memo1.Lines.Add(' rdExpandString');
Form1.Memo1.Lines.Add('RegKey= '+Key);
Form1.Memo1.Lines.Add('Parametr= '+TSVal.Strings[i]);
Form1.Memo1.Lines.Add('OldData= '+Reg.ReadString(TSVal.Strings[i]));
// RegValChange(Key, TSVal.Strings[i], New, True);
end Else
begin
Form1.Memo1.Lines.Add(' rdString');
Form1.Memo1.Lines.Add('RegKey= '+Key);
Form1.Memo1.Lines.Add('Parametr= '+TSVal.Strings[i]);
Form1.Memo1.Lines.Add('OldData= '+Reg.ReadString(TSVal.Strings[i]));
// RegValChange(Key, TSVal.Strings[i], New, False);
end;
end;
TSKey.Clear;
end;
TSKey.Clear;
Reg.GetKeyNames(TSKey);
for I := 0 to TSKey.Count - 1 do
if TSKey.Strings[i] <> '' then
begin
if Reg.GetDataType('') in [rdString, rdExpandString] then//значение ключа
If Pos(AnsiUpperCase(Old), AnsiUpperCase(Reg.ReadString('')))>0
Then
begin
Inc(Found);
Form1.FoundEdit.Text:= inttostr(Found);
if Reg.GetDataType('') in [rdExpandString] then
begin
Form1.Memo1.Lines.Add(' rdExpandString');
Form1.Memo1.Lines.Add('RegKey= '+Key);
Form1.Memo1.Lines.Add('SubKey''= '+TSKey.Strings[i]);
Form1.Memo1.Lines.Add('OldData= '+Reg.ReadString(''));
// RegValChange(Key, '', New, True);
end Else
begin
Form1.Memo1.Lines.Add(' rdString');
Form1.Memo1.Lines.Add('RegKey= '+Key);
Form1.Memo1.Lines.Add('SubKey''= '+TSKey.Strings[i]);
Form1.Memo1.Lines.Add('OldData= '+Reg.ReadString(''));
// RegValChange(Key, '', New, False);
end;
end;
Scan(Key + '\' + TSKey.Strings[i], Old);
end;
finally
TSVal.Free;
TSKey.Free;
end;
finally
Reg.CloseKey;
end;
end;Люди добрыи-и-и!!! Да поможить за христарадь - обозначьте версию/сборку/модель/модификацию Delphi чтоб под 64-й ОСью отображалась без постфикса *32 (что нагуглил д7х64 - чушь собачья и баталия длится уже месяц) а Лазарь - мало того что тот же проект1.ехе 15 метров весит и ШелТриВью бледный, тусклый и тд (ну нету у него ШелИмиджа - диски без иконок и за ДрайвЛеттером метка диска отсутствует) так ещё и если у юзверя в параметре Персональ записано "Е:\Документы_х32", то в ТЕдит (мне) он крякозябры вывел - ну не дружит он с Юникодом... Заранее благодарен Последний раз редактировалось UFO 007, 06.01.2013 в 18:45. |
| Этот пользователь сказал Спасибо UFO 007 за это полезное сообщение: | ||
OTVET (18.01.2013)
| ||
|
#6
|
|||
|
|||
|
честно говоря весь этот твой эмоциональный высер я так и не осилил ...
но моя телепатия подсказывает что тебе нехватает KEY_WOW64_64KEY а по поводу HKEY_CLASSES_ROOT - в него не пишут, его читают, запомни и другим расскажи ![]() |
|
#7
|
|||
|
|||
|
по поводу HKEY_CLASSES_ROOT - в него не пишут, его читают, запомни и другим расскажи
В него пишут всякие COM - сервера при регистрации |
|
#8
|
|||
|
|||
|
Цитата:
Цитата:
Цитата:
ЗЫ. НЕСловесный понос тебе понятен? |