這個問題有點遙遠,但我想也許有人知道一個聰明的解決方案。陷阱Windows應用程序崩潰和刷新文件緩衝區
我在Windows中有一個RTS遊戲的特殊情況(凱恩的憤怒),它可以保存重放文件。不利的對手有可能在遊戲中觸發崩潰。在這種情況下,儘可能完整的重放文件將是有利的。
但是,重播文件輸出似乎被緩衝,只發生在4096字節(這是很多遊戲時間)的集合中。我想知道是否有可能以某種方式強制程序在發生崩潰時刷新其所有文件句柄。是否有一些內置的操作系統功能,可以禁用應用程序的緩衝?
如果失敗了,我可能會爲此問題編寫一個啓動程序/包裝器。我想它應該注入一些代碼,這些代碼a)爲崩潰安裝信號處理程序(是SIGSEGV?),和b)重定向CreateFile
(我知道程序使用跟蹤跟蹤)來存儲句柄。碰撞處理程序然後將沖洗所有處理程序FlushFileBuffers
。
或者是否有可能獲得另一個進程的打開文件句柄?
這是否有機會工作,你能給我一些關於如何用最少的入侵來達到最佳效果的建議嗎?
小更新: @CatPlusPlus曾建議Detours掛接到程序,截取文件打開調用和修改它們是無緩衝。這可能是解決方案!
XCrashReport : Exception Handling and Crash Reporting - Part 1
基本上做這樣的事情:
int WINAPI _tWinMain(HINSTANCE hInstance, HINSTANCE /*hPrevInstance*/, LPTSTR lpstrCmdLine, int nCmdShow)
{
int Result = -1;
__try
{
Result = HandledWinMain(hInstance, NULL, lpstrCmdLine, nCmdShow);
}
__except(RecordExceptionInfo(hInstance,GetExceptionInformation(), "main thread"))
{
// Do nothing here - RecordExceptionInfo() has already done
// everything that is needed. Actually this code won't even
// get called unless you return EXCEPTION_EXECUTE_HANDLER from
// the __except clause.
}
return Result;
}
當然
有沒有內置的操作系統功能來做到這一點,怎麼可能?操作系統並不知道緩衝甚至發生 - 它看到的是,每隔一段時間,有人會說「嗨,我想寫入4096字節到這個文件」,它就這樣做了。 –
@Adam:好吧,和Linux上的類似,你有'ulimit'來告訴程序不要做某些事情。我想操作系統可能會說,「對於下一個過程,我們禁用所有IO緩衝」,因爲IO最終會使用系統調用。 –