· Начало · Отвђтить · Статистика · Поиск · FAQ · Правила · Установки · Язык · Выход · WASM.RU · Noir.Ru ·

 WASM Phorum —› WASM.WIN32 —› RegQueryValueExA чего-то не читает

Посл.отвђт Сообщенiе


Дата: Авг 13, 2003 17:20:00

Подскажите почему значение прочитанное (?) из реестра не выводится.

rDP dd ?
rHandle dd ?
rKey db 'Software\KeyName',0
rValName db 'ValName',0
rValRead db 32 dup(0)

call RegCreateKeyExA,80000002h,offset rKey,0,0,0,0F003Fh,0,offset rHandle,offset rDP

call RegQueryValueExA,[rHandle],offset rValName,0,1,offset rValRead,32d

call MessageBoxA,0,offset rValRead,offset msgTitle,0


Дата: Авг 13, 2003 17:52:23

Misty
Страный вопрос.. Но если оно прочитано...
А что ты видишь под отладчиком? :)


Дата: Авг 13, 2003 18:15:30

Ну ладно, поставим вопрос по другому: "Как прочитать значение из реестра?"

Вроде бы всё правильно, KEY_ALL_ACCESS стоит, RegCreateKeyExA и RegSetValueExA работают.


Дата: Авг 13, 2003 21:20:24

.386
.model flat,stdcall
option casemap:none

include \masm32\include\windows.inc
include \masm32\iinclude\user32.inc
include \masm32\iinclude\kernel32.inc
include \masm32\iinclude\advapi32.inc

includelib \masm32\lib\user32.lib
includelib \masm32\lib\kernel32.lib
includelib \masm32\lib\advapi32.lib

.data

szRegSubKey db "Software\CoolApp", 0
szSomeKey    db "Bla", 0
szData db "bla-bla-bla", 0

.code

start proc

local hKey:HANDLE
local acData[128]:CHAR
local cbData:DWORD

    invoke RegCreateKeyEx, HKEY_CURRENT_USER, addr szRegSubKey, 0, NULL, \
                            0, KEY_ALL_ACCESS, NULL, addr hKey, NULL

    .if eax == ERROR_SUCCESS
        invoke RegSetValueEx, hKey, addr szSomeKey, 0, REG_SZ, addr szData, sizeof szData
        .if eax == ERROR_SUCCESS
            mov cbData, sizeof acData
            invoke RegQueryValueEx, hKey, addr szSomeKey, 0, NULL, addr acData, addr cbData
            .if eax == ERROR_SUCCESS
                invoke MessageBox, NULL, addr acData, NULL, MB_OK
            .endif
            invoke RegDeleteKey, HKEY_CURRENT_USER, addr szRegSubKey
        .endif
    .endif
    invoke ExitProcess, 0    

start endp

end start


Дата: Авг 14, 2003 06:40:21

Нескромный вопрос: такое писать на asm'e - это тот
же сишный код получается


Дата: Авг 14, 2003 09:48:05

Four-F
Вроде бы всё так же, чего я там намудрила...

ZverA
Размером выйдет поменьше, раз в 50. И ещё это так MASM выглядит, порой кажется что это листинг на бэйсике, только с регистрами и сегментами.


Дата: Авг 14, 2003 10:30:58

[ Misty: Размером выйдет поменьше, раз в 50. ]

Если все правильно сделать, то размер будет таким же, а скорее всего даже чуть меньше. Такова суровая действительность.


Дата: Авг 14, 2003 10:49:10

Four-F вот ты объявляешь local acData[128]:CHAR прямо в коде, а если я объявлю в дате вот так rValRead db 32 dup(0) это вроде бы один пень?


Дата: Авг 14, 2003 10:56:08

Размером выйдет поменьше, раз в 50

А отладка в 50 раз дольше :)


Дата: Авг 14, 2003 12:01:50

[ Misty: ...вот ты объявляешь local acData[128]:CHAR прямо в коде... ]

Точнее в стеке.


[ Misty: ...это вроде бы один пень? ]

Не - не один, а целых три пня. И все разные :-)

1. Размер acData 128 байт, а rValRead 32 байта.
2. Содержимое acData будет инициализировано случайными значениями, а содержимое rValRead инициализировано нулями.
3. Память под массив acData выделяется на стеке, а под массив rValRead в секции инициализированных данных, т.е. без толку занимает 32 байта на диске.


[ ZverA: А отладка в 50 раз дольше :) ]

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


Дата: Авг 14, 2003 12:11:23

Four-F
rValRead db 128 dup(?), теперь один ;)
Я имела в виду, что работать будет одинаково. Так?

ZverA
За всё нужно платить...


Дата: Авг 14, 2003 13:32:43 · Поправил: Four-F

[ Misty: Я имела в виду, что работать будет одинаково. Так? ]

Да.

А если уж совсем дотошно разобраться, то еще одно отличие есть.
Если буфер в стеке, то код будет выглядеть примерно так:
00401059  8d8578ffffff        lea       eax,[ebp-0088]
0040105f  50                  push      eax
. . .
00401073  ff1504204000        call      [RegQueryValueExA]


А если в секции данных (или где либо по глобальному смещению), то код будет выглядеть примерно так:
00401080  6824304000          push      00403024
. . .
00401096  ff1504204000        call      [RegQueryValueExA]


Во втором случае код занимает на 2 байта меньше. Правда если это будет длл, то дополнительная запись добавится в релоки и разница пропадет.


Дата: Авг 14, 2003 14:15:49

Four-F
Misty

Эта разница как раз видна в примере "Self-Deleting Executables
for Windows 95,98,ME" :-)


Powered by miniBB 1.6 © 2001-2002
Время загрузки страницы (сек.): 0.055