这个问题有点遥远,但我想也许有人知道一个聪明的解决方案。陷阱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最终会使用系统调用。 –