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)