Модераторы: Poseidon, Snowy, bems, MetalFan
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> С -> Delphi 
:(
    Опции темы
Aster!x
Дата 13.10.2004, 12:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 12
Регистрация: 7.8.2004

Репутация: нет
Всего: нет



Как этот код будет выглядеть на Delphi?
Естественно без использования asm вставок.

EXCEPTION_DISPOSITION
__cdecl
_except_handler(
struct _EXCEPTION_RECORD *ExceptionRecord,
void * EstablisherFrame,
struct _CONTEXT *ContextRecord,
void * DispatcherContext )
{
ContextRecord->Eip = seh.SafeEip;
ContextRecord->Esp = seh.PrevEsp;
ContextRecord->Ebp = seh.PrevEbp;
// Tell the OS to restart the faulting instruction
return ExceptionContinueExecution;
}
PM MAIL   Вверх
<Spawn>
Дата 13.10.2004, 12:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Око кары:)
****


Профиль
Группа: Экс. модератор
Сообщений: 2776
Регистрация: 29.1.2003
Где: Екатеринбург

Репутация: 44
Всего: 64



Примерно так, тебе остается лишь выяснить что есть EXCEPTION_DISPOSITION и ExceptionContinueExecution:

Код
function _except_handler(ExceptionRecord: PExceptionRecord;
   EstablisherFrame: Pointer;
   ContextRecord: PContext;
   DispatcherContext: Pointer): EXCEPTION_DISPOSITION; cdecl;
begin
   ContextRecord.Eip := seh.SafeEip;
   ContextRecord.Esp := seh.PrevEsp;
   ContextRecord.Ebp := seh.PrevEbp;
   // Tell the OS to restart the faulting instruction
   Result := ExceptionContinueExecution;
end;


Это сообщение отредактировал(а) <Spawn> - 13.10.2004, 12:51


--------------------
"Для некоторых людей программирование является такой же внутренней потребностью, подобно тому, как коровы дают молоко, или писатели стремятся писать" - Николай Безруков.
PM MAIL ICQ   Вверх
p0s0l
Дата 13.10.2004, 14:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Г-н Посол
****


Профиль
Группа: Экс. модератор
Сообщений: 3668
Регистрация: 13.7.2003
Где: 58°38' с.ш. 4 9°41' в.д.

Репутация: 58
Всего: 112



Код
type
 EXCEPTION_DISPOSITION = (
   ExceptionContinueExecution,
   ExceptionContinueSearch,
   ExceptionNestedException,
   ExceptionCollidedUnwind);



--------------------
С уважением, г-н Посол.
PM   Вверх
Aster!x
Дата 13.10.2004, 14:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 12
Регистрация: 7.8.2004

Репутация: нет
Всего: нет



<Spawn>

Спасибо, всё получилось, а то я сначала запутался в этих поинтерах %)
PM MAIL   Вверх
Aster!x
Дата 13.10.2004, 15:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 12
Регистрация: 7.8.2004

Репутация: нет
Всего: нет



p0s0l

А вот если использовать этот enum что-то не получается,
вот такой код генерит компилятор:
Код
CODE:004033FC 55                                            push    ebp
CODE:004033FD 8B EC                                         mov     ebp, esp
CODE:004033FF 51                                            push    ecx
CODE:00403400 A1 64 56 40 00                                mov     eax, ds:dword_405664
CODE:00403405 8B 55 10                                      mov     edx, [ebp+arg_8]
CODE:00403408 89 82 B8 00 00 00                             mov     [edx+0B8h], eax
CODE:0040340E A1 68 56 40 00                                mov     eax, ds:dword_405668
CODE:00403413 8B 55 10                                      mov     edx, [ebp+arg_8]
CODE:00403416 89 82 C4 00 00 00                             mov     [edx+0C4h], eax
CODE:0040341C A1 6C 56 40 00                                mov     eax, ds:dword_40566C
CODE:00403421 8B 55 10                                      mov     edx, [ebp+arg_8]
CODE:00403424 89 82 B4 00 00 00                             mov     [edx+0B4h], eax
CODE:0040342A C6 45 FF 00                                   mov     [ebp+var_1], 0
CODE:0040342E 8A 45 FF                                      mov     al, [ebp+var_1]
CODE:00403431 59                                            pop     ecx
CODE:00403432 5D                                            pop     ebp
CODE:00403433 C3                                            retn


Как бы ему указать что нужно DWORD возвращать?

PM MAIL   Вверх
p0s0l
Дата 13.10.2004, 15:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Г-н Посол
****


Профиль
Группа: Экс. модератор
Сообщений: 3668
Регистрация: 13.7.2003
Где: 58°38' с.ш. 4 9°41' в.д.

