Форум программистов
 
Контакты: о проблемах с регистрацией, почтой и по другим вопросам пишите сюда - alarforum@yandex.ru, проверяйте папку спам! Обязательно пройдите активизацию e-mail.

Вернуться   Форум программистов > Низкоуровневое программирование > Assembler
Регистрация

Восстановить пароль
Повторная активизация e-mail

Ответ
 
Опции темы
Старый 18.05.2015, 20:04   #1
spolyr
Пользователь
 
Регистрация: 31.03.2015
Сообщений: 16
Репутация: 16
По умолчанию Не понятно что не так с DLL

Все привет!
Подскажите почему, имею пустышку type.dll, вызываю из программы e.exe, путем invoke invoke Type, DROB, [asd],

В библиотеке есть строка SetLastError, 0 --- если снять комментарий то работает, без нее не работает, выдает ошибку windows -ошибочный образ.
Код:

============= файл a.asm (exe)===================
format PE CONSOLE			         ;пишем консоль под Win32     
entry start				         ;укажем транслятору точку входа в код
include 'd:\fasm\include\win32a.inc'

section '.PUT' data readable writable	         ;собственно секция данных	  
		    
                    DROB  DB  'testing DLL',0     
                      asd DD 0

section '.code' code readable executable         ;начало секции кода
start:	
 mov [asd],1

;процедура вызывается из своей DLL, Type.DLL
;передаем параметры 

 invoke Type, DROB, [asd]

;Выход в Windows
 invoke ExitProcess, 0

 section '.idata' import data readable writeable
 library kernel32,'KERNEL32.DLL',\
	   userl32,'USER32.DLL',\
	   Type,'Type.DLL'     

 include 'd:\fasm\include\api\kernel32.inc'
 include 'd:\fasm\include\api\user32.inc'
 import Type,\
	   Type,'Type'

============= конец a.asm ======================

Код:

============= файл type.asm (dll)==================
format PE GUI 4.0 DLL
entry DllEntryPoint

include 'd:\fasm\include\win32a.inc'

;section '.data' data readable writable

section '.text' code readable executable

;ИНИЦИАЛИЗАЦИЯ DLL
proc DllEntryPoint hinstDLL,fdwReason,lpvReserved
        mov eax,TRUE
  	ret
endp

;собственная процедура

proc Type A,B 
 mov eax,[A]
 mov eax,[B]

;эту штуку не убирать, иначе происходит ошибка в Windows 7, DLL
; invoke SetLastError, 0

 ret
endp

section '.idata' import data readable writeable
    library kernel32,'KERNEL32.DLL'
    include 'd:\fasm\include\api\kernel32.inc'

section '.edata' export data readable
    export 'Type.DLL',\
               	  Type,'Type'

section '.reloc' fixups data discardable

======== конец файла type.asm (dll)===================


Последний раз редактировалось Stilet; 23.05.2015 в 22:21.
spolyr вне форума   Ответить с цитированием
Старый 22.05.2015, 23:10   #2
R71MT
Профессионал
 
Аватар для R71MT
 
Регистрация: 16.06.2011
Сообщений: 1,230
Репутация: 1048
По умолчанию

Цитата:
Сообщение от spolyr Посмотреть сообщение
В библиотеке есть строка SetLastError, 0 --- если снять комментарий то работает, без нее - ошибочный образ.
SetLastError, 0 означает - не обращать внимание на последнюю ошибку. Ищи глюк в коде..
В папке фасма есть пример длл'ок - открой и сравни со-своим кодом
__________________
Нашедшего выход - затаптывают первым..

Последний раз редактировалось R71MT; 22.05.2015 в 23:12.
R71MT вне форума   Ответить с цитированием
Старый 22.05.2015, 23:26   #3
Vapaamies
Ваш К. О.
Профессионал
 
Аватар для Vapaamies
 
Регистрация: 26.12.2012
Адрес: Санкт-Петербург
Сообщений: 1,679
Репутация: 973
По умолчанию

Чтобы никто не подумал, что тема никому не интересна, отпишусь. Я попытался поиграться с FASM с предложенными исходниками, получил ту же ошибку, но найти причину так и не смог. Предполагаю, что это хитрый наведенный эффект от слишком короткой библиотеки, что-то там в секциях не согласуется.
__________________
Разработчик языка программирования Кантор
Vapaamies вне форума   Ответить с цитированием
Старый 23.05.2015, 21:24   #4
spolyr
Пользователь
 
Регистрация: 31.03.2015
Сообщений: 16
Репутация: 16
По умолчанию нашел

Цитата:
Сообщение от Vapaamies Посмотреть сообщение
Чтобы никто не подумал, что тема никому не интересна, отпишусь. Я попытался поиграться с FASM с предложенными исходниками, получил ту же ошибку, но найти причину так и не смог. Предполагаю, что это хитрый наведенный эффект от слишком короткой библиотеки, что-то там в секциях не согласуется.
Да, прикольная штука с секциями, мне ответили на другом форуме, дело в секции
section '.reloc' fixups data discardable
сказали нельзя чтоб она была пуста, там таблица релокенов корректируется во время загрузки библиотеки,
пишем ниже
if $ = $$
dd 0 , 8
end if

и библиотека будет работать, но на 95 и 98 не пойдет
spolyr вне форума   Ответить с цитированием
Старый 23.05.2015, 21:28   #5
spolyr
Пользователь
 
