5 байт самомодификации

From
Gennady Mayko ()
To
Crusader Mike
Date
2002-10-23T15:11:25Z
Area
SU.WINDOWS.NT.PROG
From: "Gennady Mayko" <gennady.mayko@broadcom.com>

Добрый день!

Wed Oct 23 2002 10:56, Crusader Mike wrote to Gennady Mayko:

 CM>                               Hi,  Gennady!

 CM> [skip]

 CM>   Пардон, что вмешиваюсь, но да будет спорящим известно, что на
 CM> подавляющем большинстве текущих систем можно атомарно изменить 8 байт
 CM> (при условии что они выровнены по 8-байтной границе) -- см. инcтрукцию
 CM> CMPXCHG8B или:
--
Да, спорящим это известно. Это уже обсуждалось ранее в треде с названием
"самомодифицирующийся код?".

Здесь единственно стоит заметить, что 64-битные данные не обязательно должны
быть выровнены по 8-байтной границе. Alignment exception в такой команде будет
только в User mode (Ring 3) и если установлены 2 флага: AM в регистре CR0 и AC
в EFLAGS.


 CM> __forceinline
 CM> void
 CM> AdvInterlockedExchange8b(
 CM>                      IN OUT LARGE_INTEGER volatile * Destination,
 CM>                      IN LARGE_INTEGER Exchange,
 CM>                      OUT LARGE_INTEGER* Res)
 CM> {
 CM>     __asm
 CM>     {
 CM>         mov                 esi, Destination
 CM>         mov                 ebx, Exchange.LowPart
 CM>         mov                 ecx, Exchange.HighPart
 CM>         mov                 eax, [esi]
 CM>         mov                 edx, [esi + 4]
 CM>     repeat_label:
 CM>         lock cmpxchg8b  qword ptr [esi]
 CM>         jne                 repeat_label

 CM>         mov                 esi, Res
 CM>         mov                 [esi], eax
 CM>         mov                 [esi+4], edx
 CM>     }
 CM> }

 CM> все копирайты мои. :) Что-то мне подсказывает, что те байты, которые вы
 CM> хотите заменить, удовлетворяют условию выравнивания. ;)

 CM>                                              Sincerely yours, Prihodko
 CM> Michael.

С уважением,
Геннадий Майко.

--- ifmail v.2.15dev5
 * Origin: FidoNet Online - http://www.fido-online.com (2:5020/400)