その後いろいろ調べたのですが、第二引数の 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 の行にブレークポイントを仕掛けて *Destination と Value の値を調べたのですが、
Value は壊れてませんでした。
delayimp.h の __pfnDliFailureHook2 に InterlockedExchangePointer を使っていたのですけども、
InterlockedExchangePointer((void**)&__pfnDliFailureHook2, (void*)ディレイロードが失敗したときの処理);
こんな風にですね。さらにいろいろ調べた結果、
extern PfnDliHook __pfnDliFailureHook2 = 0;
を忘れてるせいじゃねーの?と思ってこれ入れたらサクッと直りましたw
めでたしめでたし(たぶん)。