Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

ObjAuto и Intel XEON


Страницы:   1 2

d_oleg ©   (2007-08-06 16:48:00) 

Простой пример присвоения обработчика событий через ObjAuto.CreateMethodPointer. Все хорошо, на pentium/celeron работатет, а вот на финальной стадии тестирования на сервере (dual Xeon) - не работает :(
Чую, что дело в разрядности процессора (соотв. с размером регистра) но вот что делать - пока даже не представляю.

Пример тут: [href] http://qc.codegear.com/wc/AttachmentHandler.ashx?r=50097&fn=50097.zip[/href]


d_oleg   (2007-08-13 08:53:00) [1]

http://www.delphikingdom.com/asp/answer.asp?IDAnswer=54303


oxffff   (2007-08-08 21:39:00) [2]


> Причину когерентности кешей мы устранили.

не когерентности. :)


oxffff   (2007-08-08 17:06:00) [3]

Причину когерентности кешей мы устранили.
Использую выше xchg или FlushInstructionCache

Для гарантии использовали даже SetProcessAffinityMask

Значит причина не в этом.

Остается либо DEP, либо какие-то еще моменты мне не известные.

Рекомендую обратиться на WASM.ru.

Если напишешь туда, оставь пожалуйста ссылку на созданную тему.


oxffff   (2007-08-08 16:53:00) [4]


> d_oleg ©   (08.08.07 16:44) [24]
>
> > А такой код на чем вылетает?
>
> на call eax;


Значит не дает он тебе выполнить код из области стека и кучи.


d_oleg   (2007-08-08 16:44:00) [5]


> А такой код на чем вылетает?

на call eax;


oxffff   (2007-08-08 13:39:00) [6]

Ты решил свою проблему?


oxffff   (2007-08-07 20:56:00) [7]


> d_oleg ©   (07.08.07 17:10) [21]
>
> > call Eax он выполняет нормально
>
> нет, ошибка вылетает именно на этой инструкции


А такой код на чем вылетает?

procedure TForm1.Button1Click(Sender: TObject);
var RetOpCode:byte;
   pRetopCode:pbyte;
begin
RetOpCode:=$C3;
FlushInstructionCache(GetCurrentProcess,@RetOpCode,1);
asm
lea eax,RetOpCode;
call eax;
end;
new(pRetopCode);
pRetopCode^:=$C3;
FlushInstructionCache(GetCurrentProcess,pRetopCode,1);
asm
mov eax,pRetopCode;
call eax;
end;
Dispose(pRetopCode);
end;


d_oleg   (2007-08-07 17:10:00) [8]


> call Eax он выполняет нормально

нет, ошибка вылетает именно на этой инструкции


oxffff   (2007-08-07 16:38:00) [9]

call Eax он выполняет нормально?


oxffff   (2007-08-07 16:19:00) [10]


> 2ой вариант - тот же самый AV, в точности, но уже сразу
> при запуске.


На какой инструкции спотыкается?


d_oleg   (2007-08-07 15:54:00) [11]

1ый вариант:
24
Ret opcode C3=C3
Offset to Return static Buffer=C8A9C0

Access violation at address 00C8A9C0. Write of address 00C8A9C0

2ой вариант - тот же самый AV, в точности, но уже сразу при запуске.

3ий вариант - тот же самый AV при обращении к событию (при нажатии кнопки)
Ну и со sleep - то же самое.


oxffff   (2007-08-07 13:48:00) [12]

Для гарантии добавим еще Sleep(0)

procedure TForm1.FormCreate(Sender: TObject);
var
AExecuteMethod: TMethod;
PropInfo: PPropInfo;
TypeData: PTypeData;
begin
SetProcessAffinityMask(GetCurrentProcess,1);
sleep(0);
PropInfo := GetPropInfo(Button1, 'OnClick', [tkMethod]);
TypeData := GetTypeData(PropInfo.PropType^);
AExecuteMethod := CreateMethodPointer(TSimpleEvent.Create, TypeData);
SetMethodProp(Button1, PropInfo, AExecuteMethod);
end;


oxffff   (2007-08-07 13:34:00) [13]

Ты решил свою проблему или нет?

Попробуй  использование SetProcessAffinityMask

procedure TForm1.FormCreate(Sender: TObject);
var
AExecuteMethod: TMethod;
PropInfo: PPropInfo;
TypeData: PTypeData;
begin
SetProcessAffinityMask(GetCurrentProcess,1);
PropInfo := GetPropInfo(Button1, 'OnClick', [tkMethod]);
TypeData := GetTypeData(PropInfo.PropType^);
AExecuteMethod := CreateMethodPointer(TSimpleEvent.Create, TypeData);
SetMethodProp(Button1, PropInfo, AExecuteMethod);
end;


