Код (Text): include '%fasm%\win32ax.inc' section '.code' executable start: invoke RegCreateKeyEx,\ HKEY_LOCAL_MACHINE,'Software\$$*',\ NULL,NULL,REG_OPTION_NON_VOLATILE,\ KEY_WRITE,sattr,phkResult,NULL push eax invoke RegOpenKeyEx,\ HKEY_LOCAL_MACHINE,'Software\$$*',NULL,KEY_WRITE,esp pop eax invoke RegSetValueEx,eax,NULL,NULL,REG_SZ,'~',1 invoke RegCloseKey,phkResult exit: invoke WinExec,"regedit.exe",SW_SHOWNORMAL invoke ExitProcess,NULL section '.data' readable writable phkResult dd ? struct SECURITY_ATTRIBUTES nLength dd ? lpSecurityDescriptor dd ? bInheritHandle dd ? ends sattr SECURITY_ATTRIBUTES .end start Как я понял RegCreateKeyEx() не достаточно чтобы RegSetValueEx(), поэтому дополнительно вызываем RegOpenKeyEx() здесь посередине. Если это не так, то я наверное в флагах запутался, например, вот такое REG_OPTION_NON_VOLATILE - вообще что-то заумное. Далее push eax я здесь на форуме у кого-то подсмотрел вместе с его хитрым esp. Однако, это хоть и ассемблерные штучки, но для msdn как-то эксцентрично выглядит, а нельзя ли без указания стека какими нибудь phkResult утрясти это? =) Просто чисто ради познания, хотя итак работает. Структуру SECURITY_ATTRIBUTES я не догоняю как работает, или надо к её полям обращаться? Что она есть что нет, без разницы. Или это позволяет зделать запись без прав админа?
Semiono Басню Крылова "Мартышка и очки" в школе изучал ? - Про тебя Тебе же сказали - учи матчасть, фасм и мсдн. Что тут у тебя может работать, если в случае успеха RegCreate.. и RegOpen.. возвращают в eax ERROR_SUCCESS = 0, который ну никак не может быть валидным значением хэндла phkResult ! В фасме передача параметра phkResult без скобок [..] означает передачу адреса переменной phkResult, чтобы ф-и RegCreate.. или RegOpen.. записали по этому адресу значение возвращаемого хэндла. А в функции RegSetValue и RegCloseKey нужно передавать не адрес, а само значение полученного хэндла - для этого нужно заключить параметр в квадратные скобки: [phkResult]
Дык работает же! Вот смотри RegCreateKeyEx Function phkResult [out] A pointer... - это указатель! А дальше RegSetValueEx след теряется, и не ясно адрес или данные и куда вообще их передавать. Впрочем телепатия может помочь. Я про скобки давно уже знаю, и как правило наугад подставляю адрес/значение когда не знаю наверняка. Кстати, а где тогда надо addr указывать? Или вообще не нужно? И ещё я когда вычитал что надо байт указать, тоже был озадачен. Так чтоли addr byte [...] ? Или в фасме всегда скобок одних хватает [] ? А я что делаю? =) Мне просто опыта не хватает, а это в свою очередь от времени зависит, которого тоже не хватает. И то что я в тайне держу, я дебагер не открываю никогда, я там ничего не понимаю )))
Работает, но через одно место, т.к. никакие RegOpen и push\pop тут не нужны: Код (Text): invoke RegCreateKeyEx,..,phkResult,NULL ;передаем адрес phkResult invoke RegSetValueEx,[phkResult],... ;передаем значение phkResult invoke RegCloseKey,[phkResult] ;передаем значение phkResult Смотрим в книгу - видим фигу ? В мсдн черным по белому сказано 1) для RegCreateKeyEx: 2) для RegSetValueEx и RegCloseKey т.е. в первом случае адрес=указатель на переменную HKEY = dd, во втором случае значение=число, записанное в этой переменной addr или offset нужно указывать в масме, т.к. в нем, как и в высокоуровневых языках, указание имени hkResult без скобок означает взятие значения переменной, а для взятия адреса нужны доп. "магические приставки" addr (для строк и локальных переменных) или offset (для глобальных) В фасме же имя переменной без скобок означает ее адрес, а со скобками - значение Не байт, а указатель на байт BYTE* Эта хрень нужна для контроля типов в высокоуровневых языках, а фасм контролирует только размеры переменных и ему по барабану какой ты адрес передаешь - на байт или на дворд, т.к. и тот и другой имеют размер в 4 байта Может не опыта, а мозгов и усидчивости ?! Прежде чем что-то шкодить, нужно разобраться \ понять \ попробовать, а ты как мартышка начинаешь с ходу примерять очки на все непотребные места - "как правило наугад подставляю адрес/значение"
Ну ёб жеж вашу мать. Вы можете или нет почитать на msdn, где надо использовать значение, а где указатель на него?
А чойта ты свое сообщение то потер, а? Языковырыватель хренов. Я именно так и знакомился с асмом - тыкал во все дырки, пока не начинало работать. Сиди себе и тыкай, авось заработает. Нет, надо лезть на WASM и задавать откровенно идиотские вопросы, которые не намекают ни на что, кроме идиотизма автора. Да и имхо, большинство вопросов Semiono - это абсолютно глупые вопросы, ответы на которые элементарно гуглятся, или на крайняк подсматриваются в примерах того-же MASM32.
VaZoNeZ У вас у всех вопросы идиотские, взять хотябы этот http://www.wasm.ru/forum/viewtopic.php?id=37862. Обоим предупреждение, за базаром следите ^.