2012 05 28 16 29 [c] 自製InterlockedExchange64, 讓xp以下的環境可以使用.

因為XP以下的環境不能使用
InterlockedExchange64 和 InterlockedExchangeAdd64,
只好自己複製這一段程式出來使用.
而不是直接呼叫系統API來使用.

 

LONGLONG __declspec( naked ) WINAPI  myInterlockedCompareExchange64 (
    __inout LONGLONG volatile *Destination,
    __in    LONGLONG Exchange,
    __in    LONGLONG Comperand) {
        __asm {
            push        ebx  
            push        ebp  
            mov         ebp,dword ptr [esp+0Ch]  
            mov         ebx,dword ptr [esp+10h]  
            mov         ecx,dword ptr [esp+14h]  
            mov         eax,dword ptr [esp+18h]  
            mov         edx,dword ptr [esp+1Ch]  
            lock cmpxchg8b qword ptr [ebp]  
            pop         ebp  
            pop         ebx  
            ret         14h  
        }
}

LONGLONG
myInterlockedExchange64 (
    __inout LONGLONG volatile *Target,
    __in    LONGLONG Value
    )
{
    LONGLONG Old;
    do {
        Old = *Target;
    } while (myInterlockedCompareExchange64(Target,
                                          Value,
                                          Old) != Old);
    return Old;
}

LONGLONG
myInterlockedExchangeAdd64(
    __inout LONGLONG volatile *Addend,
    __in    LONGLONG Value
    )
{
    LONGLONG Old;

    do {
        Old = *Addend;
    } while (myInterlockedCompareExchange64(Addend,
                                          Old + Value,
                                          Old) != Old);
    return Old;
}