Репутация: 58
Всего: 112



Переопредели тип так:
Код
type
 EXCEPTION_DISPOSITION = (
   ExceptionContinueExecution,
   ExceptionContinueSearch,
   ExceptionNestedException,
   ExceptionCollidedUnwind,
   ExceptionDWORD = $7fffffff
   );

Добавлено @ 15:29
Или так:
Код
type
 EXCEPTION_DISPOSITION = DWORD;

const
 ExceptionContinueExecution = 0;
 ExceptionContinueSearch = 1;
 ExceptionNestedException = 2;
 ExceptionCollidedUnwind = 3;



--------------------
С уважением, г-н Посол.
PM   Вверх
Aster!x
Дата 13.10.2004, 15:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 12
Регистрация: 7.8.2004

Репутация: нет
Всего: нет



Да уж, Дельфи есть Дельфи, никакой гибкости wink.gif
теперь код генерится такой:
Код
...............................................................
CODE:0040342A 33 C0                                         xor     eax, eax
CODE:0040342C 89 45 FC                                      mov     [ebp+var_4], eax
CODE:0040342F 8B 45 FC                                      mov     eax, [ebp+var_4]
CODE:00403432 59                                            pop     ecx
CODE:00403433 5D                                            pop     ebp
CODE:00403434 C3                                            retn


Эти строчки явно лишние :-)
Код
CODE:0040342C 89 45 FC                                      mov     [ebp+var_4], eax
CODE:0040342F 8B 45 FC                                      mov     eax, [ebp+var_4]


Это сообщение отредактировал(а) Aster!x - 13.10.2004, 15:48
PM MAIL   Вверх
p0s0l
Дата 13.10.2004, 16:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Г-н Посол
****


Профиль
Группа: Экс. модератор
Сообщений: 3668
Регистрация: 13.7.2003
Где: 58°38' с.ш. 4 9°41' в.д.

Репутация: 58
Всего: 112



Может у тебя оптимизация вырублена ? Посмотри Project->Options->Compiler...
У меня нормально без этих строк компилится... И какая у тебя Delphi ?

Иначе, если уж для тебя эти лишние пары тактов критичны, то пиши процедуру полностью asm-вставкой...



--------------------
С уважением, г-н Посол.
PM   Вверх
Aster!x
Дата 13.10.2004, 17:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 12
Регистрация: 7.8.2004

Репутация: нет
Всего: нет



p0s0l
Да, ты прав, оптимизация отключена, иначе компилятор не даёт два раза присвоить переменную, удаляет первое присваивание из кода:
Код
begin
lpText := szOccured;
asm
  push  OFFSET _except_handler
  push  DWORD PTR fs:[0]                 // address of next ERR structure
  mov   fs:[0], esp                      // give FS:[0] the ERR address just made

  mov   __seh.SafeEip, OFFSET _SafePlace
  mov   __seh.PrevEsp, esp
  mov   __seh.PrevEbp, ebp
end;
asm
  db 0CCh
end;
lpText := szNotOccured;
_SafePlace:
asm
  pop   DWORD PTR fs:[0]                 // restore next ERR structure to FS:[0]
  add   esp, 4                           // throw away rest of ERR structure
end;
MessageBox(0, lpText, szCaption, MB_OK or MB_ICONINFORMATION);
end.


PM MAIL   Вверх
p0s0l
Дата 13.10.2004, 17:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Г-н Посол
****


Профиль
Группа: Экс. модератор
Сообщений: 3668
Регистрация: 13.7.2003
Где: 58°38' с.ш. 4 9°41' в.д.

Репутация: 58
Всего: 112



Можешь в нужных местах отрубать оптимизацию, а потом включать:
{$O-} и {$O+}
Только учти, что можно включить/выключать оптимизацию целых функций/процедур, а не отдельных команд...
То бишь делай так:
Код
{$O-}
procedure ...
begin
...
end;
{$O+}


PS: а зачем тебе там первое присваивание ?

Это сообщение отредактировал(а) p0s0l - 13.10.2004, 17:17


--------------------
С уважением, г-н Посол.
PM   Вверх
Aster!x
Дата 13.10.2004, 17:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 12
Регистрация: 7.8.2004

Репутация: нет
Всего: нет



Цитата(p0s0l @ 13.10.2004, 17:14)
PS: а зачем тебе там первое присваивание ?

Во, и компилятор тоже видимо не понимает wink.gif
Если SEH не сработал то в MessageBox попадёт второе присваивание,
иначе первое.

Спасибо за совет, про оптимизацию теперь понял.
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Общие вопросы"
SnowyMetalFan
bemsPoseidon
Rrader

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по Дельфи обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, MetalFan, bems, Poseidon, Rrader.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0503 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.