oxffff   (2007-08-07 12:16:00) [14]

А так где ошибка?

procedure TForm1.FormCreate(Sender: TObject);
var
 AExecuteMethod: TMethod;
 PropInfo: PPropInfo;
 TypeData: PTypeData;
begin
 PropInfo := GetPropInfo(Button1, 'OnClick', [tkMethod]);
 TypeData := GetTypeData(PropInfo.PropType^);
 AExecuteMethod := CreateMethodPointer(TSimpleEvent.Create, TypeData);
 asm
 mov eax,AExecuteMethod.TMethod.data;
 add eax,$10;
 mov cl,$c3;
 xchg byte ptr [eax],cl;
 call eax;
 end;
 FlushInstructionCache(GetCurrentProcess,AExecuteMethod.Data,Tobject(AExecuteMeth od.Data).InstanceSize);
 SetMethodProp(Button1, PropInfo, AExecuteMethod);
end;


oxffff   (2007-08-07 10:54:00) [15]

procedure TForm1.FormCreate(Sender: TObject);
var
 AExecuteMethod: TMethod;
 PropInfo: PPropInfo;
 TypeData: PTypeData;
 Pb:pbyte;
begin
 PropInfo := GetPropInfo(Button1, 'OnClick', [tkMethod]);
 TypeData := GetTypeData(PropInfo.PropType^);
 AExecuteMethod := CreateMethodPointer(TSimpleEvent.Create, TypeData);
 showmessage(inttostr(Tobject(AExecuteMethod.Data).InstanceSize));

 Pb:=AExecuteMethod.Data;
 inc(pb,$10);
 showmessage('Ret opcode C3 = '+IntToHex(pb^,0));
 showmessage('Offset to Return static Buffer = '+IntToHex(DWORD(pb),0));

 FlushInstructionCache(GetCurrentProcess,AExecuteMethod.Data,Tobject(AExecuteMeth od.Data).InstanceSize);
 SetMethodProp(Button1, PropInfo, AExecuteMethod);
end;

Запусти на Xeon. Напиши, что пишет. И напиши полностью AV


d_oleg   (2007-08-07 10:40:00) [16]


> Так тебе помогло или нет?

на не-ксеоне все нормально, на ксеоне тот же AV


> Приведи описание AV.

Access violation at address ####. Write of address ####.


> у тебя такая последовательность?

да, последовательность именно такая.


oxffff   (2007-08-07 10:35:00) [17]


> d_oleg ©   (07.08.07 09:34) [10]
>
> > более того, в таком варианте AV есть уже и на "обычных"
>
> > процессорах...
>
> а нет, сбрехал, на "обычных" запускается :)


Так тебе помогло или нет?


oxffff   (2007-08-07 09:36:00) [18]


> d_oleg ©   (07.08.07 09:26) [9]
>
> > Именно на этом JMP, который я привел в [2]?
> да-да
>
>
> > Вставь код FlushInstructionCache
> > Должно помочь. :)
> не помогло :(
> более того, в таком варианте AV есть уже и на "обычных"
> процессорах...


у тебя такая последовательность?

procedure TForm1.FormCreate(Sender: TObject);
var
 AExecuteMethod: TMethod;
 PropInfo: PPropInfo;
 TypeData: PTypeData;
begin
 PropInfo := GetPropInfo(Button1, 'OnClick', [tkMethod]);
 TypeData := GetTypeData(PropInfo.PropType^);
 AExecuteMethod := CreateMethodPointer(TSimpleEvent.Create, TypeData);

 FlushInstructionCache(GetCurrentProcess,AExecuteMethod.Data,Tobject(AExecuteMeth od.Data).InstanceSize);

 SetMethodProp(Button1, PropInfo, AExecuteMethod);
end;

У меня нет AV на "обычном процессоре".

FlushInstructionCache надо добавить после

AExecuteMethod := CreateMethodPointer(TSimpleEvent.Create, TypeData);

Приведи описание AV.


d_oleg   (2007-08-07 09:34:00) [19]


> более того, в таком варианте AV есть уже и на "обычных"
> процессорах...

а нет, сбрехал, на "обычных" запускается :)


d_oleg   (2007-08-07 09:26:00) [20]


> Именно на этом JMP, который я привел в [2]?
да-да


> Вставь код FlushInstructionCache
> Должно помочь. :)
не помогло :(
более того, в таком варианте AV есть уже и на "обычных" процессорах...


Страницы:   1 2

Наверх

Титульная страница Поиск, карта сайта Написать письмо