Реестр и двоичные данные

  • Автор темы IIaBeJl
  • Дата начала
I

IIaBeJl

Подскажите плиз... У меня есть двоичная запись в реестре, мне надо её просто выгрузить в текстовом виде и загрузить в реестр в другой ключ... Вот и всё! Выгружать можно в файл в любом формате, хоть просто код бинарный, хоть в спец файл .reg... Не имеет разницы, главное чтобы потом опять в реестр идентичную копию этих данных записать... Главное чтобы данные были двоичными в реестре и имели соответствующий формат...
 
E

etc

И чем же помочь? Ну вот есть такой тип TRegistry для работы с реестром.
 
I

IIaBeJl

на всех форумах мне так отвечали, но когда я начинаю им подробнее объяснять что он не пашет все сразу молчат как рыбы... и затихают как-будто все ламеры такие же как и я...
Вот один из способов как я пытался делать: у меня есть файл .reg, он создавался с помощью функции экспорта в regedit(не через командную строку!!! а через спец контекстное меню, потому что эти 2 вида создания создают файлы .reg с разным синтаксисом), в нём добавление соответствующих данных, но мне надо не через этот файл добавить а программно... вот как выглядят двоичные данные в файле .reg:
Код:
hex:10,00,00,0c,6b,00,69,00,6c,00,6c,00,65,00,72,00,30,00,01,00,98,47,fc,\
7e,0f,89,1d,fd,5d,02,f1,9d,58,7d,8f,77,ae,c0,b9,80,d4,30,4b,01,13,b4,06,f2
ну там конечно же больше, я просто сократил... мне надо их внести в реестр через REG_BINARY.
Я вносил так:
Код:
RegSetValueEx(hKey, "1", 0, REG_BINARY, "hex:10,00,00,0c,6b,00,69,00,6c,00,6c,00,65,00,72,00,30,00,01,00,98,47,fc,\
7e,0f,89,1d,fd,5d,02,f1,9d,58,7d,8f,77,ae,c0,b9,80,d4,30,4b,01,13,b4,06,f2", 500);
Они вносятся, но не так как надо, потому что я сравнивал вношение через .reg и через этот синтаксис и данные отличались...
Мне надо чтобы они вносились такими же как и вот в этом примере(короче просто должны убраться слово hex, ":" и ",".) а они видно как-то преобразуются перед вношением в реестр и получается другая строка в реестре:
Код:
 68 65 78 3a 31 30 2c 30 30 2c 30 63 2c
... ну и так далее... мне короче надо чтобы они не преобразовывались так.Вот что должно получиться после вношения данных в реестр:
Код:
"1"=10 00 00 0c 6b 00 69 00 6c 00 6c 00 65 00 72 00 30 00 01 01 98 47 fc
 
E

etc

Что-то не понял, а зачем вам файл? вы собираетесь данные нести на другую машину?

им подробнее объяснять что он не пашет
а что значит не пашет?


Этот файл предназначен для импорта через редактор, для програмы он в таком виде конечно же не подойдет.
 
I

IIaBeJl

Что-то не понял, а зачем вам файл?

я же говорю, если у вас есть другой вариант тоговорите... мне действительно надо на другую машину скопировать данные из реестра поэтому надо куда-то предварительно сохранить свои данные...


а что значит не пашет?

ну тот способ который я привёл не работает...
Этот файл предназначен для импорта через редактор, для програмы он в таком виде конечно же не подойдет.

Ладно, забьём на этот способ... Есть другой? Скажите как и желательно с примером...
 
E

etc

Ну так яж сказал вам, читаете и пишете по средствам TRegistry, у него есть спец. методы для этого ReadBinaryData и WriteBinaryData.
Считываете (ReadBinaryData) ваши ключи, сохраняете в файл или еще куда, и пишете потом их (WriteBinaryData). Вся премудрость.
Если хотите из этого файла то позаботится надо о преобразовании той хитрой строки в бинарное представление.

ps: думаю вы догадались что там 16-ричный формат? :wacko:
 
I

IIaBeJl

ps: думаю вы догадались что там 16-ричный формат?

