|
|
Регистрация Восстановить пароль |
Повторная активизация e-mail |
Регистрация | Задать вопрос |
Заплачу за решение |
Новые сообщения |
Сообщения за день |
Расширенный поиск |
Правила |
Всё прочитано |
|
|
Опции темы | Поиск в этой теме |
03.11.2022, 19:41 | #1 |
Пользователь
Регистрация: 25.09.2013
Сообщений: 58
|
На понимание: описание строк внутри процедуры
Приветствую. В 86 windows часто использовал описание строк в процедурах.
Удобно все нужные строки в процедуре и искать их среди "section '.text'" не нужно. А вот с 64 windows не проходит такой фокус. Получаю ошибку 998 - "Неверная попытка доступа к адресу памяти." Код:
Получается на результат влияет какое количество команд прошло до вызова CreateWindowEx. Если четное, то работает. Если не четное то ошибка. Может у кого нибудь есть понимание почему так происходит? |
03.11.2022, 19:48 | #2 |
Участник клуба
Регистрация: 17.04.2022
Сообщений: 1,833
|
Для загрузки указателей на строки при вызове используйте слово addr.
Код:
|
03.11.2022, 20:07 | #3 |
Пользователь
Регистрация: 25.09.2013
Сообщений: 58
|
Не помогло, получаю ошибку 998
|
03.11.2022, 20:38 | #4 |
Участник клуба
Регистрация: 17.04.2022
Сообщений: 1,833
|
Судя по дизассемблеру все в порядке. Это вам надо код проверять на логические ошибки
Код:
Последний раз редактировалось macomics; 03.11.2022 в 20:41. |
03.11.2022, 21:11 | #5 |
Пользователь
Регистрация: 25.09.2013
Сообщений: 58
|
|
03.11.2022, 21:24 | #6 |
Участник клуба
Регистрация: 17.04.2022
Сообщений: 1,833
|
Тогда давайте разбираться с параметрами. Почему у вас передается 0 в качестве hInstance (предпоследний параметр)?
Он обязательно должен быть равен базовому адресу загрузки вашего модуля в память. Его можно получить через invoke GetModuleHandle, NULL или посчитать вручную. Последний раз редактировалось macomics; 03.11.2022 в 21:31. |
03.11.2022, 22:08 | #7 |
Пользователь
Регистрация: 25.09.2013
Сообщений: 58
|
Опять мимо.
Помогла директива align 16 Код:
|
03.11.2022, 22:32 | #8 |
Участник клуба
Регистрация: 17.04.2022
Сообщений: 1,833
|
А вот это я не обратил внимания. Действительно типы данных в Windows должны в памяти быть выровнены на свою длину. В данном случае у вас du занимает 2 байта и должна быть выровнена на 2 (даже не на 16).
Для переменных типа DWORD/int/dd выравнивание должно быть на 4 байта, а для QWORD/dq - 8 байт и т.п. Могу порекомендовать такую структуру для строк Код:
Последний раз редактировалось macomics; 03.11.2022 в 22:40. |
04.11.2022, 00:18 | #9 | ||
Пользователь
Регистрация: 25.09.2013
Сообщений: 58
|
Цитата:
Код:
Цитата:
а) функция (CreateWindowExW) ожидает строку Юникод, то данная строка должна находиться по адресу кратному 2 ; б) функция ожидает параметр в 8 байт, то данный параметр если он лежит в секции кода должен находиться по адресу кратному 8, а не 2. Но у меня сработала с 2 Код:
|
||
04.11.2022, 00:43 | #10 |
Пользователь
Регистрация: 25.09.2013
Сообщений: 58
|
Снимаю свой вопрос про секцию данных. К ней тоже относится правило выравнивания.
выполнив следующий код Код:
Вывод такой: проблемы возникают только со строками Юникод. Их адрес всегда должен быть кратен 2. С числами проблем нет (qword[.j]). Если не прав скорректируйте пожалуйста. |
|
Похожие темы | ||||
Тема | Автор | Раздел | Ответов | Последнее сообщение |
Есть Программа описание внутри | PAREN_DEFO | Фриланс | 5 | 09.05.2013 14:36 |
Задача(Описание внутри) | airesjke | Помощь студентам | 3 | 02.05.2013 15:13 |
Проблема с компьютером (описание внутри) | seragem | Помощь студентам | 4 | 07.06.2011 08:57 |
Описание внутри | HoBuHKuй | Помощь студентам | 1 | 02.06.2010 14:16 |
Глюк(описание внутри) | Stellvertreter | Общие вопросы C/C++ | 6 | 16.10.2008 19:31 |