InterlockedExchange その後

その後いろいろ調べたのですが、第二引数の Value は壊してないようでした(ぁ

winnt.h に定義がありまして、

FORCEINLINE
_Ret_writes_(_Inexpressible_(Unknown))
PVOID
_InlineInterlockedExchangePointer(
    _Inout_ _At_(*Destination,
        _Pre_writable_byte_size_(_Inexpressible_(Unknown))
        _Post_writable_byte_size_(_Inexpressible_(Unknown)))
    _Interlocked_operand_ PVOID volatile * Destination,
    _In_opt_ PVOID Value
    )
{
    return (PVOID)InterlockedExchange((LONG volatile *) Destination,
                                      (LONG) Value);
}

ここの return の行にブレークポイントを仕掛けて *DestinationValue の値を調べたのですが、
Value は壊れてませんでした。

delayimp.h の __pfnDliFailureHook2 に InterlockedExchangePointer を使っていたのですけども、

InterlockedExchangePointer((void**)&__pfnDliFailureHook2, (void*)ディレイロードが失敗したときの処理);

こんな風にですね。さらにいろいろ調べた結果、

extern PfnDliHook __pfnDliFailureHook2 = 0;

を忘れてるせいじゃねーの?と思ってこれ入れたらサクッと直りましたw

めでたしめでたし(たぶん)。