Регистрация: 31.03.2015
Сообщений: 16
Репутация: 16
По умолчанию

Еще можно секцию section '.reloc' fixups data discardable
удалить, а в секция данных дописать

data fixups
end data
spolyr вне форума   Ответить с цитированием
Старый 23.05.2015, 21:58   #6
spolyr
Пользователь
 
Регистрация: 31.03.2015
Сообщений: 16
Репутация: 16
По умолчанию

Цитата:
Сообщение от spolyr Посмотреть сообщение
Еще можно секцию section '.reloc' fixups data discardable
удалить, а в секция данных дописать

data fixups
end data
Ошибся, не в секции данных, а в секции export
вот в конце как работает
пример:

export 'q1.dll',\
string_size_byte_null,'string_size_ byte_null'

data fixups
end data
spolyr вне форума   Ответить с цитированием
Старый 23.05.2015, 22:12   #7
Vapaamies
Ваш К. О.
Профессионал
 
Аватар для Vapaamies
 
Регистрация: 26.12.2012
Адрес: Санкт-Петербург
Сообщений: 1,679
Репутация: 973
По умолчанию

А кто формирует эти самые данные перемещения, сам FASM или программист? То ли плохо смотрел, то ли в доке FASM реально об этом не написано.
__________________
Разработчик языка программирования Кантор
Vapaamies вне форума   Ответить с цитированием
Старый 23.05.2015, 22:30   #8
spolyr
Пользователь
 
Регистрация: 31.03.2015
Сообщений: 16
Репутация: 16
По умолчанию

Цитата:
Сообщение от Vapaamies Посмотреть сообщение
А кто формирует эти самые данные перемещения, сам FASM или программист? То ли плохо смотрел, то ли в доке FASM реально об этом не написано.
мне написали такой текст
"spolyr

Quote:
the example included with fasm, there is also a section is empty?


В примерах эта секция оказывается непуста, потому что fasm в неё помещает таблицу фиксапов/релокаций, т.е. таблицу адресов, которые нужно исправить при загрузке, если образ будет загружен не по базовому адресу. Эта таблица генерируется автоматически благодаря слову fixups в объявлении секции. Так вот вызов импортируемой функции является таким местом, которое нужно исправлять. И в Вашем примере единственным. Соответственно, если этот вызов убрать, то таблица окажется пуста. И соответственно вся секция окажется пустой, из-за чего образ не принимается загрузчиком.

Quote:
and all was fine, although do not understand what it


Этот пример добавляет в таблицу заголовок пустого блока таблицы. Соответственно секция оказывается непустой. Недостатком этого решения по сравнению с тем, что я привёл в предыдущем посте, является увеличение объёма образа на 512 байт. В моём примере таблица релокаций определяется отдельно от заголовка секции, а в секцию добавляются неинициализированные данные. Поэтому секция оказывается непустой, но на размер образа это не влияет. Недостатком этого решения является то, что на системах линейки 95-98-ME образ не загрузится, т.к. там загрузчику требуется, чтобы непустой была не секция, а сама таблица релокаций. "


вот моя пустая DLL , первый вариант, второй вариант убираем секцию .reloc совсем, и раскомментируем то что в секции export

format PE GUI 4.0 DLL

include 'd:\fasm\include\win32ax.inc'

section '.text' code readable executable

proc DllEntryPoint hinstDLL,fdwReason,lpvReserved;
mov eax,TRUE
ret
endp

proc string_size_byte_null, the_string

ret
endp

section '.idata' import data readable writeable
library kernel32,'KERNEL32.DLL'
include 'd:\fasm\include\api\kernel32.inc'

section '.edata' export data readable

export 'q1.dll',\
string_size_byte_null,'string_size_ byte_null'

;data fixups
;end data
section '.reloc' data readable discardable
data fixups
end data
rb 4


проверял, работает
spolyr вне форума   Ответить с цитированием
Старый 23.05.2015, 23:02   #9
Vapaamies
Ваш К. О.
Профессионал
 
Аватар для Vapaamies
 
Регистрация: 26.12.2012
Адрес: Санкт-Петербург
Сообщений: 1,679
Репутация: 973
По умолчанию

Спасибо, с таким объяснением всё встало на свои места. Пока не приходилось DLL на FASM писать, до таких глубин не дошел.
__________________
Разработчик языка программирования Кантор
Vapaamies вне форума   Ответить с цитированием
Ответ

Опции темы

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.

Быстрый переход

Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Аномалия с кодом. Не понятно что тварится. 12 строк кода pompiduskus JavaScript, Ajax 7 11.04.2014 03:58
Приложение требует msvcr100.dll, но при установке (vc_redist) говорит, что msvcr100.dll не та, что нужна. alextrof94 Общие вопросы Delphi 2 30.11.2013 10:29
Импорт из Dll, что не так? Пепел Феникса C# (си шарп) 6 07.04.2012 15:39
Не понятно что с новым компом! Seman Железо 19 08.11.2010 00:47
Не понятно что ему не нравится _ILYA_ Visual C++ 3 29.10.2010 20:25


18:41.


Powered by vBulletin® Version 3.8.8 Beta 2
Copyright ©2000 - 2018, Jelsoft Enterprises Ltd.

RusProfile.ru


Справочник российских юридических лиц и организаций.
Проекты отопления, пеллетные котлы, бойлеры, радиаторы
интернет магазин respective.ru