ну там для идиотов написано hex: :)
Считываете (ReadBinaryData) ваши ключи
Вот это не получается...(((( Вот что пишу:

Код:
Reg->RootKey = HKEY_LOCAL_MACHINE;
Reg->OpenKey("\\Software\\xxxx\\xx",true);
Reg->OpenKey("\\SOFTWARE\\xxxx\\xx\\1",true);//в открытом ключе 1 находится одна запись с именем "1".
DWord binarydat;
Reg->ReadBinaryData('1', &binarydat, sizeof(DWord));//считываю значение(на сколько я понимаю...) "1" в переменную binarydat

Вот после этой записи binarydat при запуске программы получаю - ...ERegistryException ... 'Invalid data type for '1"
 
I

IIaBeJl

А почему вы решили именно таким типом читать?

Та я не только таким типом пытался читать... пытался и char-ом читать... тоже самое получил... просто искал в гугле ткое и было написано что вот таким типом прочитать можно...
 
I

IIaBeJl

А каким туда записывали?

данные в реестр записывала программа, вид данных я вам написал... зачем мне ща думать про записывание данных если я их ещё даже не считал... вы мне подскажите как их считать? а то ошибки только выскакивают при моём синтаксисе
 
Z

zubr

IIaBeJl
В ключе, который ты собираешься прочитать 50 байт, а ты создаешь буфер размером 4 байта. Создай в качестве буфера массив байт соответствующей длины.
 
I

IIaBeJl

Уууу, я же совсем забыл... я ещё в файл данные реестра должен записать, а потом их из файла в реестр засунуть...
Вот как я делал и у меня данные в исходной записи отличались от полученной записи:
Сперва вот так вот записывал:
Код:
Reg->RootKey = HKEY_LOCAL_MACHINE;
FILE *stream;
stream = fopen("c:\\my.file", "w+");
char datalen[3000];
Reg->OpenKey("\\SOFTWARE\\xxxx\\xx\\1",true);
Reg->ReadBinaryData("1",&datalen,sizeof(datalen));
fwrite(datalen, strlen(datalen)+1, sizeof(datalen), stream);
fclose(stream);

затем так считывал:
Код:
stream = fopen("c:\\my.file", "r+");
char datalen[3000];
fread(datalen, strlen(datalen)+1, 3000, stream);
Reg->OpenKey("\\Software\\xxxx\\xx",true);
Reg->CreateKey("2");
Reg->OpenKey("\\SOFTWARE\\xxxx\\xx\\2",true);
Reg->WriteBinaryData("1", datalen, sizeof(datalen));
fclose(stream);
 
I

IIaBeJl

Я тут кое-что переделал, но всё равно надо в файл добавить значения и извлечь их. Вот как я переделал:
Вот так считал:
Код:
Reg->RootKey = HKEY_LOCAL_MACHINE;
Reg->OpenKey("\\SOFTWARE\\xxxx\\xx\\1",false);
byte buff[800];
Reg->ReadBinaryData("1",buff,size);

а вот в файл не знаю как записать... это всё-таки массив, его же потом ещё считать в переменную buff опять надо будет... да ещё и в реестр пихануть и чтобы была точная копия... :rolleyes:
 
I

IIaBeJl

Вроде как исправил...

Код:
Reg->RootKey = HKEY_LOCAL_MACHINE;
Reg->OpenKey("\\SOFTWARE\\xxxx\\xx\\1",false);
byte buff[800];
int size = Reg->GetDataSize("1");
Reg->ReadBinaryData("1",buff,size);
FILE *stream;
stream = fopen("c:\\my.file", "w+");
fwrite(buff, size, 1, stream);

Всё, записывает... Правда не точно... Данные после добавления из файла в реестр примерно на половине записи начинают отличаться...
Вот как записываю в реестр:
Код:
FILE *stream;
stream = fopen("c:\\my.file", "к+");
fread(&buff, 601, 1, stream);
Reg->OpenKey("\\Software\\xxxx\\xx",true);
Reg->CreateKey("99");
Reg->OpenKey("\\SOFTWARE\\xxxx\\xx\\99",true);
Reg->WriteBinaryData("1", buff, 601);
fclose(stream);

Почему данные после внесения в реестр на половине начинают отличаться от оригинала???
 
Z

zubr

А размер значения и размер буфера одинаковы? Правильно было бы, определить размер значения и по нему выделить динамический массив. Соответственно при записи записывать правильный размер значения.
 
I

IIaBeJl

А размер значения и размер буфера одинаковы? Правильно было бы, определить размер значения и по нему выделить динамический массив. Соответственно при записи записывать правильный размер значения.

Уже изменил... Узнал через int size = Reg->GetDataSize("1"); размер значения в реестре... получил 599, взял и массиву столько выделил byte buff[599], и в записи переменной под буффер столько же выделяется fwrite(buff, size, 1, stream); . Но всё равно такие же проблемы, на половине записи значения начинают не совпадать...
 
Мы в соцсетях:

Обучение наступательной кибербезопасности в игровой форме. Начать игру!