ハマった。何らかの理由で、Windows 8 のファイル システムのコピー機能をブロックする必要があります。Windows 7 までは、ShFileOperation と CopyFile がトリックを行っていました。ただし、Windows 8 では、API モニターをスキャンできるように、新しい API である CopyFile2 を使用してジョブを実行しています。そのため、CopyFile2 を迂回する必要があります。
Windows SDK 6.x、7.x、およびWin8 SDKに沿ってDetour 2.xおよび3.xを使用してこれを試しました。以下はコードスニペットです -
HRESULT (WINAPI *Trampoline_CopyFile2)(PCWSTR pwszExistingFileName, PCWSTR pwszNewFileName, COPYFILE2_EXTENDED_PARAMETERS *pExtendedParameters) = CopyFile2;
HRESULT WINAPI Detour_CopyFile2(PCWSTR pwszExistingFileName, PCWSTR pwszNewFileName, COPYFILE2_EXTENDED_PARAMETERS *pExtendedParameters)
{
OutputDebugString(L"Inside TrozenCopyFile...");
return Trampoline_CopyFile2(pwszExistingFileName, pwszNewFileName, pExtendedParameters);
}
//Attaching Detour
DetourAttach( &(PVOID&)Trampoline_CopyFile2, (PVOID)Detour_CopyFile2);
DetourAttach は 0 (成功) を返しますが、Trampoline 関数への呼び出しを受け取りません。他の API が迂回されているため、dll が Explorer に読み込まれていることはわかっています。また、ProcessExplorer でも確認しました。
Microsoft Detour Library は win8 API をサポートしていますか? はいの場合、私は何か間違ったことをしていますか? 「いいえ」の場合、これをバグとして報告しますか?
-- さらに、CopyFile2 を呼び出すサンプル アプリケーションを作成します。Dll がロードされ、DetourAttach が 0 を返しています。ただし、Detour_CopyFile2 へのトレースをまだ取得できません。