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

From
Crusader Mike (2:450/159.24)
To
Gennady Mayko
Date
2002-10-23T10:56:20Z
Area
SU.WINDOWS.NT.PROG
                              Hi,  Gennady!

[skip]

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

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

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


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


                                             Sincerely yours, Prihodko Michael.

---
 * Origin: Crusader was there! o=|======> (2:450/159.24)