vernick
Мимокрокодил
Приветствую всех. Ребят, помогите пожалуйста разобраться.
Ситуация следующая. Возникла проблема с инсталлятором на Inno Setup. К нему нужно либо написать простецкий код, который менял бы всего несколько байт в реестре, либо помочь разобраться с имеющимся шаблоном кода. Сложность в том, что код сперва должен считать данные параметра "filterdata", запомнить их, а затем записать обратно, поменяв 4 байта, с 5-го по 8-й. Цель всего этого действа в изменении приоритета одного системного сплиттера отвечающего за воспроизведение видео Mpeg 2 в Windows, т.к. именно этим кодеком у нас закодированы fmv заставки в игре. Предварительное считывание необходимо в связи с тем, что на разных версиях Windows остальные байты блока "filterdata" немного отличаются, поэтому нужно точечно изменить только эти 4 байта приоритета. Я достал готовый шаблон кода под это дело, вот только никак не удаётся его завести, а в синтаксисе кода я почти ничего не смыслю.
Вот файл реестра: https://yadi.sk/d/rjALnN7TR7beeg
Заранее всем благодарен.
Ситуация следующая. Возникла проблема с инсталлятором на Inno Setup. К нему нужно либо написать простецкий код, который менял бы всего несколько байт в реестре, либо помочь разобраться с имеющимся шаблоном кода. Сложность в том, что код сперва должен считать данные параметра "filterdata", запомнить их, а затем записать обратно, поменяв 4 байта, с 5-го по 8-й. Цель всего этого действа в изменении приоритета одного системного сплиттера отвечающего за воспроизведение видео Mpeg 2 в Windows, т.к. именно этим кодеком у нас закодированы fmv заставки в игре. Предварительное считывание необходимо в связи с тем, что на разных версиях Windows остальные байты блока "filterdata" немного отличаются, поэтому нужно точечно изменить только эти 4 байта приоритета. Я достал готовый шаблон кода под это дело, вот только никак не удаётся его завести, а в синтаксисе кода я почти ничего не смыслю.
Вот файл реестра: https://yadi.sk/d/rjALnN7TR7beeg
procedure SetMeritHelper(rootkey: Integer; clsid: String; b1, b2, b3, b4: Byte);
var
filterdata: AnsiString;
begin
if RegQueryBinaryValue(rootkey,
'CLSID\{083863F1-70DE-11d0-BD40-00A0C911CE86}\Instance\' + clsid,
'FilterData', filterdata) then begin
if Length(filterdata) < 16 then begin
Log('Invalid filterdata for ' + clsid);
exit;
end;
filterdata[5] := Chr(b1);
filterdata[6] := Chr(b2);
filterdata[7] := Chr(b3);
filterdata[8] := Chr(b4);
RegWriteBinaryValue(rootkey,
'CLSID\{083863F1-70DE-11d0-BD40-00A0C911CE86}\Instance\' + clsid,
'FilterData', filterdata);
end;
end;
end;
procedure SetMerit32(clsid: String; b1, b2, b3, b4: Byte);
begin
SetMeritHelper(HKCR32, clsid, b1, b2, b3, b4);
end;
procedure SetMeritUnlikely32(clsid: String);
begin
SetMerit32(clsid, 0, 0, 64, 0);
end;
var
filterdata: AnsiString;
begin
if RegQueryBinaryValue(rootkey,
'CLSID\{083863F1-70DE-11d0-BD40-00A0C911CE86}\Instance\' + clsid,
'FilterData', filterdata) then begin
if Length(filterdata) < 16 then begin
Log('Invalid filterdata for ' + clsid);
exit;
end;
filterdata[5] := Chr(b1);
filterdata[6] := Chr(b2);
filterdata[7] := Chr(b3);
filterdata[8] := Chr(b4);
RegWriteBinaryValue(rootkey,
'CLSID\{083863F1-70DE-11d0-BD40-00A0C911CE86}\Instance\' + clsid,
'FilterData', filterdata);
end;
end;
end;
procedure SetMerit32(clsid: String; b1, b2, b3, b4: Byte);
begin
SetMeritHelper(HKCR32, clsid, b1, b2, b3, b4);
end;
procedure SetMeritUnlikely32(clsid: String);
begin
SetMerit32(clsid, 0, 0, 64, 0);
end;
Так выглядит блок данных на Win 7 и байты приоритета до изменений:
А так должены выглядеть после:

А так должены выглядеть после:

Заранее всем благодарен.